Support grouping static libraries

LLVM has complicated static library layering that sometimes changes.
The make solution was to list all the static libraries twice, but
Soong dedups the list.  Add a group_static_libs flag to allow
surrounding the static libs with -Wl,--start-group and
-Wl,--end-group.

Test: mmma -j external/llvm
Change-Id: Ic08a183d7def9c9249d4a3014760759f16b68d04
diff --git a/cc/builder.go b/cc/builder.go
index 730c9ca..a568a29 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -187,6 +187,8 @@
 	clang       bool
 	tidy        bool
 
+	groupStaticLibs bool
+
 	stripKeepSymbols       bool
 	stripKeepMiniDebugInfo bool
 	stripAddGnuDebuglink   bool
@@ -439,7 +441,13 @@
 		}
 	}
 
+	if flags.groupStaticLibs && len(staticLibs) > 0 {
+		libFlagsList = append(libFlagsList, "-Wl,--start-group")
+	}
 	libFlagsList = append(libFlagsList, staticLibs.Strings()...)
+	if flags.groupStaticLibs && len(staticLibs) > 0 {
+		libFlagsList = append(libFlagsList, "-Wl,--end-group")
+	}
 
 	if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
 		libFlagsList = append(libFlagsList, "-Wl,--start-group")
diff --git a/cc/cc.go b/cc/cc.go
index fef72cc..df4e5cf 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -110,6 +110,8 @@
 	DynamicLinker          string
 
 	CFlagsDeps android.Paths // Files depended on by compiler flags
+
+	GroupStaticLibs bool
 }
 
 type ObjectLinkerProperties struct {
diff --git a/cc/linker.go b/cc/linker.go
index 6d4edbc..dac51d6 100644
--- a/cc/linker.go
+++ b/cc/linker.go
@@ -76,6 +76,10 @@
 	// don't link in crt_begin and crt_end.  This flag should only be necessary for
 	// compiling crt or libc.
 	Nocrt *bool `android:"arch_variant"`
+
+	// group static libraries.  This can resolve missing symbols issues with interdependencies
+	// between static libraries, but it is generally better to order them correctly instead.
+	Group_static_libs *bool `android:"arch_variant"`
 }
 
 func NewBaseLinker() *baseLinker {
@@ -193,6 +197,10 @@
 		flags.LdFlags = append(flags.LdFlags, toolchain.ToolchainLdflags())
 	}
 
+	if Bool(linker.Properties.Group_static_libs) {
+		flags.GroupStaticLibs = true
+	}
+
 	return flags
 }
 
diff --git a/cc/util.go b/cc/util.go
index 31f0aec..1cb3dd7 100644
--- a/cc/util.go
+++ b/cc/util.go
@@ -100,6 +100,8 @@
 		toolchain:   in.Toolchain,
 		clang:       in.Clang,
 		tidy:        in.Tidy,
+
+		groupStaticLibs: in.GroupStaticLibs,
 	}
 }