Support memtag sanitizer.
Bug: 295173102 Test: local unit tests Change-Id: Ib8cd82cd3989d9c120255e149473d8ec00f100f5
This commit is contained in:
@@ -39,7 +39,7 @@ const (
|
|||||||
|
|
||||||
// Targets in arch.go
|
// Targets in arch.go
|
||||||
osArchAndroidArm = "android_arm"
|
osArchAndroidArm = "android_arm"
|
||||||
osArchAndroidArm64 = "android_arm64"
|
OsArchAndroidArm64 = "android_arm64"
|
||||||
osArchAndroidRiscv64 = "android_riscv64"
|
osArchAndroidRiscv64 = "android_riscv64"
|
||||||
osArchAndroidX86 = "android_x86"
|
osArchAndroidX86 = "android_x86"
|
||||||
osArchAndroidX86_64 = "android_x86_64"
|
osArchAndroidX86_64 = "android_x86_64"
|
||||||
@@ -170,7 +170,7 @@ var (
|
|||||||
|
|
||||||
platformOsArchMap = map[string]string{
|
platformOsArchMap = map[string]string{
|
||||||
osArchAndroidArm: "//build/bazel/platforms/os_arch:android_arm",
|
osArchAndroidArm: "//build/bazel/platforms/os_arch:android_arm",
|
||||||
osArchAndroidArm64: "//build/bazel/platforms/os_arch:android_arm64",
|
OsArchAndroidArm64: "//build/bazel/platforms/os_arch:android_arm64",
|
||||||
osArchAndroidRiscv64: "//build/bazel/platforms/os_arch:android_riscv64",
|
osArchAndroidRiscv64: "//build/bazel/platforms/os_arch:android_riscv64",
|
||||||
osArchAndroidX86: "//build/bazel/platforms/os_arch:android_x86",
|
osArchAndroidX86: "//build/bazel/platforms/os_arch:android_x86",
|
||||||
osArchAndroidX86_64: "//build/bazel/platforms/os_arch:android_x86_64",
|
osArchAndroidX86_64: "//build/bazel/platforms/os_arch:android_x86_64",
|
||||||
|
@@ -139,6 +139,13 @@ cc_test_library {
|
|||||||
"host_without_device",
|
"host_without_device",
|
||||||
"device",
|
"device",
|
||||||
]`,
|
]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -166,6 +173,13 @@ cc_test {
|
|||||||
"host_without_device",
|
"host_without_device",
|
||||||
"device",
|
"device",
|
||||||
]`,
|
]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -197,6 +211,13 @@ cc_test {
|
|||||||
"host_without_device",
|
"host_without_device",
|
||||||
"device",
|
"device",
|
||||||
]`,
|
]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -228,6 +249,13 @@ cc_test {
|
|||||||
":libgtest",
|
":libgtest",
|
||||||
]`,
|
]`,
|
||||||
"runs_on": `["device"]`,
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -260,6 +288,13 @@ cc_test {
|
|||||||
":libgtest",
|
":libgtest",
|
||||||
]`,
|
]`,
|
||||||
"runs_on": `["device"]`,
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -297,6 +332,13 @@ cc_test {
|
|||||||
"deps": `[":libgtest_isolated_main"]`,
|
"deps": `[":libgtest_isolated_main"]`,
|
||||||
"dynamic_deps": `[":liblog"]`,
|
"dynamic_deps": `[":liblog"]`,
|
||||||
"runs_on": `["device"]`,
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -324,6 +366,13 @@ cc_test {
|
|||||||
":libgtest_main",
|
":libgtest_main",
|
||||||
]`,
|
]`,
|
||||||
"runs_on": `["device"]`,
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -350,6 +399,13 @@ cc_test {
|
|||||||
"deps": `[":libgtest_isolated_main"]`,
|
"deps": `[":libgtest_isolated_main"]`,
|
||||||
"dynamic_deps": `[":liblog"]`,
|
"dynamic_deps": `[":liblog"]`,
|
||||||
"runs_on": `["device"]`,
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -381,6 +437,13 @@ cc_test {
|
|||||||
"gtest": "True",
|
"gtest": "True",
|
||||||
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||||
"runs_on": `["device"]`,
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{"cc_test", "mytest_with_no_gtest", AttrNameToString{
|
{"cc_test", "mytest_with_no_gtest", AttrNameToString{
|
||||||
@@ -388,6 +451,166 @@ cc_test {
|
|||||||
"gtest": "False",
|
"gtest": "False",
|
||||||
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||||
"runs_on": `["device"]`,
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCcTest_DisableMemtagHeap(t *testing.T) {
|
||||||
|
runCcTestTestCase(t, ccTestBp2buildTestCase{
|
||||||
|
description: "cc test that disable memtag_heap",
|
||||||
|
blueprint: `
|
||||||
|
cc_test {
|
||||||
|
name: "mytest",
|
||||||
|
srcs: ["test.cpp"],
|
||||||
|
isolated: true,
|
||||||
|
sanitize: {
|
||||||
|
cfi: true,
|
||||||
|
memtag_heap: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
` + simpleModuleDoNotConvertBp2build("cc_library_static", "libgtest_isolated_main") +
|
||||||
|
simpleModuleDoNotConvertBp2build("cc_library", "liblog"),
|
||||||
|
targets: []testBazelTarget{
|
||||||
|
{"cc_test", "mytest", AttrNameToString{
|
||||||
|
"local_includes": `["."]`,
|
||||||
|
"srcs": `["test.cpp"]`,
|
||||||
|
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||||
|
"deps": `[":libgtest_isolated_main"]`,
|
||||||
|
"dynamic_deps": `[":liblog"]`,
|
||||||
|
"runs_on": `["device"]`,
|
||||||
|
"features": `["android_cfi"] + select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": ["-memtag_heap"],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCcTest_RespectArm64MemtagHeap(t *testing.T) {
|
||||||
|
runCcTestTestCase(t, ccTestBp2buildTestCase{
|
||||||
|
description: "cc test that disable memtag_heap",
|
||||||
|
blueprint: `
|
||||||
|
cc_test {
|
||||||
|
name: "mytest",
|
||||||
|
srcs: ["test.cpp"],
|
||||||
|
isolated: true,
|
||||||
|
target: {
|
||||||
|
android_arm64: {
|
||||||
|
sanitize: {
|
||||||
|
memtag_heap: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
` + simpleModuleDoNotConvertBp2build("cc_library_static", "libgtest_isolated_main") +
|
||||||
|
simpleModuleDoNotConvertBp2build("cc_library", "liblog"),
|
||||||
|
targets: []testBazelTarget{
|
||||||
|
{"cc_test", "mytest", AttrNameToString{
|
||||||
|
"local_includes": `["."]`,
|
||||||
|
"srcs": `["test.cpp"]`,
|
||||||
|
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||||
|
"deps": `[":libgtest_isolated_main"]`,
|
||||||
|
"dynamic_deps": `[":liblog"]`,
|
||||||
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": ["-memtag_heap"],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCcTest_IgnoreNoneArm64MemtagHeap(t *testing.T) {
|
||||||
|
runCcTestTestCase(t, ccTestBp2buildTestCase{
|
||||||
|
description: "cc test that disable memtag_heap",
|
||||||
|
blueprint: `
|
||||||
|
cc_test {
|
||||||
|
name: "mytest",
|
||||||
|
srcs: ["test.cpp"],
|
||||||
|
isolated: true,
|
||||||
|
arch: {
|
||||||
|
x86: {
|
||||||
|
sanitize: {
|
||||||
|
memtag_heap: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
` + simpleModuleDoNotConvertBp2build("cc_library_static", "libgtest_isolated_main") +
|
||||||
|
simpleModuleDoNotConvertBp2build("cc_library", "liblog"),
|
||||||
|
targets: []testBazelTarget{
|
||||||
|
{"cc_test", "mytest", AttrNameToString{
|
||||||
|
"local_includes": `["."]`,
|
||||||
|
"srcs": `["test.cpp"]`,
|
||||||
|
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||||
|
"deps": `[":libgtest_isolated_main"]`,
|
||||||
|
"dynamic_deps": `[":liblog"]`,
|
||||||
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"memtag_heap",
|
||||||
|
"diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCcTest_Arm64MemtagHeapOverrideNoConfigOne(t *testing.T) {
|
||||||
|
runCcTestTestCase(t, ccTestBp2buildTestCase{
|
||||||
|
description: "cc test that disable memtag_heap",
|
||||||
|
blueprint: `
|
||||||
|
cc_test {
|
||||||
|
name: "mytest",
|
||||||
|
srcs: ["test.cpp"],
|
||||||
|
isolated: true,
|
||||||
|
sanitize: {
|
||||||
|
memtag_heap: true,
|
||||||
|
},
|
||||||
|
target: {
|
||||||
|
android_arm64: {
|
||||||
|
sanitize: {
|
||||||
|
memtag_heap: false,
|
||||||
|
diag: {
|
||||||
|
memtag_heap: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
` + simpleModuleDoNotConvertBp2build("cc_library_static", "libgtest_isolated_main") +
|
||||||
|
simpleModuleDoNotConvertBp2build("cc_library", "liblog"),
|
||||||
|
targets: []testBazelTarget{
|
||||||
|
{"cc_test", "mytest", AttrNameToString{
|
||||||
|
"local_includes": `["."]`,
|
||||||
|
"srcs": `["test.cpp"]`,
|
||||||
|
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||||
|
"deps": `[":libgtest_isolated_main"]`,
|
||||||
|
"dynamic_deps": `[":liblog"]`,
|
||||||
|
"runs_on": `["device"]`,
|
||||||
|
"features": `select({
|
||||||
|
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||||
|
"-memtag_heap",
|
||||||
|
"-diag_memtag_heap",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
})`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@@ -851,7 +851,7 @@ func bp2BuildYasm(ctx android.Bp2buildMutatorContext, m *Module, ca compilerAttr
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// bp2BuildParseBaseProps returns all compiler, linker, library attributes of a cc module..
|
// bp2BuildParseBaseProps returns all compiler, linker, library attributes of a cc module.
|
||||||
func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) baseAttributes {
|
func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) baseAttributes {
|
||||||
archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{})
|
archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{})
|
||||||
archVariantLinkerProps := module.GetArchVariantProperties(ctx, &BaseLinkerProperties{})
|
archVariantLinkerProps := module.GetArchVariantProperties(ctx, &BaseLinkerProperties{})
|
||||||
@@ -1936,6 +1936,8 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module
|
|||||||
sanitizerFeatures := bazel.StringListAttribute{}
|
sanitizerFeatures := bazel.StringListAttribute{}
|
||||||
sanitizerCopts := bazel.StringListAttribute{}
|
sanitizerCopts := bazel.StringListAttribute{}
|
||||||
sanitizerCompilerInputs := bazel.LabelListAttribute{}
|
sanitizerCompilerInputs := bazel.LabelListAttribute{}
|
||||||
|
memtagFeatures := bazel.StringListAttribute{}
|
||||||
|
memtagFeature := ""
|
||||||
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 {
|
||||||
@@ -1960,9 +1962,18 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module
|
|||||||
features = append(features, "android_cfi_assembly_support")
|
features = append(features, "android_cfi_assembly_support")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if sanitizerProps.Sanitize.Memtag_heap != nil {
|
||||||
|
if (axis == bazel.NoConfigAxis && memtagFeature == "") ||
|
||||||
|
(axis == bazel.OsArchConfigurationAxis && config == bazel.OsArchAndroidArm64) {
|
||||||
|
memtagFeature = setMemtagValue(sanitizerProps, &memtagFeatures)
|
||||||
|
}
|
||||||
|
}
|
||||||
sanitizerFeatures.SetSelectValue(axis, config, features)
|
sanitizerFeatures.SetSelectValue(axis, config, features)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
sanitizerFeatures.Append(memtagFeatures)
|
||||||
|
|
||||||
return sanitizerValues{
|
return sanitizerValues{
|
||||||
features: sanitizerFeatures,
|
features: sanitizerFeatures,
|
||||||
copts: sanitizerCopts,
|
copts: sanitizerCopts,
|
||||||
@@ -1970,6 +1981,26 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setMemtagValue(sanitizerProps *SanitizeProperties, memtagFeatures *bazel.StringListAttribute) string {
|
||||||
|
var features []string
|
||||||
|
if proptools.Bool(sanitizerProps.Sanitize.Memtag_heap) {
|
||||||
|
features = append(features, "memtag_heap")
|
||||||
|
} else {
|
||||||
|
features = append(features, "-memtag_heap")
|
||||||
|
}
|
||||||
|
// Logic comes from: https://cs.android.com/android/platform/superproject/main/+/32ea1afbd1148b0b78553f24fa61116c999eb968:build/soong/cc/sanitize.go;l=910
|
||||||
|
if sanitizerProps.Sanitize.Diag.Memtag_heap != nil {
|
||||||
|
if proptools.Bool(sanitizerProps.Sanitize.Diag.Memtag_heap) {
|
||||||
|
features = append(features, "diag_memtag_heap")
|
||||||
|
} else {
|
||||||
|
features = append(features, "-diag_memtag_heap")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memtagFeatures.SetSelectValue(bazel.OsArchConfigurationAxis, bazel.OsArchAndroidArm64, features)
|
||||||
|
|
||||||
|
return features[0]
|
||||||
|
}
|
||||||
|
|
||||||
func bp2buildLtoFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute {
|
func bp2buildLtoFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute {
|
||||||
lto_feature_name := "android_thin_lto"
|
lto_feature_name := "android_thin_lto"
|
||||||
ltoBoolFeatures := bazel.BoolAttribute{}
|
ltoBoolFeatures := bazel.BoolAttribute{}
|
||||||
|
15
cc/test.go
15
cc/test.go
@@ -720,6 +720,21 @@ func testBinaryBp2build(ctx android.TopDownMutatorContext, m *Module) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The logic comes from https://cs.android.com/android/platform/superproject/main/+/0df8153267f96da877febc5332240fa06ceb8533:build/soong/cc/sanitize.go;l=488
|
||||||
|
var features bazel.StringListAttribute
|
||||||
|
curFeatures := testBinaryAttrs.binaryAttributes.Features.SelectValue(bazel.OsArchConfigurationAxis, bazel.OsArchAndroidArm64)
|
||||||
|
var newFeatures []string
|
||||||
|
if !android.InList("memtag_heap", curFeatures) && !android.InList("-memtag_heap", curFeatures) {
|
||||||
|
newFeatures = append(newFeatures, "memtag_heap")
|
||||||
|
if !android.InList("diag_memtag_heap", curFeatures) && !android.InList("-diag_memtag_heap", curFeatures) {
|
||||||
|
newFeatures = append(newFeatures, "diag_memtag_heap")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
features.SetSelectValue(bazel.OsArchConfigurationAxis, bazel.OsArchAndroidArm64, newFeatures)
|
||||||
|
testBinaryAttrs.binaryAttributes.Features.Append(features)
|
||||||
|
testBinaryAttrs.binaryAttributes.Features.DeduplicateAxesFromBase()
|
||||||
|
|
||||||
m.convertTidyAttributes(ctx, &testBinaryAttrs.tidyAttributes)
|
m.convertTidyAttributes(ctx, &testBinaryAttrs.tidyAttributes)
|
||||||
|
|
||||||
testBinary := m.linker.(*testBinary)
|
testBinary := m.linker.(*testBinary)
|
||||||
|
Reference in New Issue
Block a user