Revert "Target sanitize properties can disable the global sanitizer."

This reverts commit bb028864514ad8d49d554b7413a1802e0c098151.

Breaks SANITIZE_HOST=address

Change-Id: I9791a034e32a83d567b8739a7ec7b61890cb1b97
diff --git a/cc/sanitize.go b/cc/sanitize.go
index b0186d2..27d778e 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -25,14 +25,6 @@
 
 type sanitizerType int
 
-func boolPtr(v bool) *bool {
-	if v {
-		return &v
-	} else {
-		return nil
-	}
-}
-
 func init() {
 	pctx.StaticVariable("clangAsanLibDir", "${clangPath}/lib64/clang/3.8/lib/linux")
 }
@@ -59,15 +51,15 @@
 		Never bool `android:"arch_variant"`
 
 		// main sanitizers
-		Address *bool `android:"arch_variant"`
-		Thread  *bool `android:"arch_variant"`
+		Address bool `android:"arch_variant"`
+		Thread  bool `android:"arch_variant"`
 
 		// local sanitizers
-		Undefined      *bool    `android:"arch_variant"`
-		All_undefined  *bool    `android:"arch_variant"`
+		Undefined      bool     `android:"arch_variant"`
+		All_undefined  bool     `android:"arch_variant"`
 		Misc_undefined []string `android:"arch_variant"`
-		Coverage       *bool    `android:"arch_variant"`
-		Safestack      *bool    `android:"arch_variant"`
+		Coverage       bool     `android:"arch_variant"`
+		SafeStack      bool     `android:"arch_variant"`
 
 		// value to pass to -fsantitize-recover=
 		Recover []string
@@ -90,18 +82,20 @@
 }
 
 func (sanitize *sanitize) begin(ctx BaseModuleContext) {
-	s := &sanitize.Properties.Sanitize
-
 	// Don't apply sanitizers to NDK code.
 	if ctx.sdk() {
-		s.Never = true
+		sanitize.Properties.Sanitize.Never = true
 	}
 
 	// Never always wins.
-	if s.Never {
+	if sanitize.Properties.Sanitize.Never {
 		return
 	}
 
+	if ctx.ContainsProperty("sanitize") {
+		sanitize.Properties.SanitizerEnabled = true
+	}
+
 	var globalSanitizers []string
 	if ctx.clang() {
 		if ctx.Host() {
@@ -111,59 +105,48 @@
 		}
 	}
 
-	var found bool
-	if s.All_undefined == nil {
-		found, globalSanitizers = removeFromList("undefined", globalSanitizers)
-		s.All_undefined = boolPtr(found)
-	}
-
-	if s.Undefined == nil {
-		found, globalSanitizers = removeFromList("default-ub", globalSanitizers)
-		s.Undefined = boolPtr(found)
-	}
-
-	if s.Address == nil {
-		found, globalSanitizers = removeFromList("address", globalSanitizers)
-		s.Address = boolPtr(found)
-	}
-
-	if s.Thread == nil {
-		found, globalSanitizers = removeFromList("thread", globalSanitizers)
-		s.Thread = boolPtr(found)
-	}
-
-	if s.Coverage == nil {
-		found, globalSanitizers = removeFromList("coverage", globalSanitizers)
-		s.Coverage = boolPtr(found)
-	}
-
-	if s.Safestack == nil {
-		found, globalSanitizers = removeFromList("safe-stack", globalSanitizers)
-		s.Safestack = boolPtr(found)
-	}
-
+	// The sanitizer specified by the environment wins over the module.
 	if len(globalSanitizers) > 0 {
-		ctx.ModuleErrorf("unknown global sanitizer option %s", globalSanitizers[0])
-	}
+		// wipe the enabled sanitizers
+		sanitize.Properties = SanitizeProperties{}
+		var found bool
+		if found, globalSanitizers = removeFromList("undefined", globalSanitizers); found {
+			sanitize.Properties.Sanitize.All_undefined = true
+		} else if found, globalSanitizers = removeFromList("default-ub", globalSanitizers); found {
+			sanitize.Properties.Sanitize.Undefined = true
+		}
 
-	if Bool(s.All_undefined) || Bool(s.Undefined) || Bool(s.Address) ||
-		Bool(s.Thread) || Bool(s.Coverage) || Bool(s.Safestack) {
+		if found, globalSanitizers = removeFromList("address", globalSanitizers); found {
+			sanitize.Properties.Sanitize.Address = true
+		}
+
+		if found, globalSanitizers = removeFromList("thread", globalSanitizers); found {
+			sanitize.Properties.Sanitize.Thread = true
+		}
+
+		if found, globalSanitizers = removeFromList("coverage", globalSanitizers); found {
+			sanitize.Properties.Sanitize.Coverage = true
+		}
+
+		if found, globalSanitizers = removeFromList("safe-stack", globalSanitizers); found {
+			sanitize.Properties.Sanitize.SafeStack = true
+		}
+
+		if len(globalSanitizers) > 0 {
+			ctx.ModuleErrorf("unknown global sanitizer option %s", globalSanitizers[0])
+		}
 		sanitize.Properties.SanitizerEnabled = true
 	}
 
-	if Bool(s.All_undefined) {
-		s.Undefined = nil
-	}
-
 	if !ctx.toolchain().Is64Bit() {
 		// TSAN and SafeStack are not supported on 32-bit architectures
-		s.Thread = nil
-		s.Safestack = nil
+		sanitize.Properties.Sanitize.Thread = false
+		sanitize.Properties.Sanitize.SafeStack = false
 		// TODO(ccross): error for compile_multilib = "32"?
 	}
 
-	if Bool(s.Coverage) {
-		if !Bool(s.Address) {
+	if sanitize.Properties.Sanitize.Coverage {
+		if !sanitize.Properties.Sanitize.Address {
 			ctx.ModuleErrorf(`Use of "coverage" also requires "address"`)
 		}
 	}
@@ -176,7 +159,7 @@
 
 	if ctx.Device() {
 		deps.SharedLibs = append(deps.SharedLibs, "libdl")
-		if Bool(sanitize.Properties.Sanitize.Address) {
+		if sanitize.Properties.Sanitize.Address {
 			deps.StaticLibs = append(deps.StaticLibs, "libasan")
 		}
 	}
@@ -195,13 +178,13 @@
 
 	var sanitizers []string
 
-	if Bool(sanitize.Properties.Sanitize.All_undefined) {
+	if sanitize.Properties.Sanitize.All_undefined {
 		sanitizers = append(sanitizers, "undefined")
 		if ctx.Device() {
 			ctx.ModuleErrorf("ubsan is not yet supported on the device")
 		}
 	} else {
-		if Bool(sanitize.Properties.Sanitize.Undefined) {
+		if sanitize.Properties.Sanitize.Undefined {
 			sanitizers = append(sanitizers,
 				"bool",
 				"integer-divide-by-zero",
@@ -229,7 +212,7 @@
 		sanitizers = append(sanitizers, sanitize.Properties.Sanitize.Misc_undefined...)
 	}
 
-	if Bool(sanitize.Properties.Sanitize.Address) {
+	if sanitize.Properties.Sanitize.Address {
 		if ctx.Arch().ArchType == android.Arm {
 			// Frame pointer based unwinder in ASan requires ARM frame setup.
 			// TODO: put in flags?
@@ -258,11 +241,11 @@
 		sanitizers = append(sanitizers, "address")
 	}
 
-	if Bool(sanitize.Properties.Sanitize.Coverage) {
+	if sanitize.Properties.Sanitize.Coverage {
 		flags.CFlags = append(flags.CFlags, "-fsanitize-coverage=edge,indirect-calls,8bit-counters,trace-cmp")
 	}
 
-	if Bool(sanitize.Properties.Sanitize.Safestack) {
+	if sanitize.Properties.Sanitize.SafeStack {
 		sanitizers = append(sanitizers, "safe-stack")
 	}
 
@@ -279,7 +262,7 @@
 			flags.LdFlags = append(flags.LdFlags, sanitizeArg)
 			flags.LdFlags = append(flags.LdFlags, "-lrt", "-ldl")
 		} else {
-			if !Bool(sanitize.Properties.Sanitize.Address) {
+			if !sanitize.Properties.Sanitize.Address {
 				flags.CFlags = append(flags.CFlags, "-fsanitize-trap=all", "-ftrap-function=abort")
 			}
 		}
@@ -305,9 +288,9 @@
 
 	switch t {
 	case asan:
-		return Bool(sanitize.Properties.Sanitize.Address)
+		return sanitize.Properties.Sanitize.Address
 	case tsan:
-		return Bool(sanitize.Properties.Sanitize.Thread)
+		return sanitize.Properties.Sanitize.Thread
 	default:
 		panic(fmt.Errorf("unknown sanitizerType %d", t))
 	}
@@ -316,9 +299,9 @@
 func (sanitize *sanitize) SetSanitizer(t sanitizerType, b bool) {
 	switch t {
 	case asan:
-		sanitize.Properties.Sanitize.Address = boolPtr(b)
+		sanitize.Properties.Sanitize.Address = b
 	case tsan:
-		sanitize.Properties.Sanitize.Thread = boolPtr(b)
+		sanitize.Properties.Sanitize.Thread = b
 	default:
 		panic(fmt.Errorf("unknown sanitizerType %d", t))
 	}