diff --git a/bp2build/cc_binary_conversion_test.go b/bp2build/cc_binary_conversion_test.go index 8a83cc0d5..610a9ca58 100644 --- a/bp2build/cc_binary_conversion_test.go +++ b/bp2build/cc_binary_conversion_test.go @@ -1036,3 +1036,73 @@ func TestCcBinaryHiddenVisibilityConvertedToFeatureOsSpecific(t *testing.T) { }, }) } + +func TestCcBinaryWithCfi(t *testing.T) { + runCcBinaryTestCase(t, ccBinaryBp2buildTestCase{ + description: "cc_binary has correct features when cfi is enabled", + blueprint: ` +{rule_name} { + name: "foo", + sanitize: { + cfi: true, + }, +}`, + targets: []testBazelTarget{ + {"cc_binary", "foo", AttrNameToString{ + "features": `["android_cfi"]`, + "local_includes": `["."]`, + }}, + }, + }) +} + +func TestCcBinaryWithCfiOsSpecific(t *testing.T) { + runCcBinaryTestCase(t, ccBinaryBp2buildTestCase{ + description: "cc_binary has correct features when cfi is enabled for specific variants", + blueprint: ` +{rule_name} { + name: "foo", + target: { + android: { + sanitize: { + cfi: true, + }, + }, + }, +}`, + targets: []testBazelTarget{ + {"cc_binary", "foo", AttrNameToString{ + "features": `select({ + "//build/bazel/platforms/os:android": ["android_cfi"], + "//conditions:default": [], + })`, + "local_includes": `["."]`, + }}, + }, + }) +} + +func TestCcBinaryWithCfiAndCfiAssemblySupport(t *testing.T) { + runCcBinaryTestCase(t, ccBinaryBp2buildTestCase{ + description: "cc_binary has correct features when cfi is enabled with cfi assembly support", + blueprint: ` +{rule_name} { + name: "foo", + sanitize: { + cfi: true, + config: { + cfi_assembly_support: true, + }, + }, +}`, + targets: []testBazelTarget{ + {"cc_binary", "foo", AttrNameToString{ + "features": `[ + "android_cfi", + "android_cfi_assembly_support", + ]`, + "local_includes": `["."]`, + }}, + }, + }) +} diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 3dd937319..c2dba67a5 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -4718,3 +4718,97 @@ func TestCcLibraryHostLdLibs(t *testing.T) { }, }) } + +func TestCcLibraryWithCfi(t *testing.T) { + runCcLibraryTestCase(t, Bp2buildTestCase{ + Description: "cc_library has correct features when cfi is enabled", + ModuleTypeUnderTest: "cc_library", + ModuleTypeUnderTestFactory: cc.LibraryFactory, + Blueprint: ` +cc_library { + name: "foo", + sanitize: { + cfi: true, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{ + "features": `["android_cfi"]`, + "local_includes": `["."]`, + }), + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "features": `["android_cfi"]`, + "local_includes": `["."]`, + }), + }, + }) +} + +func TestCcLibraryWithCfiOsSpecific(t *testing.T) { + runCcLibraryTestCase(t, Bp2buildTestCase{ + Description: "cc_library has correct features when cfi is enabled for specific variants", + ModuleTypeUnderTest: "cc_library", + ModuleTypeUnderTestFactory: cc.LibraryFactory, + Blueprint: ` +cc_library { + name: "foo", + target: { + android: { + sanitize: { + cfi: true, + }, + }, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{ + "features": `select({ + "//build/bazel/platforms/os:android": ["android_cfi"], + "//conditions:default": [], + })`, + "local_includes": `["."]`, + }), + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "features": `select({ + "//build/bazel/platforms/os:android": ["android_cfi"], + "//conditions:default": [], + })`, + "local_includes": `["."]`, + }), + }, + }) +} + +func TestCcLibraryWithCfiAndCfiAssemblySupport(t *testing.T) { + runCcLibraryTestCase(t, Bp2buildTestCase{ + Description: "cc_library has correct features when cfi is enabled with cfi_assembly_support", + ModuleTypeUnderTest: "cc_library", + ModuleTypeUnderTestFactory: cc.LibraryFactory, + Blueprint: ` +cc_library { + name: "foo", + sanitize: { + cfi: true, + config: { + cfi_assembly_support: true, + }, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{ + "features": `[ + "android_cfi", + "android_cfi_assembly_support", + ]`, + "local_includes": `["."]`, + }), + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "features": `[ + "android_cfi", + "android_cfi_assembly_support", + ]`, + "local_includes": `["."]`, + }), + }, + }) +} diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go index 6c9f9a18f..7f0ba4477 100644 --- a/bp2build/cc_library_shared_conversion_test.go +++ b/bp2build/cc_library_shared_conversion_test.go @@ -1445,3 +1445,73 @@ cc_library_shared { }, }) } + +func TestCcLibrarySharedWithCfi(t *testing.T) { + runCcLibrarySharedTestCase(t, Bp2buildTestCase{ + Description: "cc_library_shared has correct features when cfi is enabled for specific variants", + Blueprint: ` +cc_library_shared { + name: "foo", + sanitize: { + cfi: true, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "features": `["android_cfi"]`, + "local_includes": `["."]`, + }), + }, + }) +} + +func TestCcLibrarySharedWithCfiOsSpecific(t *testing.T) { + runCcLibrarySharedTestCase(t, Bp2buildTestCase{ + Description: "cc_library_shared has correct features when cfi is enabled", + Blueprint: ` +cc_library_shared { + name: "foo", + target: { + android: { + sanitize: { + cfi: true, + }, + }, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "features": `select({ + "//build/bazel/platforms/os:android": ["android_cfi"], + "//conditions:default": [], + })`, + "local_includes": `["."]`, + }), + }, + }) +} + +func TestCcLibrarySharedWithCfiAndCfiAssemblySupport(t *testing.T) { + runCcLibrarySharedTestCase(t, Bp2buildTestCase{ + Description: "cc_library_shared has correct features when cfi is enabled with cfi assembly support", + Blueprint: ` +cc_library_static { + name: "foo", + sanitize: { + cfi: true, + config: { + cfi_assembly_support: true, + }, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "features": `[ + "android_cfi", + "android_cfi_assembly_support", + ]`, + "local_includes": `["."]`, + }), + }, + }) +} diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go index 2705aafe5..f5378718f 100644 --- a/bp2build/cc_library_static_conversion_test.go +++ b/bp2build/cc_library_static_conversion_test.go @@ -2075,3 +2075,73 @@ cc_library_static { }, }) } + +func TestCcLibraryStaticWithCfi(t *testing.T) { + runCcLibraryStaticTestCase(t, Bp2buildTestCase{ + Description: "cc_library_static has correct features when cfi is enabled", + Blueprint: ` +cc_library_static { + name: "foo", + sanitize: { + cfi: true, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "features": `["android_cfi"]`, + "local_includes": `["."]`, + }), + }, + }) +} + +func TestCcLibraryStaticWithCfiOsSpecific(t *testing.T) { + runCcLibraryStaticTestCase(t, Bp2buildTestCase{ + Description: "cc_library_static has correct features when cfi is enabled for specific variants", + Blueprint: ` +cc_library_static { + name: "foo", + target: { + android: { + sanitize: { + cfi: true, + }, + }, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "features": `select({ + "//build/bazel/platforms/os:android": ["android_cfi"], + "//conditions:default": [], + })`, + "local_includes": `["."]`, + }), + }, + }) +} + +func TestCcLibraryStaticWithCfiAndCfiAssemblySupport(t *testing.T) { + runCcLibraryStaticTestCase(t, Bp2buildTestCase{ + Description: "cc_library_static has correct features when cfi is enabled with cfi_assembly_support", + Blueprint: ` +cc_library_static { + name: "foo", + sanitize: { + cfi: true, + config: { + cfi_assembly_support: true, + }, + }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "features": `[ + "android_cfi", + "android_cfi_assembly_support", + ]`, + "local_includes": `["."]`, + }), + }, + }) +} diff --git a/cc/bp2build.go b/cc/bp2build.go index c9465c71a..34cc5744c 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -1773,6 +1773,12 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module for _, sanitizer := range sanitizerProps.Sanitize.Misc_undefined { features = append(features, "ubsan_"+sanitizer) } + if proptools.Bool(sanitizerProps.Sanitize.Cfi) { + features = append(features, "android_cfi") + if proptools.Bool(sanitizerProps.Sanitize.Config.Cfi_assembly_support) { + features = append(features, "android_cfi_assembly_support") + } + } sanitizerFeatures.SetSelectValue(axis, config, features) } })