Dynamically generate arch struct

Now we don't need to hardcode the list of OS/Arch/Variant/Features in
android/arch.go.

Change-Id: I0f9cc35d55baa31f036825fdf5b9dd30d076e56e
diff --git a/cc/config/arm64_device.go b/cc/config/arm64_device.go
index 124b124..fe47ddf 100644
--- a/cc/config/arm64_device.go
+++ b/cc/config/arm64_device.go
@@ -89,6 +89,11 @@
 )
 
 func init() {
+	android.RegisterArchVariants(android.Arm64,
+		"armv8_a",
+		"cortex_a53",
+		"denver64")
+
 	pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
 
 	pctx.SourcePathVariable("Arm64GccRoot",
diff --git a/cc/config/arm_device.go b/cc/config/arm_device.go
index 85a891a..1b60eae 100644
--- a/cc/config/arm_device.go
+++ b/cc/config/arm_device.go
@@ -145,6 +145,19 @@
 )
 
 func init() {
+	android.RegisterArchVariants(android.Arm,
+		"armv5te",
+		"armv7_a",
+		"armv7_a_neon",
+		"cortex_a7",
+		"cortex_a8",
+		"cortex_a9",
+		"cortex_a15",
+		"cortex_a53",
+		"cortex_a53_a57",
+		"krait",
+		"denver")
+
 	replaceFirst := func(slice []string, from, to string) {
 		if slice[0] != from {
 			panic(fmt.Errorf("Expected %q, found %q", from, to))
diff --git a/cc/config/mips64_device.go b/cc/config/mips64_device.go
index 4e8bf1e..8997893 100644
--- a/cc/config/mips64_device.go
+++ b/cc/config/mips64_device.go
@@ -90,7 +90,11 @@
 )
 
 func init() {
-	android.RegisterArchFeatures(android.Mips64, "mips64r6",
+	android.RegisterArchVariants(android.Mips64,
+		"mips64r2",
+		"mips64r6")
+	android.RegisterArchFeatures(android.Mips64, "rev6")
+	android.RegisterArchVariantFeatures(android.Mips64, "mips64r6",
 		"rev6")
 
 	pctx.StaticVariable("mips64GccVersion", mips64GccVersion)
diff --git a/cc/config/mips_device.go b/cc/config/mips_device.go
index deef10f..f5b14bd 100644
--- a/cc/config/mips_device.go
+++ b/cc/config/mips_device.go
@@ -126,7 +126,15 @@
 )
 
 func init() {
-	android.RegisterArchFeatures(android.Mips, "mips32r6",
+	android.RegisterArchVariants(android.Mips,
+		"mips32_fp",
+		"mips32r2_fp",
+		"mips32r2_fp_xburst",
+		"mips32r2dsp_fp",
+		"mips32r2dspr2_fp",
+		"mips32r6")
+	android.RegisterArchFeatures(android.Mips, "rev6")
+	android.RegisterArchVariantFeatures(android.Mips, "mips32r6",
 		"rev6")
 
 	pctx.StaticVariable("mipsGccVersion", mipsGccVersion)
diff --git a/cc/config/x86_64_device.go b/cc/config/x86_64_device.go
index 23c976a..918ddf7 100644
--- a/cc/config/x86_64_device.go
+++ b/cc/config/x86_64_device.go
@@ -99,13 +99,12 @@
 )
 
 func init() {
-	android.RegisterArchFeatures(android.X86_64, "",
-		"ssse3",
-		"sse4",
-		"sse4_1",
-		"sse4_2",
-		"popcnt")
-	android.RegisterArchFeatures(android.X86_64, "haswell",
+	android.RegisterArchVariants(android.X86_64,
+		"haswell",
+		"ivybridge",
+		"sandybridge",
+		"silvermont")
+	android.RegisterArchFeatures(android.X86_64,
 		"ssse3",
 		"sse4",
 		"sse4_1",
@@ -113,7 +112,13 @@
 		"aes_ni",
 		"avx",
 		"popcnt")
-	android.RegisterArchFeatures(android.X86_64, "ivybridge",
+	android.RegisterArchVariantFeatures(android.X86_64, "",
+		"ssse3",
+		"sse4",
+		"sse4_1",
+		"sse4_2",
+		"popcnt")
+	android.RegisterArchVariantFeatures(android.X86_64, "haswell",
 		"ssse3",
 		"sse4",
 		"sse4_1",
@@ -121,13 +126,21 @@
 		"aes_ni",
 		"avx",
 		"popcnt")
-	android.RegisterArchFeatures(android.X86_64, "sandybridge",
+	android.RegisterArchVariantFeatures(android.X86_64, "ivybridge",
+		"ssse3",
+		"sse4",
+		"sse4_1",
+		"sse4_2",
+		"aes_ni",
+		"avx",
+		"popcnt")
+	android.RegisterArchVariantFeatures(android.X86_64, "sandybridge",
 		"ssse3",
 		"sse4",
 		"sse4_1",
 		"sse4_2",
 		"popcnt")
-	android.RegisterArchFeatures(android.X86_64, "silvermont",
+	android.RegisterArchVariantFeatures(android.X86_64, "silvermont",
 		"ssse3",
 		"sse4",
 		"sse4_1",
diff --git a/cc/config/x86_device.go b/cc/config/x86_device.go
index 4667caa..6b55564 100644
--- a/cc/config/x86_device.go
+++ b/cc/config/x86_device.go
@@ -113,16 +113,14 @@
 )
 
 func init() {
-	android.RegisterArchFeatures(android.X86, "x86_64",
-		"ssse3",
-		"sse4",
-		"sse4_1",
-		"sse4_2",
-		"popcnt")
-	android.RegisterArchFeatures(android.X86, "atom",
-		"ssse3",
-		"movbe")
-	android.RegisterArchFeatures(android.X86, "haswell",
+	android.RegisterArchVariants(android.X86,
+		"atom",
+		"haswell",
+		"ivybridge",
+		"sandybridge",
+		"silvermont",
+		"x86_64")
+	android.RegisterArchFeatures(android.X86,
 		"ssse3",
 		"sse4",
 		"sse4_1",
@@ -131,7 +129,25 @@
 		"avx",
 		"popcnt",
 		"movbe")
-	android.RegisterArchFeatures(android.X86, "ivybridge",
+	android.RegisterArchVariantFeatures(android.X86, "x86_64",
+		"ssse3",
+		"sse4",
+		"sse4_1",
+		"sse4_2",
+		"popcnt")
+	android.RegisterArchVariantFeatures(android.X86, "atom",
+		"ssse3",
+		"movbe")
+	android.RegisterArchVariantFeatures(android.X86, "haswell",
+		"ssse3",
+		"sse4",
+		"sse4_1",
+		"sse4_2",
+		"aes_ni",
+		"avx",
+		"popcnt",
+		"movbe")
+	android.RegisterArchVariantFeatures(android.X86, "ivybridge",
 		"ssse3",
 		"sse4",
 		"sse4_1",
@@ -139,13 +155,13 @@
 		"aes_ni",
 		"avx",
 		"popcnt")
-	android.RegisterArchFeatures(android.X86, "sandybridge",
+	android.RegisterArchVariantFeatures(android.X86, "sandybridge",
 		"ssse3",
 		"sse4",
 		"sse4_1",
 		"sse4_2",
 		"popcnt")
-	android.RegisterArchFeatures(android.X86, "silvermont",
+	android.RegisterArchVariantFeatures(android.X86, "silvermont",
 		"ssse3",
 		"sse4",
 		"sse4_1",