Merge "Remove unnecessary DeviceUsesClang."
diff --git a/android/arch.go b/android/arch.go
index e696a0d..6ab184f 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -923,8 +923,6 @@
 
 func getMegaDeviceConfig() []archConfig {
 	return []archConfig{
-		// armv5 is only used for unbundled apps
-		//{"arm", "armv5te", "", []string{"armeabi"}},
 		{"arm", "armv7-a", "generic", []string{"armeabi-v7a"}},
 		{"arm", "armv7-a-neon", "generic", []string{"armeabi-v7a"}},
 		{"arm", "armv7-a-neon", "cortex-a7", []string{"armeabi-v7a"}},
diff --git a/cc/config/arm_device.go b/cc/config/arm_device.go
index fda4f9d..0d3750e 100644
--- a/cc/config/arm_device.go
+++ b/cc/config/arm_device.go
@@ -49,14 +49,6 @@
 	}
 
 	armArchVariantCflags = map[string][]string{
-		"armv5te": []string{
-			"-march=armv5te",
-			"-mtune=xscale",
-			"-D__ARM_ARCH_5__",
-			"-D__ARM_ARCH_5T__",
-			"-D__ARM_ARCH_5E__",
-			"-D__ARM_ARCH_5TE__",
-		},
 		"armv7-a": []string{
 			"-march=armv7-a",
 			"-mfloat-abi=softfp",
@@ -140,7 +132,6 @@
 		"neon")
 
 	android.RegisterArchVariants(android.Arm,
-		"armv5te",
 		"armv7-a",
 		"armv7-a-neon",
 		"armv8-a",
@@ -188,7 +179,6 @@
 	pctx.StaticVariable("ArmThumbCflags", strings.Join(armThumbCflags, " "))
 
 	// Architecture variant cflags
-	pctx.StaticVariable("ArmArmv5TECflags", strings.Join(armArchVariantCflags["armv5te"], " "))
 	pctx.StaticVariable("ArmArmv7ACflags", strings.Join(armArchVariantCflags["armv7-a"], " "))
 	pctx.StaticVariable("ArmArmv7ANeonCflags", strings.Join(armArchVariantCflags["armv7-a-neon"], " "))
 	pctx.StaticVariable("ArmArmv8ACflags", strings.Join(armArchVariantCflags["armv8-a"], " "))
@@ -213,8 +203,6 @@
 	pctx.StaticVariable("ArmClangThumbCflags", strings.Join(ClangFilterUnknownCflags(armThumbCflags), " "))
 
 	// Clang arch variant cflags
-	pctx.StaticVariable("ArmClangArmv5TECflags",
-		strings.Join(armClangArchVariantCflags["armv5te"], " "))
 	pctx.StaticVariable("ArmClangArmv7ACflags",
 		strings.Join(armClangArchVariantCflags["armv7-a"], " "))
 	pctx.StaticVariable("ArmClangArmv7ANeonCflags",
@@ -241,7 +229,6 @@
 
 var (
 	armArchVariantCflagsVar = map[string]string{
-		"armv5te":      "${config.ArmArmv5TECflags}",
 		"armv7-a":      "${config.ArmArmv7ACflags}",
 		"armv7-a-neon": "${config.ArmArmv7ANeonCflags}",
 		"armv8-a":      "${config.ArmArmv8ACflags}",
@@ -263,7 +250,6 @@
 	}
 
 	armClangArchVariantCflagsVar = map[string]string{
-		"armv5te":      "${config.ArmClangArmv5TECflags}",
 		"armv7-a":      "${config.ArmClangArmv7ACflags}",
 		"armv7-a-neon": "${config.ArmClangArmv7ANeonCflags}",
 		"armv8-a":      "${config.ArmClangArmv8ACflags}",
@@ -399,8 +385,6 @@
 		}
 	case "armv7-a":
 		fixCortexA8 = "-Wl,--fix-cortex-a8"
-	case "armv5te":
-		// Nothing extra for armv5te
 	case "armv8-a":
 		// Nothing extra for armv8-a
 	default:
diff --git a/cc/stl.go b/cc/stl.go
index c65f1c2..c5757cd 100644
--- a/cc/stl.go
+++ b/cc/stl.go
@@ -144,6 +144,19 @@
 	switch stl.Properties.SelectedStl {
 	case "libc++", "libc++_static":
 		flags.CFlags = append(flags.CFlags, "-D_USING_LIBCXX")
+
+		if ctx.Darwin() {
+			// libc++'s headers are annotated with availability macros that
+			// indicate which version of Mac OS was the first to ship with a
+			// libc++ feature available in its *system's* libc++.dylib. We do
+			// not use the system's library, but rather ship our own. As such,
+			// these availability attributes are meaningless for us but cause
+			// build breaks when we try to use code that would not be available
+			// in the system's dylib.
+			flags.CppFlags = append(flags.CppFlags,
+				"-D_LIBCPP_DISABLE_AVAILABILITY")
+		}
+
 		if !ctx.toolchain().Bionic() {
 			flags.CppFlags = append(flags.CppFlags, "-nostdinc++")
 			flags.LdFlags = append(flags.LdFlags, "-nodefaultlibs")
diff --git a/ui/build/config.go b/ui/build/config.go
index f2511e7..0c37724 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -257,8 +257,6 @@
 
 	var product string
 	switch arch {
-	case "armv5":
-		product = "generic_armv5"
 	case "arm", "":
 		product = "aosp_arm"
 	case "arm64":
diff --git a/ui/build/context.go b/ui/build/context.go
index 52a337d..0636631 100644
--- a/ui/build/context.go
+++ b/ui/build/context.go
@@ -103,6 +103,13 @@
 	return false
 }
 
+func (c ContextImpl) IsErrTerminal() bool {
+	if term, ok := os.LookupEnv("TERM"); ok {
+		return term != "dumb" && isTerminal(c.Stderr())
+	}
+	return false
+}
+
 func (c ContextImpl) TermWidth() (int, bool) {
 	return termWidth(c.Stdout())
 }
diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go
index 96f2274..a0e1eca 100644
--- a/ui/build/dumpvars.go
+++ b/ui/build/dumpvars.go
@@ -42,6 +42,7 @@
 		config.PrebuiltBuildTool("ckati"),
 		"-f", "build/make/core/config.mk",
 		"--color_warnings",
+		"--kati_stats",
 		"dump-many-vars",
 		"MAKECMDGOALS="+strings.Join(goals, " "))
 	cmd.Environment.Set("CALLED_FROM_SETUP", "true")
@@ -51,15 +52,19 @@
 	}
 	cmd.Environment.Set("DUMP_MANY_VARS", strings.Join(vars, " "))
 	cmd.Sandbox = dumpvarsSandbox
-	// TODO: error out when Stderr contains any content
-	cmd.Stderr = ctx.Stderr()
-	output, err := cmd.Output()
+	output := bytes.Buffer{}
+	cmd.Stdout = &output
+	pipe, err := cmd.StderrPipe()
 	if err != nil {
-		return nil, err
+		ctx.Fatalln("Error getting output pipe for ckati:", err)
 	}
+	cmd.StartOrFatal()
+	// TODO: error out when Stderr contains any content
+	katiRewriteOutput(ctx, pipe)
+	cmd.WaitOrFatal()
 
 	ret := make(map[string]string, len(vars))
-	for _, line := range strings.Split(string(output), "\n") {
+	for _, line := range strings.Split(output.String(), "\n") {
 		if len(line) == 0 {
 			continue
 		}
diff --git a/ui/build/kati.go b/ui/build/kati.go
index 7bb721d..e4715bb 100644
--- a/ui/build/kati.go
+++ b/ui/build/kati.go
@@ -115,6 +115,7 @@
 func katiRewriteOutput(ctx Context, pipe io.ReadCloser) {
 	haveBlankLine := true
 	smartTerminal := ctx.IsTerminal()
+	errSmartTerminal := ctx.IsErrTerminal()
 
 	scanner := bufio.NewScanner(pipe)
 	for scanner.Scan() {
@@ -155,7 +156,7 @@
 			// that message instead of overwriting it.
 			fmt.Fprintln(ctx.Stdout())
 			haveBlankLine = true
-		} else if !smartTerminal {
+		} else if !errSmartTerminal {
 			// Most editors display these as garbage, so strip them out.
 			line = string(stripAnsiEscapes([]byte(line)))
 		}