Keep a "sanitizer dependency" flag for each sanitizer.

This is so that we can avoid mutating state in sanitizerMutator, as
would be necessary if we only had a single bit for every sanitizer
together.

Test: Presubmits.
Change-Id: I5576367c12972fbea64342ab123118ec5a2cfeec
This commit is contained in:
Lukacs T. Berki
2022-05-18 10:00:37 +02:00
parent 53c6c67cbb
commit 2da6c3cc86
3 changed files with 37 additions and 27 deletions

View File

@@ -276,7 +276,7 @@ type SanitizeUserProps struct {
type SanitizeProperties struct {
Sanitize SanitizeUserProps `android:"arch_variant"`
SanitizerEnabled bool `blueprint:"mutated"`
SanitizeDep bool `blueprint:"mutated"`
SanitizeDepTypes []SanitizerType `blueprint:"mutated"`
MinimalRuntimeDep bool `blueprint:"mutated"`
BuiltinsDep bool `blueprint:"mutated"`
UbsanRuntimeDep bool `blueprint:"mutated"`
@@ -944,7 +944,7 @@ func sanitizerDepsMutator(t SanitizerType) func(android.TopDownMutatorContext) {
// determine defaultVariation in sanitizerMutator below.
// Instead, just mark SanitizeDep to forcefully create cfi variant.
enabled = true
c.SetSanitizeDep(true)
c.SetSanitizeDep(t)
}
if enabled {
isSanitizableDependencyTag := c.SanitizableDepTagChecker()
@@ -959,10 +959,10 @@ func sanitizerDepsMutator(t SanitizerType) func(android.TopDownMutatorContext) {
if d.StaticallyLinked() && d.SanitizerSupported(t) {
// Rust does not support some of these sanitizers, so we need to check if it's
// supported before setting this true.
d.SetSanitizeDep(true)
d.SetSanitizeDep(t)
}
} else {
d.SetSanitizeDep(true)
d.SetSanitizeDep(t)
}
}
return true
@@ -978,7 +978,7 @@ func sanitizerDepsMutator(t SanitizerType) func(android.TopDownMutatorContext) {
c.SanitizePropDefined() &&
!c.SanitizeNever() &&
!c.IsSanitizerExplicitlyDisabled(t) {
c.SetSanitizeDep(true)
c.SetSanitizeDep(t)
}
})
}
@@ -1315,8 +1315,14 @@ func (c *Module) IsSanitizerEnabled(t SanitizerType) bool {
return c.sanitize.isSanitizerEnabled(t)
}
func (c *Module) SanitizeDep() bool {
return c.sanitize.Properties.SanitizeDep
func (c *Module) SanitizeDep(t SanitizerType) bool {
for _, e := range c.sanitize.Properties.SanitizeDepTypes {
if t == e {
return true
}
}
return false
}
func (c *Module) StaticallyLinked() bool {
@@ -1335,9 +1341,9 @@ func (c *Module) SetSanitizer(t SanitizerType, b bool) {
}
}
func (c *Module) SetSanitizeDep(b bool) {
if c.sanitize != nil {
c.sanitize.Properties.SanitizeDep = b
func (c *Module) SetSanitizeDep(t SanitizerType) {
if !c.SanitizeDep(t) {
c.sanitize.Properties.SanitizeDepTypes = append(c.sanitize.Properties.SanitizeDepTypes, t)
}
}
@@ -1354,7 +1360,7 @@ func sanitizerMutator(t SanitizerType) func(android.BottomUpMutatorContext) {
if c.Binary() && c.IsSanitizerEnabled(t) {
modules := mctx.CreateVariations(t.variationName())
modules[0].(PlatformSanitizeable).SetSanitizer(t, true)
} else if c.IsSanitizerEnabled(t) || c.SanitizeDep() {
} else if c.IsSanitizerEnabled(t) || c.SanitizeDep(t) {
isSanitizerEnabled := c.IsSanitizerEnabled(t)
if c.StaticallyLinked() || c.Header() || t == Fuzzer {
// Static and header libs are split into non-sanitized and sanitized variants.
@@ -1376,8 +1382,6 @@ func sanitizerMutator(t SanitizerType) func(android.BottomUpMutatorContext) {
modules := mctx.CreateVariations("", t.variationName())
modules[0].(PlatformSanitizeable).SetSanitizer(t, false)
modules[1].(PlatformSanitizeable).SetSanitizer(t, true)
modules[0].(PlatformSanitizeable).SetSanitizeDep(false)
modules[1].(PlatformSanitizeable).SetSanitizeDep(false)
if mctx.Device() && t.incompatibleWithCfi() && cfiSupported {
// TODO: Make sure that cfi mutator runs "after" any of the sanitizers that
@@ -1410,7 +1414,6 @@ func sanitizerMutator(t SanitizerType) func(android.BottomUpMutatorContext) {
// Shared libs are not split. Only the sanitized variant is created.
modules := mctx.CreateVariations(t.variationName())
modules[0].(PlatformSanitizeable).SetSanitizer(t, true)
modules[0].(PlatformSanitizeable).SetSanitizeDep(false)
// locate the asan libraries under /data/asan
if mctx.Device() && t == Asan && isSanitizerEnabled {
@@ -1424,7 +1427,6 @@ func sanitizerMutator(t SanitizerType) func(android.BottomUpMutatorContext) {
}
}
}
c.SetSanitizeDep(false)
} else if sanitizeable, ok := mctx.Module().(Sanitizeable); ok && sanitizeable.IsSanitizerEnabled(mctx, t.name()) {
// APEX and Java fuzz modules fall here
sanitizeable.AddSanitizerDependencies(mctx, t.name())