diff options
Diffstat (limited to 'cc')
| -rw-r--r-- | cc/Android.bp | 1 | ||||
| -rw-r--r-- | cc/cc.go | 34 | ||||
| -rw-r--r-- | cc/cc_test.go | 2 | ||||
| -rw-r--r-- | cc/config/global.go | 2 | ||||
| -rw-r--r-- | cc/linker.go | 9 | ||||
| -rw-r--r-- | cc/lto.go | 2 | ||||
| -rw-r--r-- | cc/pgo.go | 294 |
7 files changed, 22 insertions, 322 deletions
diff --git a/cc/Android.bp b/cc/Android.bp index 06e0e5efc..351f3f696 100644 --- a/cc/Android.bp +++ b/cc/Android.bp @@ -41,7 +41,6 @@ bootstrap_go_package { "lto.go", "makevars.go", "orderfile.go", - "pgo.go", "prebuilt.go", "proto.go", "rs.go", @@ -142,6 +142,8 @@ type Deps struct { // List of libs that need to be excluded for APEX variant ExcludeLibsForApex []string + // List of libs that need to be excluded for non-APEX variant + ExcludeLibsForNonApex []string } // PathDeps is a struct containing file paths to dependencies of a module. @@ -530,7 +532,6 @@ type ModuleContextIntf interface { baseModuleName() string getVndkExtendsModuleName() string isAfdoCompile() bool - isPgoCompile() bool isOrderfileCompile() bool isCfi() bool isFuzzer() bool @@ -729,6 +730,8 @@ type libraryDependencyTag struct { // Whether or not this dependency has to be followed for the apex variants excludeInApex bool + // Whether or not this dependency has to be followed for the non-apex variants + excludeInNonApex bool // If true, don't automatically export symbols from the static library into a shared library. unexportedSymbols bool @@ -892,7 +895,6 @@ type Module struct { vndkdep *vndkdep lto *lto afdo *afdo - pgo *pgo orderfile *orderfile library libraryInterface @@ -1278,9 +1280,6 @@ func (c *Module) Init() android.Module { if c.afdo != nil { c.AddProperties(c.afdo.props()...) } - if c.pgo != nil { - c.AddProperties(c.pgo.props()...) - } if c.orderfile != nil { c.AddProperties(c.orderfile.props()...) } @@ -1410,13 +1409,6 @@ func (c *Module) isAfdoCompile() bool { return false } -func (c *Module) isPgoCompile() bool { - if pgo := c.pgo; pgo != nil { - return pgo.Properties.PgoCompile - } - return false -} - func (c *Module) isOrderfileCompile() bool { if orderfile := c.orderfile; orderfile != nil { return orderfile.Properties.OrderfileLoad @@ -1725,10 +1717,6 @@ func (ctx *moduleContextImpl) isAfdoCompile() bool { return ctx.mod.isAfdoCompile() } -func (ctx *moduleContextImpl) isPgoCompile() bool { - return ctx.mod.isPgoCompile() -} - func (ctx *moduleContextImpl) isOrderfileCompile() bool { return ctx.mod.isOrderfileCompile() } @@ -1841,7 +1829,6 @@ func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Mo module.vndkdep = &vndkdep{} module.lto = <o{} module.afdo = &afdo{} - module.pgo = &pgo{} module.orderfile = &orderfile{} return module } @@ -2267,9 +2254,6 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { if c.afdo != nil { flags = c.afdo.flags(ctx, flags) } - if c.pgo != nil { - flags = c.pgo.flags(ctx, flags) - } if c.orderfile != nil { flags = c.orderfile.flags(ctx, flags) } @@ -2423,9 +2407,6 @@ func (c *Module) begin(ctx BaseModuleContext) { if c.orderfile != nil { c.orderfile.begin(ctx) } - if c.pgo != nil { - c.pgo.begin(ctx) - } if ctx.useSdk() && c.IsSdkVariant() { version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion()) if err != nil { @@ -2825,6 +2806,9 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { if inList(lib, deps.ExcludeLibsForApex) { depTag.excludeInApex = true } + if inList(lib, deps.ExcludeLibsForNonApex) { + depTag.excludeInNonApex = true + } name, version := StubsLibNameAndVersion(lib) if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) { @@ -3341,6 +3325,9 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { if !apexInfo.IsForPlatform() && libDepTag.excludeInApex { return } + if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex { + return + } depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo) @@ -4329,7 +4316,6 @@ func DefaultsFactory(props ...interface{}) android.Module { &VndkProperties{}, <OProperties{}, &AfdoProperties{}, - &PgoProperties{}, &OrderfileProperties{}, &android.ProtoProperties{}, // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules. diff --git a/cc/cc_test.go b/cc/cc_test.go index e2dba9043..ed13e22d4 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -4818,7 +4818,7 @@ func TestIncludeDirectoryOrdering(t *testing.T) { cflags := []string{"-Werror", "-std=candcpp"} cstd := []string{"-std=gnu17", "-std=conly"} - cppstd := []string{"-std=gnu++17", "-std=cpp", "-fno-rtti"} + cppstd := []string{"-std=gnu++20", "-std=cpp", "-fno-rtti"} lastIncludes := []string{ "out/soong/ndk/sysroot/usr/include", diff --git a/cc/config/global.go b/cc/config/global.go index 2ca9df9a1..bc067ad17 100644 --- a/cc/config/global.go +++ b/cc/config/global.go @@ -357,7 +357,7 @@ var ( } CStdVersion = "gnu17" - CppStdVersion = "gnu++17" + CppStdVersion = "gnu++20" ExperimentalCStdVersion = "gnu2x" ExperimentalCppStdVersion = "gnu++2a" diff --git a/cc/linker.go b/cc/linker.go index 257fe86cf..357d1cee0 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -214,6 +214,11 @@ type BaseLinkerProperties struct { // variant of the C/C++ module. Exclude_static_libs []string } + Non_apex struct { + // list of shared libs that should not be used to build the non-apex + // variant of the C/C++ module. + Exclude_shared_libs []string + } } `android:"arch_variant"` // make android::build:GetBuildNumber() available containing the build ID. @@ -300,6 +305,10 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { // variants. deps.ExcludeLibsForApex = append(deps.ExcludeLibsForApex, linker.Properties.Target.Apex.Exclude_shared_libs...) deps.ExcludeLibsForApex = append(deps.ExcludeLibsForApex, linker.Properties.Target.Apex.Exclude_static_libs...) + // Record the libraries that need to be excluded when building for non-APEX variants + // for the same reason above. This is used for marking deps and marked deps are + // ignored for non-apex variants. + deps.ExcludeLibsForNonApex = append(deps.ExcludeLibsForNonApex, linker.Properties.Target.Non_apex.Exclude_shared_libs...) if Bool(linker.Properties.Use_version_lib) { deps.WholeStaticLibs = append(deps.WholeStaticLibs, "libbuildversion") @@ -140,7 +140,7 @@ func (lto *lto) flags(ctx BaseModuleContext, flags Flags) Flags { // Reduce the inlining threshold for a better balance of binary size and // performance. if !ctx.Darwin() { - if ctx.isPgoCompile() || ctx.isAfdoCompile() { + if ctx.isAfdoCompile() { ltoLdFlags = append(ltoLdFlags, "-Wl,-plugin-opt,-import-instr-limit=40") } else { ltoLdFlags = append(ltoLdFlags, "-Wl,-plugin-opt,-import-instr-limit=5") diff --git a/cc/pgo.go b/cc/pgo.go deleted file mode 100644 index 463e2e623..000000000 --- a/cc/pgo.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2017 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cc - -import ( - "fmt" - "path/filepath" - "strings" - - "github.com/google/blueprint/proptools" - - "android/soong/android" -) - -var ( - // Add flags to ignore warnings that profiles are old or missing for - // some functions. - profileUseOtherFlags = []string{ - "-Wno-backend-plugin", - } - - globalPgoProfileProjects = []string{ - "toolchain/pgo-profiles/pgo", - "vendor/google_data/pgo_profile/pgo", - } -) - -var pgoProfileProjectsConfigKey = android.NewOnceKey("PgoProfileProjects") - -const profileInstrumentFlag = "-fprofile-generate=/data/local/tmp" -const profileUseInstrumentFormat = "-fprofile-use=%s" - -func getPgoProfileProjects(config android.DeviceConfig) []string { - return config.OnceStringSlice(pgoProfileProjectsConfigKey, func() []string { - return append(globalPgoProfileProjects, config.PgoAdditionalProfileDirs()...) - }) -} - -func recordMissingProfileFile(ctx BaseModuleContext, missing string) { - getNamedMapForConfig(ctx.Config(), modulesMissingProfileFileKey).Store(missing, true) -} - -type PgoProperties struct { - Pgo struct { - Instrumentation *bool - Profile_file *string `android:"arch_variant"` - Benchmarks []string - Enable_profile_use *bool `android:"arch_variant"` - // Additional compiler flags to use when building this module - // for profiling. - Cflags []string `android:"arch_variant"` - } `android:"arch_variant"` - - PgoPresent bool `blueprint:"mutated"` - ShouldProfileModule bool `blueprint:"mutated"` - PgoCompile bool `blueprint:"mutated"` - PgoInstrLink bool `blueprint:"mutated"` -} - -type pgo struct { - Properties PgoProperties -} - -func (props *PgoProperties) isInstrumentation() bool { - return props.Pgo.Instrumentation != nil && *props.Pgo.Instrumentation == true -} - -func (pgo *pgo) props() []interface{} { - return []interface{}{&pgo.Properties} -} - -func (props *PgoProperties) addInstrumentationProfileGatherFlags(ctx ModuleContext, flags Flags) Flags { - // Add to C flags iff PGO is explicitly enabled for this module. - if props.ShouldProfileModule { - flags.Local.CFlags = append(flags.Local.CFlags, props.Pgo.Cflags...) - flags.Local.CFlags = append(flags.Local.CFlags, profileInstrumentFlag) - } - flags.Local.LdFlags = append(flags.Local.LdFlags, profileInstrumentFlag) - return flags -} - -func (props *PgoProperties) getPgoProfileFile(ctx BaseModuleContext) android.OptionalPath { - profileFile := *props.Pgo.Profile_file - - // Test if the profile_file is present in any of the PGO profile projects - for _, profileProject := range getPgoProfileProjects(ctx.DeviceConfig()) { - // Bug: http://b/74395273 If the profile_file is unavailable, - // use a versioned file named - // <profile_file>.<arbitrary-version> when available. This - // works around an issue where ccache serves stale cache - // entries when the profile file has changed. - globPattern := filepath.Join(profileProject, profileFile+".*") - versionedProfiles, err := ctx.GlobWithDeps(globPattern, nil) - if err != nil { - ctx.ModuleErrorf("glob: %s", err.Error()) - } - - path := android.ExistentPathForSource(ctx, profileProject, profileFile) - if path.Valid() { - if len(versionedProfiles) != 0 { - ctx.PropertyErrorf("pgo.profile_file", "Profile_file has multiple versions: "+filepath.Join(profileProject, profileFile)+", "+strings.Join(versionedProfiles, ", ")) - } - return path - } - - if len(versionedProfiles) > 1 { - ctx.PropertyErrorf("pgo.profile_file", "Profile_file has multiple versions: "+strings.Join(versionedProfiles, ", ")) - } else if len(versionedProfiles) == 1 { - return android.OptionalPathForPath(android.PathForSource(ctx, versionedProfiles[0])) - } - } - - // Record that this module's profile file is absent - missing := *props.Pgo.Profile_file + ":" + ctx.ModuleDir() + "/Android.bp:" + ctx.ModuleName() - recordMissingProfileFile(ctx, missing) - - return android.OptionalPathForPath(nil) -} - -func (props *PgoProperties) profileUseFlags(ctx ModuleContext, file string) []string { - flags := []string{fmt.Sprintf(profileUseInstrumentFormat, file)} - flags = append(flags, profileUseOtherFlags...) - return flags -} - -func (props *PgoProperties) addProfileUseFlags(ctx ModuleContext, flags Flags) Flags { - // Return if 'pgo' property is not present in this module. - if !props.PgoPresent { - return flags - } - - if props.PgoCompile { - profileFile := props.getPgoProfileFile(ctx) - profileFilePath := profileFile.Path() - profileUseFlags := props.profileUseFlags(ctx, profileFilePath.String()) - - flags.Local.CFlags = append(flags.Local.CFlags, profileUseFlags...) - flags.Local.LdFlags = append(flags.Local.LdFlags, profileUseFlags...) - - // Update CFlagsDeps and LdFlagsDeps so the module is rebuilt - // if profileFile gets updated - flags.CFlagsDeps = append(flags.CFlagsDeps, profileFilePath) - flags.LdFlagsDeps = append(flags.LdFlagsDeps, profileFilePath) - } - return flags -} - -func (props *PgoProperties) isPGO(ctx BaseModuleContext) bool { - isInstrumentation := props.isInstrumentation() - - profileKindPresent := isInstrumentation - filePresent := props.Pgo.Profile_file != nil - benchmarksPresent := len(props.Pgo.Benchmarks) > 0 - - // If all three properties are absent, PGO is OFF for this module - if !profileKindPresent && !filePresent && !benchmarksPresent { - return false - } - - // profileKindPresent and filePresent are mandatory properties. - if !profileKindPresent || !filePresent { - var missing []string - if !profileKindPresent { - missing = append(missing, "profile kind") - } - if !filePresent { - missing = append(missing, "profile_file property") - } - missingProps := strings.Join(missing, ", ") - ctx.ModuleErrorf("PGO specification is missing properties: " + missingProps) - } - - // Benchmark property is mandatory for instrumentation PGO. - if isInstrumentation && !benchmarksPresent { - ctx.ModuleErrorf("Instrumentation PGO specification is missing benchmark property") - } - - return true -} - -func (pgo *pgo) begin(ctx BaseModuleContext) { - // TODO Evaluate if we need to support PGO for host modules - if ctx.Host() { - return - } - - // Check if PGO is needed for this module - pgo.Properties.PgoPresent = pgo.Properties.isPGO(ctx) - - if !pgo.Properties.PgoPresent { - return - } - - // This module should be instrumented if ANDROID_PGO_INSTRUMENT is set - // and includes 'all', 'ALL' or a benchmark listed for this module. - // - // TODO Validate that each benchmark instruments at least one module - pgo.Properties.ShouldProfileModule = false - pgoBenchmarks := ctx.Config().Getenv("ANDROID_PGO_INSTRUMENT") - pgoBenchmarksMap := make(map[string]bool) - for _, b := range strings.Split(pgoBenchmarks, ",") { - pgoBenchmarksMap[b] = true - } - - if pgoBenchmarksMap["all"] == true || pgoBenchmarksMap["ALL"] == true { - pgo.Properties.ShouldProfileModule = true - pgo.Properties.PgoInstrLink = pgo.Properties.isInstrumentation() - } else { - for _, b := range pgo.Properties.Pgo.Benchmarks { - if pgoBenchmarksMap[b] == true { - pgo.Properties.ShouldProfileModule = true - pgo.Properties.PgoInstrLink = pgo.Properties.isInstrumentation() - break - } - } - } - - // PGO profile use is not feasible for a Clang coverage build because - // -fprofile-use and -fprofile-instr-generate are incompatible. - if ctx.DeviceConfig().ClangCoverageEnabled() { - return - } - - if !ctx.Config().IsEnvTrue("ANDROID_PGO_NO_PROFILE_USE") && - proptools.BoolDefault(pgo.Properties.Pgo.Enable_profile_use, true) { - if profileFile := pgo.Properties.getPgoProfileFile(ctx); profileFile.Valid() { - pgo.Properties.PgoCompile = true - } - } -} - -func (pgo *pgo) flags(ctx ModuleContext, flags Flags) Flags { - if ctx.Host() { - return flags - } - - // Deduce PgoInstrLink property i.e. whether this module needs to be - // linked with profile-generation flags. Here, we're setting it if any - // dependency needs PGO instrumentation. It is initially set in - // begin() if PGO is directly enabled for this module. - if ctx.static() && !ctx.staticBinary() { - // For static libraries, check if any whole_static_libs are - // linked with profile generation - ctx.VisitDirectDeps(func(m android.Module) { - if depTag, ok := ctx.OtherModuleDependencyTag(m).(libraryDependencyTag); ok { - if depTag.static() && depTag.wholeStatic { - if cc, ok := m.(*Module); ok { - if cc.pgo.Properties.PgoInstrLink { - pgo.Properties.PgoInstrLink = true - } - } - } - } - }) - } else { - // For executables and shared libraries, check all static dependencies. - ctx.VisitDirectDeps(func(m android.Module) { - if depTag, ok := ctx.OtherModuleDependencyTag(m).(libraryDependencyTag); ok { - if depTag.static() { - if cc, ok := m.(*Module); ok { - if cc.pgo.Properties.PgoInstrLink { - pgo.Properties.PgoInstrLink = true - } - } - } - } - }) - } - - props := pgo.Properties - // Add flags to profile this module based on its profile_kind - if (props.ShouldProfileModule && props.isInstrumentation()) || props.PgoInstrLink { - // Instrumentation PGO use and gather flags cannot coexist. - return props.addInstrumentationProfileGatherFlags(ctx, flags) - } - - if !ctx.Config().IsEnvTrue("ANDROID_PGO_NO_PROFILE_USE") { - flags = props.addProfileUseFlags(ctx, flags) - } - - return flags -} |