Support memtag sanitizer.
Bug: 295173102 Test: local unit tests Change-Id: Ib8cd82cd3989d9c120255e149473d8ec00f100f5
This commit is contained in:
parent
5b6d1d87d6
commit
7ece4aae36
4 changed files with 272 additions and 3 deletions
|
@ -39,7 +39,7 @@ const (
|
|||
|
||||
// Targets in arch.go
|
||||
osArchAndroidArm = "android_arm"
|
||||
osArchAndroidArm64 = "android_arm64"
|
||||
OsArchAndroidArm64 = "android_arm64"
|
||||
osArchAndroidRiscv64 = "android_riscv64"
|
||||
osArchAndroidX86 = "android_x86"
|
||||
osArchAndroidX86_64 = "android_x86_64"
|
||||
|
@ -170,7 +170,7 @@ var (
|
|||
|
||||
platformOsArchMap = map[string]string{
|
||||
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",
|
||||
osArchAndroidX86: "//build/bazel/platforms/os_arch:android_x86",
|
||||
osArchAndroidX86_64: "//build/bazel/platforms/os_arch:android_x86_64",
|
||||
|
|
|
@ -139,6 +139,13 @@ cc_test_library {
|
|||
"host_without_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",
|
||||
"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",
|
||||
"device",
|
||||
]`,
|
||||
"features": `select({
|
||||
"//build/bazel/platforms/os_arch:android_arm64": [
|
||||
"memtag_heap",
|
||||
"diag_memtag_heap",
|
||||
],
|
||||
"//conditions:default": [],
|
||||
})`,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -228,6 +249,13 @@ cc_test {
|
|||
":libgtest",
|
||||
]`,
|
||||
"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",
|
||||
]`,
|
||||
"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"]`,
|
||||
"dynamic_deps": `[":liblog"]`,
|
||||
"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",
|
||||
]`,
|
||||
"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"]`,
|
||||
"dynamic_deps": `[":liblog"]`,
|
||||
"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",
|
||||
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||
"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{
|
||||
|
@ -388,6 +451,166 @@ cc_test {
|
|||
"gtest": "False",
|
||||
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||
"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
|
||||
}
|
||||
|
||||
// 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 {
|
||||
archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{})
|
||||
archVariantLinkerProps := module.GetArchVariantProperties(ctx, &BaseLinkerProperties{})
|
||||
|
@ -1936,6 +1936,8 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module
|
|||
sanitizerFeatures := bazel.StringListAttribute{}
|
||||
sanitizerCopts := bazel.StringListAttribute{}
|
||||
sanitizerCompilerInputs := bazel.LabelListAttribute{}
|
||||
memtagFeatures := bazel.StringListAttribute{}
|
||||
memtagFeature := ""
|
||||
bp2BuildPropParseHelper(ctx, m, &SanitizeProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) {
|
||||
var features []string
|
||||
if sanitizerProps, ok := props.(*SanitizeProperties); ok {
|
||||
|
@ -1960,9 +1962,18 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module
|
|||
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.Append(memtagFeatures)
|
||||
|
||||
return sanitizerValues{
|
||||
features: sanitizerFeatures,
|
||||
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 {
|
||||
lto_feature_name := "android_thin_lto"
|
||||
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)
|
||||
|
||||
testBinary := m.linker.(*testBinary)
|
||||
|
|
Loading…
Reference in a new issue