Add bp2build conversion to reference to fdo_profile targets

The fdo_profile targets are handcrafted in ag/20469925. Bp2build creates fdo_profile attribute on cc_library_shared and references to the fdo_profile target if the profile exists. This works under assumption that all afdo profiles have an associated Bazel fdo_profile target declared in the same folder/package.

As noted in b/253540178, this won't work when we check in the BUILD files (which is likely 6+ months away) because some profiles might only exist internally but not in AOSP. We will implement a long-term solution once we figure out all the requirements we need to support afdo both in Soong and Bazel.

Bug: 253540178
Test: go tests
Change-Id: Iebd5dd7a76583b4b2bf0d9ee56d58f247d313a54
Merged-In: Iebd5dd7a76583b4b2bf0d9ee56d58f247d313a54
This commit is contained in:
Vinh Tran
2022-11-28 11:15:23 -05:00
parent 4e17a2e503
commit 99270ea3c3
3 changed files with 110 additions and 0 deletions

View File

@@ -3603,6 +3603,70 @@ cc_library_static {
})
}
func TestCcLibraryWithAfdoEnabled(t *testing.T) {
bp := `
cc_library {
name: "foo",
afdo: true,
include_build_directory: false,
}`
// TODO(b/260714900): Add test case for arch-specific afdo profile
testCases := []struct {
description string
filesystem map[string]string
expectedBazelTargets []string
}{
{
description: "cc_library with afdo enabled and existing profile",
filesystem: map[string]string{"vendor/google_data/pgo_profile/sampling/foo.afdo": ""},
expectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{}),
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
"fdo_profile": `"//vendor/google_data/pgo_profile/sampling:foo"`,
}),
},
},
{
description: "cc_library with afdo enabled and existing profile in AOSP",
filesystem: map[string]string{"toolchain/pgo-profiles/sampling/foo.afdo": ""},
expectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{}),
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
"fdo_profile": `"//toolchain/pgo-profiles/sampling:foo"`,
}),
},
},
{
description: "cc_library with afdo enabled but profile filename doesn't match with module name",
filesystem: map[string]string{"toolchain/pgo-profiles/sampling/bar.afdo": ""},
expectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{}),
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{}),
},
},
{
description: "cc_library with afdo enabled but profile doesn't exist",
expectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{}),
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{}),
},
},
}
for _, testCase := range testCases {
t.Run(testCase.description, func(t *testing.T) {
runCcLibraryTestCase(t, Bp2buildTestCase{
ExpectedBazelTargets: testCase.expectedBazelTargets,
ModuleTypeUnderTest: "cc_library",
ModuleTypeUnderTestFactory: cc.LibraryFactory,
Description: testCase.description,
Blueprint: binaryReplacer.Replace(bp),
Filesystem: testCase.filesystem,
})
})
}
}
func TestCcLibraryHeaderAbiChecker(t *testing.T) {
runCcLibraryTestCase(t, Bp2buildTestCase{
Description: "cc_library with header abi checker",

View File

@@ -393,6 +393,8 @@ type compilerAttributes struct {
features bazel.StringListAttribute
suffix bazel.StringAttribute
fdoProfile bazel.LabelAttribute
}
type filterOutFn func(string) bool
@@ -777,6 +779,13 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
(&compilerAttrs).srcs.Add(&convertedLSrcs.srcName)
(&compilerAttrs).cSrcs.Add(&convertedLSrcs.cSrcName)
if module.afdo != nil && module.afdo.Properties.Afdo {
fdoProfileDep := bp2buildFdoProfile(ctx, module)
if fdoProfileDep != nil {
(&compilerAttrs).fdoProfile.SetValue(*fdoProfileDep)
}
}
if !compilerAttrs.syspropSrcs.IsEmpty() {
(&linkerAttrs).wholeArchiveDeps.Add(bp2buildCcSysprop(ctx, module.Name(), module.Properties.Min_sdk_version, compilerAttrs.syspropSrcs))
}
@@ -793,6 +802,37 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
}
}
type fdoProfileAttributes struct {
Absolute_path_profile string
}
func bp2buildFdoProfile(
ctx android.Bp2buildMutatorContext,
m *Module,
) *bazel.Label {
for _, project := range globalAfdoProfileProjects {
// We handcraft a BUILD file with fdo_profile targets that use the existing profiles in the project
// This implementation is assuming that every afdo profile in globalAfdoProfileProjects already has
// an associated fdo_profile target declared in the same package.
// TODO(b/260714900): Handle arch-specific afdo profiles (e.g. `<module-name>-arm<64>.afdo`)
path := android.ExistentPathForSource(ctx, project, m.Name()+".afdo")
if path.Valid() {
// FIXME: Some profiles only exist internally and are not released to AOSP.
// When generated BUILD files are checked in, we'll run into merge conflict.
// The cc_library_shared target in AOSP won't have reference to an fdo_profile target because
// the profile doesn't exist. Internally, the same cc_library_shared target will
// have reference to the fdo_profile.
// For more context, see b/258682955#comment2
fdoProfileLabel := "//" + strings.TrimSuffix(project, "/") + ":" + m.Name()
return &bazel.Label{
Label: fdoProfileLabel,
}
}
}
return nil
}
func bp2buildCcAidlLibrary(
ctx android.Bp2buildMutatorContext,
m *Module,

View File

@@ -417,6 +417,8 @@ func libraryBp2Build(ctx android.TopDownMutatorContext, m *Module) {
Strip: stripAttrsFromLinkerAttrs(&linkerAttrs),
Features: baseAttributes.features,
bazelCcHeaderAbiCheckerAttributes: bp2buildParseAbiCheckerProps(ctx, m),
Fdo_profile: compilerAttrs.fdoProfile,
}
if compilerAttrs.stubsSymbolFile != nil && len(compilerAttrs.stubsVersions.Value) > 0 {
@@ -2930,6 +2932,8 @@ func sharedOrStaticLibraryBp2Build(ctx android.TopDownMutatorContext, module *Mo
Suffix: compilerAttrs.suffix,
bazelCcHeaderAbiCheckerAttributes: bp2buildParseAbiCheckerProps(ctx, module),
Fdo_profile: compilerAttrs.fdoProfile,
}
if compilerAttrs.stubsSymbolFile != nil && len(compilerAttrs.stubsVersions.Value) > 0 {
hasStubs := true
@@ -3020,6 +3024,8 @@ type bazelCcLibrarySharedAttributes struct {
Suffix bazel.StringAttribute
bazelCcHeaderAbiCheckerAttributes
Fdo_profile bazel.LabelAttribute
}
type bazelCcStubSuiteAttributes struct {