diff --git a/apex/apex.go b/apex/apex.go index 5e1a94344..7633ad201 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -257,18 +257,8 @@ type apexBundleProperties struct { Multilib apexMultilibProperties - Prefer_sanitize struct { - // Prefer native libraries with asan if available - Address *bool - // Prefer native libraries with hwasan if available - Hwaddress *bool - // Prefer native libraries with tsan if available - Thread *bool - // Prefer native libraries with integer_overflow if available - Integer_overflow *bool - // Prefer native libraries with cfi if available - Cfi *bool - } + // List of sanitizer names that this APEX is enabled for + SanitizerNames []string `blueprint:"mutated"` } type apexTargetBundleProperties struct { @@ -551,29 +541,15 @@ func (a *apexBundle) getImageVariation(config android.DeviceConfig) string { } } +func (a *apexBundle) EnableSanitizer(sanitizerName string) { + if !android.InList(sanitizerName, a.properties.SanitizerNames) { + a.properties.SanitizerNames = append(a.properties.SanitizerNames, sanitizerName) + } +} + func (a *apexBundle) IsSanitizerEnabled(ctx android.BaseModuleContext, sanitizerName string) bool { - // If this APEX is configured to prefer a sanitizer, use it - switch sanitizerName { - case "asan": - if proptools.Bool(a.properties.Prefer_sanitize.Address) { - return true - } - case "hwasan": - if proptools.Bool(a.properties.Prefer_sanitize.Hwaddress) { - return true - } - case "tsan": - if proptools.Bool(a.properties.Prefer_sanitize.Thread) { - return true - } - case "cfi": - if proptools.Bool(a.properties.Prefer_sanitize.Cfi) { - return true - } - case "integer_overflow": - if proptools.Bool(a.properties.Prefer_sanitize.Integer_overflow) { - return true - } + if android.InList(sanitizerName, a.properties.SanitizerNames) { + return true } // Then follow the global setting diff --git a/cc/sanitize.go b/cc/sanitize.go index fc2ed5071..729771839 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -666,6 +666,14 @@ func sanitizerDepsMutator(t sanitizerType) func(android.TopDownMutatorContext) { } return true }) + } else if sanitizeable, ok := mctx.Module().(Sanitizeable); ok { + // If an APEX module includes a lib which is enabled for a sanitizer T, then + // the APEX module is also enabled for the same sanitizer type. + mctx.VisitDirectDeps(func(child android.Module) { + if c, ok := child.(*Module); ok && c.sanitize.isSanitizerEnabled(t) { + sanitizeable.EnableSanitizer(t.name()) + } + }) } } } @@ -848,6 +856,7 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { type Sanitizeable interface { android.Module IsSanitizerEnabled(ctx android.BaseModuleContext, sanitizerName string) bool + EnableSanitizer(sanitizerName string) } // Create sanitized variants for modules that need them