Merge "Fix zip tests"
diff --git a/cc/compiler.go b/cc/compiler.go
index d53e799..e962949 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -86,6 +86,16 @@
 	// pass -frtti instead of -fno-rtti
 	Rtti *bool
 
+	// C standard version to use. Can be a specific version (such as "gnu11"),
+	// "experimental" (which will use draft versions like C1x when available),
+	// or the empty string (which will use the default).
+	C_std string
+
+	// C++ standard version to use. Can be a specific version (such as
+	// "gnu++11"), "experimental" (which will use draft versions like C++1z when
+	// available), or the empty string (which will use the default).
+	Cpp_std string
+
 	// if set to false, use -std=c++* instead of -std=gnu++*
 	Gnu_extensions *bool
 
@@ -307,7 +317,18 @@
 
 	if !ctx.sdk() {
 		cStd := config.CStdVersion
+		if compiler.Properties.C_std == "experimental" {
+			cStd = config.ExperimentalCStdVersion
+		} else if compiler.Properties.C_std != "" {
+			cStd = compiler.Properties.C_std
+		}
+
 		cppStd := config.CppStdVersion
+		if compiler.Properties.Cpp_std == "experimental" {
+			cppStd = config.ExperimentalCppStdVersion
+		} else if compiler.Properties.Cpp_std != "" {
+			cppStd = compiler.Properties.Cpp_std
+		}
 
 		if !flags.Clang {
 			// GCC uses an invalid C++14 ABI (emits calls to
diff --git a/cc/config/global.go b/cc/config/global.go
index e248040..e254a1c 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -65,9 +65,11 @@
 		"-w",
 	}
 
-	CStdVersion      = "gnu99"
-	CppStdVersion    = "gnu++14"
-	GccCppStdVersion = "gnu++11"
+	CStdVersion               = "gnu99"
+	CppStdVersion             = "gnu++14"
+	GccCppStdVersion          = "gnu++11"
+	ExperimentalCStdVersion   = "gnu11"
+	ExperimentalCppStdVersion = "gnu++1z"
 )
 
 var pctx = android.NewPackageContext("android/soong/cc/config")
diff --git a/cc/makevars.go b/cc/makevars.go
index 2e64e3c..30d83e8 100644
--- a/cc/makevars.go
+++ b/cc/makevars.go
@@ -60,6 +60,8 @@
 	ctx.Strict("DEFAULT_C_STD_VERSION", config.CStdVersion)
 	ctx.Strict("DEFAULT_CPP_STD_VERSION", config.CppStdVersion)
 	ctx.Strict("DEFAULT_GCC_CPP_STD_VERSION", config.GccCppStdVersion)
+	ctx.Strict("EXPERIMENTAL_C_STD_VERSION", config.ExperimentalCStdVersion)
+	ctx.Strict("EXPERIMENTAL_CPP_STD_VERSION", config.ExperimentalCppStdVersion)
 
 	ctx.Strict("DEFAULT_GLOBAL_TIDY_CHECKS", "${config.TidyDefaultGlobalChecks}")
 	ctx.Strict("DEFAULT_LOCAL_TIDY_CHECKS", joinLocalTidyChecks(config.DefaultLocalTidyChecks))
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 79c86aa..b98797a 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -167,7 +167,8 @@
 		}
 	}
 
-	if !ctx.AConfig().EnableCFI() {
+	// CFI needs gold linker, and mips toolchain does not have one.
+	if !ctx.AConfig().EnableCFI() || ctx.Arch().ArchType == android.Mips || ctx.Arch().ArchType == android.Mips64 {
 		s.Cfi = nil
 		s.Diag.Cfi = nil
 	}
@@ -280,11 +281,6 @@
 		flags.CFlags = append(flags.CFlags, asanCflags)
 		flags.LdFlags = append(flags.LdFlags, asanLdflags)
 
-		// ASan runtime library must be the first in the link order.
-		runtimeLibrary := config.AddressSanitizerRuntimeLibrary(ctx.toolchain())
-		if runtimeLibrary != "" {
-			flags.libFlags = append([]string{"${config.ClangAsanLibDir}/" + runtimeLibrary}, flags.libFlags...)
-		}
 		if ctx.Host() {
 			// -nodefaultlibs (provided with libc++) prevents the driver from linking
 			// libraries needed with -fsanitize=address. http://b/18650275 (WAI)
@@ -317,6 +313,9 @@
 			// __cfi_check needs to be built as Thumb (see the code in linker_cfi.cpp). LLVM is not set up
 			// to do this on a function basis, so force Thumb on the entire module.
 			flags.RequiredInstructionSet = "thumb"
+			// Workaround for b/33678192. CFI jumptables need Thumb2 codegen.  Revert when
+			// Clang is updated past r290384.
+			flags.LdFlags = append(flags.LdFlags, "-march=armv7-a")
 		}
 		sanitizers = append(sanitizers, "cfi")
 		cfiFlags := []string{"-flto", "-fsanitize=cfi", "-fsanitize-cfi-cross-dso"}
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 5c71742..ee4c503 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -150,8 +150,6 @@
 				} else {
 					ctx.ModuleErrorf("host tool %q missing output file", ctx.OtherModuleName(module))
 				}
-			} else {
-				ctx.ModuleErrorf("unknown dependency %q", ctx.OtherModuleName(module))
 			}
 		})
 	}