diff options
| -rw-r--r-- | cc/sanitize.go | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/cc/sanitize.go b/cc/sanitize.go index 1fcb32c9c..e2bb00900 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -457,23 +457,6 @@ func (sanitize *sanitize) inSanitizerDir() bool { return sanitize.Properties.InSanitizerDir } -func (sanitize *sanitize) Sanitizer(t sanitizerType) bool { - if sanitize == nil { - return false - } - - switch t { - case asan: - return Bool(sanitize.Properties.Sanitize.Address) - case tsan: - return Bool(sanitize.Properties.Sanitize.Thread) - case intOverflow: - return Bool(sanitize.Properties.Sanitize.Integer_overflow) - default: - panic(fmt.Errorf("unknown sanitizerType %d", t)) - } -} - func (sanitize *sanitize) SetSanitizer(t sanitizerType, b bool) { switch t { case asan: @@ -493,13 +476,47 @@ func (sanitize *sanitize) SetSanitizer(t sanitizerType, b bool) { } } +func (sanitize *sanitize) getSanitizerBoolPtr(t sanitizerType) *bool { + switch t { + case asan: + return sanitize.Properties.Sanitize.Address + case tsan: + return sanitize.Properties.Sanitize.Thread + case intOverflow: + return sanitize.Properties.Sanitize.Integer_overflow + default: + panic(fmt.Errorf("unknown sanitizerType %d", t)) + } +} + +// Check if the sanitizer is explicitly disabled (as opposed to nil by +// virtue of not being set). +func (sanitize *sanitize) isSanitizerExplicitlyDisabled(t sanitizerType) bool { + if sanitize == nil { + return false + } + + sanitizerVal := sanitize.getSanitizerBoolPtr(t) + return sanitizerVal != nil && *sanitizerVal == false +} + +func (sanitize *sanitize) isSanitizerExplicitlyEnabled(t sanitizerType) bool { + if sanitize == nil { + return false + } + + sanitizerVal := sanitize.getSanitizerBoolPtr(t) + return sanitizerVal != nil && *sanitizerVal == true +} + // Propagate asan requirements down from binaries func sanitizerDepsMutator(t sanitizerType) func(android.TopDownMutatorContext) { return func(mctx android.TopDownMutatorContext) { - if c, ok := mctx.Module().(*Module); ok && c.sanitize.Sanitizer(t) { + if c, ok := mctx.Module().(*Module); ok && c.sanitize.isSanitizerExplicitlyEnabled(t) { mctx.VisitDepsDepthFirst(func(module blueprint.Module) { - if d, ok := mctx.Module().(*Module); ok && c.sanitize != nil && - !c.sanitize.Properties.Sanitize.Never { + if d, ok := module.(*Module); ok && d.sanitize != nil && + !d.sanitize.Properties.Sanitize.Never && + !d.sanitize.isSanitizerExplicitlyDisabled(t) { d.sanitize.Properties.SanitizeDep = true } }) @@ -511,10 +528,10 @@ func sanitizerDepsMutator(t sanitizerType) func(android.TopDownMutatorContext) { func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { return func(mctx android.BottomUpMutatorContext) { if c, ok := mctx.Module().(*Module); ok && c.sanitize != nil { - if c.isDependencyRoot() && c.sanitize.Sanitizer(t) { + if c.isDependencyRoot() && c.sanitize.isSanitizerExplicitlyEnabled(t) { modules := mctx.CreateVariations(t.String()) modules[0].(*Module).sanitize.SetSanitizer(t, true) - } else if c.sanitize.Properties.SanitizeDep { + } else if c.sanitize.isSanitizerExplicitlyEnabled(t) || c.sanitize.Properties.SanitizeDep { modules := mctx.CreateVariations("", t.String()) modules[0].(*Module).sanitize.SetSanitizer(t, false) modules[1].(*Module).sanitize.SetSanitizer(t, true) @@ -523,10 +540,18 @@ func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { if mctx.Device() { modules[1].(*Module).sanitize.Properties.InSanitizerDir = true } else { - modules[0].(*Module).Properties.PreventInstall = true + if c.sanitize.isSanitizerExplicitlyEnabled(t) { + modules[0].(*Module).Properties.PreventInstall = true + } else { + modules[1].(*Module).Properties.PreventInstall = true + } } if mctx.AConfig().EmbeddedInMake() { - modules[0].(*Module).Properties.HideFromMake = true + if c.sanitize.isSanitizerExplicitlyEnabled(t) { + modules[0].(*Module).Properties.HideFromMake = true + } else { + modules[1].(*Module).Properties.HideFromMake = true + } } } c.sanitize.Properties.SanitizeDep = false |