aboutsummaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorEvgenii Stepanov <eugenis@google.com>2016-07-07 17:38:41 +0000
committerEvgenii Stepanov <eugenis@google.com>2016-07-07 17:38:41 +0000
commit05bafd3784c646c1b2d55a23edbf7e2ae9436064 (patch)
tree2ed063258882bc4dca305343910f7dba02892c85 /cc
parentbb028864514ad8d49d554b7413a1802e0c098151 (diff)
downloadbuild_soong-05bafd3784c646c1b2d55a23edbf7e2ae9436064.tar.gz
build_soong-05bafd3784c646c1b2d55a23edbf7e2ae9436064.tar.bz2
build_soong-05bafd3784c646c1b2d55a23edbf7e2ae9436064.zip
Revert "Target sanitize properties can disable the global sanitizer."
This reverts commit bb028864514ad8d49d554b7413a1802e0c098151. Breaks SANITIZE_HOST=address Change-Id: I9791a034e32a83d567b8739a7ec7b61890cb1b97
Diffstat (limited to 'cc')
-rw-r--r--cc/sanitize.go121
1 files changed, 52 insertions, 69 deletions
diff --git a/cc/sanitize.go b/cc/sanitize.go
index b0186d21..27d778ec 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -25,14 +25,6 @@ import (
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 @@ type SanitizeProperties struct {
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) props() []interface{} {
}
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 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) {
}
}
- 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)
- }
+ // The sanitizer specified by the environment wins over the module.
+ if len(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 s.Thread == nil {
- found, globalSanitizers = removeFromList("thread", globalSanitizers)
- s.Thread = boolPtr(found)
- }
+ if found, globalSanitizers = removeFromList("address", globalSanitizers); found {
+ sanitize.Properties.Sanitize.Address = true
+ }
- if s.Coverage == nil {
- found, globalSanitizers = removeFromList("coverage", globalSanitizers)
- s.Coverage = boolPtr(found)
- }
+ if found, globalSanitizers = removeFromList("thread", globalSanitizers); found {
+ sanitize.Properties.Sanitize.Thread = true
+ }
- if s.Safestack == nil {
- found, globalSanitizers = removeFromList("safe-stack", globalSanitizers)
- s.Safestack = boolPtr(found)
- }
+ if found, globalSanitizers = removeFromList("coverage", globalSanitizers); found {
+ sanitize.Properties.Sanitize.Coverage = true
+ }
- if len(globalSanitizers) > 0 {
- ctx.ModuleErrorf("unknown global sanitizer option %s", globalSanitizers[0])
- }
+ if found, globalSanitizers = removeFromList("safe-stack", globalSanitizers); found {
+ sanitize.Properties.Sanitize.SafeStack = true
+ }
- if Bool(s.All_undefined) || Bool(s.Undefined) || Bool(s.Address) ||
- Bool(s.Thread) || Bool(s.Coverage) || Bool(s.Safestack) {
+ 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 @@ func (sanitize *sanitize) deps(ctx BaseModuleContext, deps Deps) Deps {
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 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags {
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 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags {
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 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags {
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 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags {
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 @@ func (sanitize *sanitize) Sanitizer(t sanitizerType) bool {
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) Sanitizer(t sanitizerType) bool {
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))
}