Fix arm[64] cflags

Limit arm cpu variants to armv7-a-neon only, and handle a generic
armv7-a-neon cpu variant. Add arm64 cortex-a53 cpu variant. Sanity check
the arch variant against supported versions.

Change-Id: I8ecdea4cd36d9c82e1f29b158efc131f8b1cbc4d
diff --git a/cc/arm64_device.go b/cc/arm64_device.go
index c861498..284e5bd 100644
--- a/cc/arm64_device.go
+++ b/cc/arm64_device.go
@@ -15,6 +15,7 @@
 package cc
 
 import (
+	"fmt"
 	"strings"
 
 	"android/soong/common"
@@ -72,6 +73,14 @@
 	arm64Cppflags = []string{
 		"-fvisibility-inlines-hidden",
 	}
+
+	arm64CpuVariantCflags = map[string][]string{
+		"cortex-a53": []string{
+			"-mcpu=cortex-a53",
+		},
+	}
+
+	arm64ClangCpuVariantCflags = copyVariantFlags(arm64CpuVariantCflags)
 )
 
 const (
@@ -101,13 +110,31 @@
 	pctx.StaticVariable("arm64ClangCflags", strings.Join(clangFilterUnknownCflags(arm64Cflags), " "))
 	pctx.StaticVariable("arm64ClangLdflags", strings.Join(clangFilterUnknownCflags(arm64Ldflags), " "))
 	pctx.StaticVariable("arm64ClangCppflags", strings.Join(clangFilterUnknownCflags(arm64Cppflags), " "))
+
+	pctx.StaticVariable("arm64CortexA53Cflags",
+		strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
+	pctx.StaticVariable("arm64ClangCortexA53Cflags",
+		strings.Join(arm64ClangCpuVariantCflags["cortex-a53"], " "))
 }
 
+var (
+	arm64CpuVariantCflagsVar = map[string]string{
+		"":           "",
+		"cortex-a53": "${arm64CortexA53Cflags}",
+	}
+
+	arm64ClangCpuVariantCflagsVar = map[string]string{
+		"":           "",
+		"cortex-a53": "${arm64ClangCortexA53Cflags}",
+	}
+)
+
 type toolchainArm64 struct {
 	toolchain64Bit
-}
 
-var toolchainArm64Singleton = &toolchainArm64{}
+	toolchainCflags      string
+	toolchainClangCflags string
+}
 
 func (t *toolchainArm64) Name() string {
 	return "arm64"
@@ -125,6 +152,10 @@
 	return arm64GccVersion
 }
 
+func (t *toolchainArm64) ToolchainCflags() string {
+	return t.toolchainCflags
+}
+
 func (t *toolchainArm64) Cflags() string {
 	return "${arm64Cflags}"
 }
@@ -157,8 +188,19 @@
 	return "${arm64Ldflags}"
 }
 
+func (t *toolchainArm64) ToolchainClangCflags() string {
+	return t.toolchainClangCflags
+}
+
 func arm64ToolchainFactory(arch common.Arch) Toolchain {
-	return toolchainArm64Singleton
+	if arch.ArchVariant != "armv8-a" {
+		panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
+	}
+
+	return &toolchainArm64{
+		toolchainCflags:      variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant),
+		toolchainClangCflags: variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant),
+	}
 }
 
 func init() {