Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 698c8f63 authored by Yu Liu's avatar Yu Liu Committed by Gerrit Code Review
Browse files

Merge "Support memtag sanitizer." into main

parents f236cd92 7ece4aae
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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",
+223 −0
Original line number Diff line number Diff line
@@ -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": [],
    })`,
			},
			},
		},
+32 −1
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
@@ -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)