Merge "bp2build for sanitizer blocklists long term fix" into main

This commit is contained in:
Trevor Radcliffe
2023-08-17 21:02:03 +00:00
committed by Gerrit Code Review
9 changed files with 111 additions and 26 deletions

View File

@@ -76,6 +76,8 @@ const (
NonApex = "non_apex" NonApex = "non_apex"
ErrorproneDisabled = "errorprone_disabled" ErrorproneDisabled = "errorprone_disabled"
// TODO: b/294868620 - Remove when completing the bug
SanitizersEnabled = "sanitizers_enabled"
) )
func PowerSetWithoutEmptySet[T any](items []T) [][]T { func PowerSetWithoutEmptySet[T any](items []T) [][]T {
@@ -223,6 +225,12 @@ var (
ErrorproneDisabled: "//build/bazel/rules/java/errorprone:errorprone_globally_disabled", ErrorproneDisabled: "//build/bazel/rules/java/errorprone:errorprone_globally_disabled",
ConditionsDefaultConfigKey: ConditionsDefaultSelectKey, ConditionsDefaultConfigKey: ConditionsDefaultSelectKey,
} }
// TODO: b/294868620 - Remove when completing the bug
sanitizersEnabledMap = map[string]string{
SanitizersEnabled: "//build/bazel/rules/cc:sanitizers_enabled",
ConditionsDefaultConfigKey: ConditionsDefaultSelectKey,
}
) )
// basic configuration types // basic configuration types
@@ -237,6 +245,8 @@ const (
osAndInApex osAndInApex
inApex inApex
errorProneDisabled errorProneDisabled
// TODO: b/294868620 - Remove when completing the bug
sanitizersEnabled
) )
func osArchString(os string, arch string) string { func osArchString(os string, arch string) string {
@@ -253,6 +263,8 @@ func (ct configurationType) String() string {
osAndInApex: "os_in_apex", osAndInApex: "os_in_apex",
inApex: "in_apex", inApex: "in_apex",
errorProneDisabled: "errorprone_disabled", errorProneDisabled: "errorprone_disabled",
// TODO: b/294868620 - Remove when completing the bug
sanitizersEnabled: "sanitizers_enabled",
}[ct] }[ct]
} }
@@ -287,6 +299,11 @@ func (ct configurationType) validateConfig(config string) {
if _, ok := errorProneMap[config]; !ok { if _, ok := errorProneMap[config]; !ok {
panic(fmt.Errorf("Unknown errorprone config: %s", config)) panic(fmt.Errorf("Unknown errorprone config: %s", config))
} }
// TODO: b/294868620 - Remove when completing the bug
case sanitizersEnabled:
if _, ok := sanitizersEnabledMap[config]; !ok {
panic(fmt.Errorf("Unknown sanitizers_enabled config: %s", config))
}
default: default:
panic(fmt.Errorf("Unrecognized ConfigurationType %d", ct)) panic(fmt.Errorf("Unrecognized ConfigurationType %d", ct))
} }
@@ -318,6 +335,9 @@ func (ca ConfigurationAxis) SelectKey(config string) string {
return inApexMap[config] return inApexMap[config]
case errorProneDisabled: case errorProneDisabled:
return errorProneMap[config] return errorProneMap[config]
// TODO: b/294868620 - Remove when completing the bug
case sanitizersEnabled:
return sanitizersEnabledMap[config]
default: default:
panic(fmt.Errorf("Unrecognized ConfigurationType %d", ca.configurationType)) panic(fmt.Errorf("Unrecognized ConfigurationType %d", ca.configurationType))
} }
@@ -338,6 +358,9 @@ var (
InApexAxis = ConfigurationAxis{configurationType: inApex} InApexAxis = ConfigurationAxis{configurationType: inApex}
ErrorProneAxis = ConfigurationAxis{configurationType: errorProneDisabled} ErrorProneAxis = ConfigurationAxis{configurationType: errorProneDisabled}
// TODO: b/294868620 - Remove when completing the bug
SanitizersEnabledAxis = ConfigurationAxis{configurationType: sanitizersEnabled}
) )
// ProductVariableConfigurationAxis returns an axis for the given product variable // ProductVariableConfigurationAxis returns an axis for the given product variable

View File

@@ -426,7 +426,7 @@ func (la *LabelAttribute) SetSelectValue(axis ConfigurationAxis, config string,
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
la.Value = &value la.Value = &value
case arch, os, osArch, productVariables, osAndInApex: case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
if la.ConfigurableValues == nil { if la.ConfigurableValues == nil {
la.ConfigurableValues = make(configurableLabels) la.ConfigurableValues = make(configurableLabels)
} }
@@ -442,7 +442,7 @@ func (la *LabelAttribute) SelectValue(axis ConfigurationAxis, config string) *La
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
return la.Value return la.Value
case arch, os, osArch, productVariables, osAndInApex: case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
return la.ConfigurableValues[axis][config] return la.ConfigurableValues[axis][config]
default: default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis)) panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
@@ -512,7 +512,7 @@ func (ba *BoolAttribute) SetSelectValue(axis ConfigurationAxis, config string, v
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
ba.Value = value ba.Value = value
case arch, os, osArch, productVariables, osAndInApex: case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
if ba.ConfigurableValues == nil { if ba.ConfigurableValues == nil {
ba.ConfigurableValues = make(configurableBools) ba.ConfigurableValues = make(configurableBools)
} }
@@ -659,7 +659,7 @@ func (ba BoolAttribute) SelectValue(axis ConfigurationAxis, config string) *bool
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
return ba.Value return ba.Value
case arch, os, osArch, productVariables, osAndInApex: case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
if v, ok := ba.ConfigurableValues[axis][config]; ok { if v, ok := ba.ConfigurableValues[axis][config]; ok {
return &v return &v
} else { } else {
@@ -794,7 +794,7 @@ func (lla *LabelListAttribute) SetSelectValue(axis ConfigurationAxis, config str
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
lla.Value = list lla.Value = list
case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled: case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled, sanitizersEnabled:
if lla.ConfigurableValues == nil { if lla.ConfigurableValues == nil {
lla.ConfigurableValues = make(configurableLabelLists) lla.ConfigurableValues = make(configurableLabelLists)
} }
@@ -810,7 +810,7 @@ func (lla *LabelListAttribute) SelectValue(axis ConfigurationAxis, config string
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
return lla.Value return lla.Value
case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled: case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled, sanitizersEnabled:
return lla.ConfigurableValues[axis][config] return lla.ConfigurableValues[axis][config]
default: default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis)) panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
@@ -1168,7 +1168,7 @@ func (sa *StringAttribute) SetSelectValue(axis ConfigurationAxis, config string,
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
sa.Value = str sa.Value = str
case arch, os, osArch, productVariables: case arch, os, osArch, productVariables, sanitizersEnabled:
if sa.ConfigurableValues == nil { if sa.ConfigurableValues == nil {
sa.ConfigurableValues = make(configurableStrings) sa.ConfigurableValues = make(configurableStrings)
} }
@@ -1184,7 +1184,7 @@ func (sa *StringAttribute) SelectValue(axis ConfigurationAxis, config string) *s
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
return sa.Value return sa.Value
case arch, os, osArch, productVariables: case arch, os, osArch, productVariables, sanitizersEnabled:
if v, ok := sa.ConfigurableValues[axis][config]; ok { if v, ok := sa.ConfigurableValues[axis][config]; ok {
return v return v
} else { } else {
@@ -1374,7 +1374,7 @@ func (sla *StringListAttribute) SetSelectValue(axis ConfigurationAxis, config st
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
sla.Value = list sla.Value = list
case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled: case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled, sanitizersEnabled:
if sla.ConfigurableValues == nil { if sla.ConfigurableValues == nil {
sla.ConfigurableValues = make(configurableStringLists) sla.ConfigurableValues = make(configurableStringLists)
} }
@@ -1390,7 +1390,7 @@ func (sla *StringListAttribute) SelectValue(axis ConfigurationAxis, config strin
switch axis.configurationType { switch axis.configurationType {
case noConfig: case noConfig:
return sla.Value return sla.Value
case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled: case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled, sanitizersEnabled:
return sla.ConfigurableValues[axis][config] return sla.ConfigurableValues[axis][config]
default: default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis)) panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))

View File

@@ -880,8 +880,15 @@ func TestCcBinaryWithSanitizerBlocklist(t *testing.T) {
}`, }`,
targets: []testBazelTarget{ targets: []testBazelTarget{
{"cc_binary", "foo", AttrNameToString{ {"cc_binary", "foo", AttrNameToString{
"copts": `select({
"//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
"//conditions:default": [],
})`,
"additional_compiler_inputs": `select({
"//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
"//conditions:default": [],
})`,
"local_includes": `["."]`, "local_includes": `["."]`,
"features": `["sanitizer_blocklist_foo_blocklist_txt"]`,
}}, }},
}, },
}) })

View File

@@ -4206,11 +4206,25 @@ cc_library {
`, `,
ExpectedBazelTargets: []string{ ExpectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{ MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
"features": `["sanitizer_blocklist_foo_blocklist_txt"]`, "copts": `select({
"//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
"//conditions:default": [],
})`,
"additional_compiler_inputs": `select({
"//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
"//conditions:default": [],
})`,
"local_includes": `["."]`, "local_includes": `["."]`,
}), }),
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
"features": `["sanitizer_blocklist_foo_blocklist_txt"]`, "copts": `select({
"//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
"//conditions:default": [],
})`,
"additional_compiler_inputs": `select({
"//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
"//conditions:default": [],
})`,
"local_includes": `["."]`, "local_includes": `["."]`,
}), }),
}, },

View File

@@ -1225,7 +1225,14 @@ cc_library_shared {
`, `,
ExpectedBazelTargets: []string{ ExpectedBazelTargets: []string{
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
"features": `["sanitizer_blocklist_foo_blocklist_txt"]`, "copts": `select({
"//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
"//conditions:default": [],
})`,
"additional_compiler_inputs": `select({
"//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
"//conditions:default": [],
})`,
"local_includes": `["."]`, "local_includes": `["."]`,
}), }),
}, },

View File

@@ -1950,7 +1950,14 @@ cc_library_static {
`, `,
ExpectedBazelTargets: []string{ ExpectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
"features": `["sanitizer_blocklist_foo_blocklist_txt"]`, "copts": `select({
"//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
"//conditions:default": [],
})`,
"additional_compiler_inputs": `select({
"//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
"//conditions:default": [],
})`,
"local_includes": `["."]`, "local_includes": `["."]`,
}), }),
}, },

View File

@@ -639,6 +639,7 @@ func binaryBp2buildAttrs(ctx android.TopDownMutatorContext, m *Module) binaryAtt
Cpp_std: baseAttrs.cppStd, Cpp_std: baseAttrs.cppStd,
Additional_linker_inputs: baseAttrs.additionalLinkerInputs, Additional_linker_inputs: baseAttrs.additionalLinkerInputs,
Additional_compiler_inputs: baseAttrs.additionalCompilerInputs,
Strip: stripAttributes{ Strip: stripAttributes{
Keep_symbols: baseAttrs.stripKeepSymbols, Keep_symbols: baseAttrs.stripKeepSymbols,
@@ -684,6 +685,7 @@ type binaryAttributes struct {
Cppflags bazel.StringListAttribute Cppflags bazel.StringListAttribute
Conlyflags bazel.StringListAttribute Conlyflags bazel.StringListAttribute
Asflags bazel.StringListAttribute Asflags bazel.StringListAttribute
Additional_compiler_inputs bazel.LabelListAttribute
Deps bazel.LabelListAttribute Deps bazel.LabelListAttribute
Dynamic_deps bazel.LabelListAttribute Dynamic_deps bazel.LabelListAttribute

View File

@@ -65,6 +65,8 @@ type staticOrSharedAttributes struct {
Hdrs bazel.LabelListAttribute Hdrs bazel.LabelListAttribute
Copts bazel.StringListAttribute Copts bazel.StringListAttribute
Additional_compiler_inputs bazel.LabelListAttribute
Deps bazel.LabelListAttribute Deps bazel.LabelListAttribute
Implementation_deps bazel.LabelListAttribute Implementation_deps bazel.LabelListAttribute
Dynamic_deps bazel.LabelListAttribute Dynamic_deps bazel.LabelListAttribute
@@ -508,6 +510,8 @@ type compilerAttributes struct {
suffix bazel.StringAttribute suffix bazel.StringAttribute
fdoProfile bazel.LabelAttribute fdoProfile bazel.LabelAttribute
additionalCompilerInputs bazel.LabelListAttribute
} }
type filterOutFn func(string) bool type filterOutFn func(string) bool
@@ -1016,11 +1020,16 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
(&compilerAttrs).localIncludes.Append(rsLocalIncludes) (&compilerAttrs).localIncludes.Append(rsLocalIncludes)
(&compilerAttrs).localIncludes.Value = android.FirstUniqueStrings(compilerAttrs.localIncludes.Value) (&compilerAttrs).localIncludes.Value = android.FirstUniqueStrings(compilerAttrs.localIncludes.Value)
features := compilerAttrs.features.Clone().Append(linkerAttrs.features).Append(bp2buildSanitizerFeatures(ctx, module)) sanitizerValues := bp2buildSanitizerFeatures(ctx, module)
features := compilerAttrs.features.Clone().Append(linkerAttrs.features).Append(sanitizerValues.features)
features = features.Append(bp2buildLtoFeatures(ctx, module)) features = features.Append(bp2buildLtoFeatures(ctx, module))
features = features.Append(convertHiddenVisibilityToFeatureBase(ctx, module)) features = features.Append(convertHiddenVisibilityToFeatureBase(ctx, module))
features.DeduplicateAxesFromBase() features.DeduplicateAxesFromBase()
compilerAttrs.copts = *compilerAttrs.copts.Append(sanitizerValues.copts)
compilerAttrs.additionalCompilerInputs = *compilerAttrs.additionalCompilerInputs.Append(sanitizerValues.additionalCompilerInputs)
addMuslSystemDynamicDeps(ctx, linkerAttrs) addMuslSystemDynamicDeps(ctx, linkerAttrs)
return baseAttributes{ return baseAttributes{
@@ -1910,8 +1919,16 @@ func bp2buildBinaryLinkerProps(ctx android.BazelConversionPathContext, m *Module
return attrs return attrs
} }
func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute { type sanitizerValues struct {
features bazel.StringListAttribute
copts bazel.StringListAttribute
additionalCompilerInputs bazel.LabelListAttribute
}
func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module) sanitizerValues {
sanitizerFeatures := bazel.StringListAttribute{} sanitizerFeatures := bazel.StringListAttribute{}
sanitizerCopts := bazel.StringListAttribute{}
sanitizerCompilerInputs := bazel.LabelListAttribute{}
bp2BuildPropParseHelper(ctx, m, &SanitizeProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) { bp2BuildPropParseHelper(ctx, m, &SanitizeProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) {
var features []string var features []string
if sanitizerProps, ok := props.(*SanitizeProperties); ok { if sanitizerProps, ok := props.(*SanitizeProperties); ok {
@@ -1923,9 +1940,10 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module
} }
blocklist := sanitizerProps.Sanitize.Blocklist blocklist := sanitizerProps.Sanitize.Blocklist
if blocklist != nil { if blocklist != nil {
// Format the blocklist name to be used in a feature name // TODO: b/294868620 - Change this not to use the special axis when completing the bug
blocklistFeatureSuffix := strings.Replace(strings.ToLower(*blocklist), ".", "_", -1) coptValue := fmt.Sprintf("-fsanitize-ignorelist=$(location %s)", *blocklist)
features = append(features, "sanitizer_blocklist_"+blocklistFeatureSuffix) sanitizerCopts.SetSelectValue(bazel.SanitizersEnabledAxis, bazel.SanitizersEnabled, []string{coptValue})
sanitizerCompilerInputs.SetSelectValue(bazel.SanitizersEnabledAxis, bazel.SanitizersEnabled, bazel.MakeLabelListFromTargetNames([]string{*blocklist}))
} }
if sanitizerProps.Sanitize.Cfi != nil && !proptools.Bool(sanitizerProps.Sanitize.Cfi) { if sanitizerProps.Sanitize.Cfi != nil && !proptools.Bool(sanitizerProps.Sanitize.Cfi) {
features = append(features, "-android_cfi") features = append(features, "-android_cfi")
@@ -1938,7 +1956,11 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module
sanitizerFeatures.SetSelectValue(axis, config, features) sanitizerFeatures.SetSelectValue(axis, config, features)
} }
}) })
return sanitizerFeatures return sanitizerValues{
features: sanitizerFeatures,
copts: sanitizerCopts,
additionalCompilerInputs: sanitizerCompilerInputs,
}
} }
func bp2buildLtoFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute { func bp2buildLtoFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute {

View File

@@ -349,6 +349,7 @@ func libraryBp2Build(ctx android.TopDownMutatorContext, m *Module) {
Runtime_deps: linkerAttrs.runtimeDeps, Runtime_deps: linkerAttrs.runtimeDeps,
sdkAttributes: bp2BuildParseSdkAttributes(m), sdkAttributes: bp2BuildParseSdkAttributes(m),
Native_coverage: baseAttributes.Native_coverage, Native_coverage: baseAttributes.Native_coverage,
Additional_compiler_inputs: compilerAttrs.additionalCompilerInputs,
} }
includeAttrs := includesAttributes{ includeAttrs := includesAttributes{
@@ -376,6 +377,7 @@ func libraryBp2Build(ctx android.TopDownMutatorContext, m *Module) {
Runtime_deps: linkerAttrs.runtimeDeps, Runtime_deps: linkerAttrs.runtimeDeps,
sdkAttributes: bp2BuildParseSdkAttributes(m), sdkAttributes: bp2BuildParseSdkAttributes(m),
Native_coverage: baseAttributes.Native_coverage, Native_coverage: baseAttributes.Native_coverage,
Additional_compiler_inputs: compilerAttrs.additionalCompilerInputs,
} }
staticTargetAttrs := &bazelCcLibraryStaticAttributes{ staticTargetAttrs := &bazelCcLibraryStaticAttributes{
@@ -2962,6 +2964,7 @@ func sharedOrStaticLibraryBp2Build(ctx android.TopDownMutatorContext, module *Mo
sdkAttributes: bp2BuildParseSdkAttributes(module), sdkAttributes: bp2BuildParseSdkAttributes(module),
Runtime_deps: linkerAttrs.runtimeDeps, Runtime_deps: linkerAttrs.runtimeDeps,
Native_coverage: baseAttributes.Native_coverage, Native_coverage: baseAttributes.Native_coverage,
Additional_compiler_inputs: compilerAttrs.additionalCompilerInputs,
} }
module.convertTidyAttributes(ctx, &commonAttrs.tidyAttributes) module.convertTidyAttributes(ctx, &commonAttrs.tidyAttributes)