cc: Filter out unknown clang cflags from InstructionSetFlags

-funswitch-loops is in the arm instruction set flags, but unsupported by
clang. Make removes clang unknown cflags from the instruction set flags.
This was producing a warning, causing -Werror to fail on libm.

Change-Id: Ibc69c9af04a738aa8adeb5549900e2b53ab754f0
diff --git a/cc/arm_device.go b/cc/arm_device.go
index ce8a1cb..8f3485e 100644
--- a/cc/arm_device.go
+++ b/cc/arm_device.go
@@ -172,6 +172,10 @@
 	pctx.StaticVariable("armClangLdflags", strings.Join(clangFilterUnknownCflags(armLdflags), " "))
 	pctx.StaticVariable("armClangCppflags", strings.Join(clangFilterUnknownCflags(armCppflags), " "))
 
+	// Clang ARM vs. Thumb instruction set cflags
+	pctx.StaticVariable("armClangArmCflags", strings.Join(clangFilterUnknownCflags(armArmCflags), " "))
+	pctx.StaticVariable("armClangThumbCflags", strings.Join(clangFilterUnknownCflags(armThumbCflags), " "))
+
 	// Clang cpu variant cflags
 	pctx.StaticVariable("armClangArmv5TECflags",
 		strings.Join(armClangArchVariantCflags["armv5te"], " "))
@@ -291,6 +295,17 @@
 	return t.ldflags
 }
 
+func (t *toolchainArm) ClangInstructionSetFlags(isa string) (string, error) {
+	switch isa {
+	case "arm":
+		return "${armClangArmCflags}", nil
+	case "thumb", "":
+		return "${armClangThumbCflags}", nil
+	default:
+		return t.toolchainBase.ClangInstructionSetFlags(isa)
+	}
+}
+
 func armToolchainFactory(archVariant string, cpuVariant string) Toolchain {
 	var fixCortexA8 string
 	switch cpuVariant {
diff --git a/cc/cc.go b/cc/cc.go
index 2278ec0..c4e1d0e 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -488,15 +488,6 @@
 		}...)
 	}
 
-	instructionSet := c.Properties.Instruction_set
-	instructionSetFlags, err := toolchain.InstructionSetFlags(instructionSet)
-	if err != nil {
-		ctx.ModuleErrorf("%s", err)
-	}
-
-	// TODO: debug
-	flags.CFlags = append(flags.CFlags, c.Properties.Release.Cflags...)
-
 	if !ctx.ContainsProperty("clang") {
 		if ctx.Host() {
 			flags.Clang = true
@@ -507,6 +498,18 @@
 		}
 	}
 
+	instructionSet := c.Properties.Instruction_set
+	instructionSetFlags, err := toolchain.InstructionSetFlags(instructionSet)
+	if flags.Clang {
+		instructionSetFlags, err = toolchain.ClangInstructionSetFlags(instructionSet)
+	}
+	if err != nil {
+		ctx.ModuleErrorf("%s", err)
+	}
+
+	// TODO: debug
+	flags.CFlags = append(flags.CFlags, c.Properties.Release.Cflags...)
+
 	if flags.Clang {
 		flags.CFlags = clangFilterUnknownCflags(flags.CFlags)
 		flags.CFlags = append(flags.CFlags, c.Properties.Clang_cflags...)
diff --git a/cc/toolchain.go b/cc/toolchain.go
index d188845..e17e345 100644
--- a/cc/toolchain.go
+++ b/cc/toolchain.go
@@ -49,6 +49,7 @@
 	ClangCflags() string
 	ClangCppflags() string
 	ClangLdflags() string
+	ClangInstructionSetFlags(string) (string, error)
 
 	Is64Bit() bool
 }
@@ -63,6 +64,13 @@
 	return "", nil
 }
 
+func (toolchainBase) ClangInstructionSetFlags(s string) (string, error) {
+	if s != "" {
+		return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
+	}
+	return "", nil
+}
+
 type toolchain64Bit struct {
 	toolchainBase
 }