bp2build for sanitizer blocklists long term fix

Bug: 286872909
Test: Unit tests
Test: b build relevant targets
Change-Id: I553091f76fca936006651b1ed22c8fe4d176e18f
diff --git a/cc/binary.go b/cc/binary.go
index 5ba33a2..4606b62 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -638,7 +638,8 @@
 		Stl:               baseAttrs.stl,
 		Cpp_std:           baseAttrs.cppStd,
 
-		Additional_linker_inputs: baseAttrs.additionalLinkerInputs,
+		Additional_linker_inputs:   baseAttrs.additionalLinkerInputs,
+		Additional_compiler_inputs: baseAttrs.additionalCompilerInputs,
 
 		Strip: stripAttributes{
 			Keep_symbols:                 baseAttrs.stripKeepSymbols,
@@ -680,10 +681,11 @@
 	Srcs_c  bazel.LabelListAttribute
 	Srcs_as bazel.LabelListAttribute
 
-	Copts      bazel.StringListAttribute
-	Cppflags   bazel.StringListAttribute
-	Conlyflags bazel.StringListAttribute
-	Asflags    bazel.StringListAttribute
+	Copts                      bazel.StringListAttribute
+	Cppflags                   bazel.StringListAttribute
+	Conlyflags                 bazel.StringListAttribute
+	Asflags                    bazel.StringListAttribute
+	Additional_compiler_inputs bazel.LabelListAttribute
 
 	Deps               bazel.LabelListAttribute
 	Dynamic_deps       bazel.LabelListAttribute
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 9d90a5b..601c0c5 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -65,6 +65,8 @@
 	Hdrs      bazel.LabelListAttribute
 	Copts     bazel.StringListAttribute
 
+	Additional_compiler_inputs bazel.LabelListAttribute
+
 	Deps                              bazel.LabelListAttribute
 	Implementation_deps               bazel.LabelListAttribute
 	Dynamic_deps                      bazel.LabelListAttribute
@@ -508,6 +510,8 @@
 	suffix bazel.StringAttribute
 
 	fdoProfile bazel.LabelAttribute
+
+	additionalCompilerInputs bazel.LabelListAttribute
 }
 
 type filterOutFn func(string) bool
@@ -1016,11 +1020,16 @@
 	(&compilerAttrs).localIncludes.Append(rsLocalIncludes)
 	(&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(convertHiddenVisibilityToFeatureBase(ctx, module))
 	features.DeduplicateAxesFromBase()
 
+	compilerAttrs.copts = *compilerAttrs.copts.Append(sanitizerValues.copts)
+	compilerAttrs.additionalCompilerInputs = *compilerAttrs.additionalCompilerInputs.Append(sanitizerValues.additionalCompilerInputs)
+
 	addMuslSystemDynamicDeps(ctx, linkerAttrs)
 
 	return baseAttributes{
@@ -1910,8 +1919,16 @@
 	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{}
+	sanitizerCopts := bazel.StringListAttribute{}
+	sanitizerCompilerInputs := bazel.LabelListAttribute{}
 	bp2BuildPropParseHelper(ctx, m, &SanitizeProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) {
 		var features []string
 		if sanitizerProps, ok := props.(*SanitizeProperties); ok {
@@ -1923,9 +1940,10 @@
 			}
 			blocklist := sanitizerProps.Sanitize.Blocklist
 			if blocklist != nil {
-				// Format the blocklist name to be used in a feature name
-				blocklistFeatureSuffix := strings.Replace(strings.ToLower(*blocklist), ".", "_", -1)
-				features = append(features, "sanitizer_blocklist_"+blocklistFeatureSuffix)
+				// TODO: b/294868620 - Change this not to use the special axis when completing the bug
+				coptValue := fmt.Sprintf("-fsanitize-ignorelist=$(location %s)", *blocklist)
+				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) {
 				features = append(features, "-android_cfi")
@@ -1938,7 +1956,11 @@
 			sanitizerFeatures.SetSelectValue(axis, config, features)
 		}
 	})
-	return sanitizerFeatures
+	return sanitizerValues{
+		features:                 sanitizerFeatures,
+		copts:                    sanitizerCopts,
+		additionalCompilerInputs: sanitizerCompilerInputs,
+	}
 }
 
 func bp2buildLtoFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute {
diff --git a/cc/library.go b/cc/library.go
index df1dbc5..2d4d604 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -349,6 +349,7 @@
 		Runtime_deps:                      linkerAttrs.runtimeDeps,
 		sdkAttributes:                     bp2BuildParseSdkAttributes(m),
 		Native_coverage:                   baseAttributes.Native_coverage,
+		Additional_compiler_inputs:        compilerAttrs.additionalCompilerInputs,
 	}
 
 	includeAttrs := includesAttributes{
@@ -376,6 +377,7 @@
 		Runtime_deps:                      linkerAttrs.runtimeDeps,
 		sdkAttributes:                     bp2BuildParseSdkAttributes(m),
 		Native_coverage:                   baseAttributes.Native_coverage,
+		Additional_compiler_inputs:        compilerAttrs.additionalCompilerInputs,
 	}
 
 	staticTargetAttrs := &bazelCcLibraryStaticAttributes{
@@ -2962,6 +2964,7 @@
 		sdkAttributes:                     bp2BuildParseSdkAttributes(module),
 		Runtime_deps:                      linkerAttrs.runtimeDeps,
 		Native_coverage:                   baseAttributes.Native_coverage,
+		Additional_compiler_inputs:        compilerAttrs.additionalCompilerInputs,
 	}
 
 	module.convertTidyAttributes(ctx, &commonAttrs.tidyAttributes)