diff options
author | Yi Kong <yikong@google.com> | 2018-02-16 03:41:05 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-02-16 03:41:05 +0000 |
commit | 12c0a1b2cfe870d42fbb65d49b2457d8bafcfb93 (patch) | |
tree | a7643c75c78d77d40980f15ed3e9701df4061746 /cc | |
parent | 8c1f4e197145084aa26a2f8cf1b281dde494eb28 (diff) | |
parent | 3dca508089230b7ec41cc8ba37e6c4b5468dabf4 (diff) | |
download | build_soong-12c0a1b2cfe870d42fbb65d49b2457d8bafcfb93.tar.gz build_soong-12c0a1b2cfe870d42fbb65d49b2457d8bafcfb93.tar.bz2 build_soong-12c0a1b2cfe870d42fbb65d49b2457d8bafcfb93.zip |
Merge "Disable inlining and loop unrolling in LTO without PGO profile" am: 06d1060041 am: db764c0315
am: 3dca508089
Change-Id: Ia72c2232bb9b4d01158372c49ecf8fcad7deb064
Diffstat (limited to 'cc')
-rw-r--r-- | cc/cc.go | 12 | ||||
-rw-r--r-- | cc/lto.go | 7 | ||||
-rw-r--r-- | cc/pgo.go | 11 |
3 files changed, 28 insertions, 2 deletions
@@ -211,6 +211,7 @@ type ModuleContextIntf interface { selectedStl() string baseModuleName() string getVndkExtendsModuleName() string + isPgoCompile() bool } type ModuleContext interface { @@ -408,6 +409,13 @@ func (c *Module) isVndk() bool { return false } +func (c *Module) isPgoCompile() bool { + if pgo := c.pgo; pgo != nil { + return pgo.Properties.PgoCompile + } + return false +} + func (c *Module) isVndkSp() bool { if vndkdep := c.vndkdep; vndkdep != nil { return vndkdep.isVndkSp() @@ -507,6 +515,10 @@ func (ctx *moduleContextImpl) isVndk() bool { return ctx.mod.isVndk() } +func (ctx *moduleContextImpl) isPgoCompile() bool { + return ctx.mod.isPgoCompile() +} + func (ctx *moduleContextImpl) isVndkSp() bool { return ctx.mod.isVndkSp() } @@ -87,6 +87,13 @@ func (lto *lto) flags(ctx BaseModuleContext, flags Flags) Flags { flags.LdFlags = append(flags.LdFlags, "-Wl,-plugin-opt,-emulated-tls") } flags.ArGoldPlugin = true + + // If the module does not have a profile, be conservative and do not inline + // or unroll loops during LTO, in order to prevent significant size bloat. + if !ctx.isPgoCompile() { + flags.LdFlags = append(flags.LdFlags, "-Wl,-plugin-opt,-inline-threshold=0") + flags.LdFlags = append(flags.LdFlags, "-Wl,-plugin-opt,-unroll-threshold=0") + } } return flags } @@ -45,7 +45,7 @@ func getPgoProfileProjects(config android.DeviceConfig) []string { }) } -func recordMissingProfileFile(ctx ModuleContext, missing string) { +func recordMissingProfileFile(ctx BaseModuleContext, missing string) { getNamedMapForConfig(ctx.Config(), modulesMissingProfileFile).Store(missing, true) } @@ -63,6 +63,7 @@ type PgoProperties struct { PgoPresent bool `blueprint:"mutated"` ShouldProfileModule bool `blueprint:"mutated"` + PgoCompile bool `blueprint:"mutated"` } type pgo struct { @@ -98,7 +99,7 @@ func (props *PgoProperties) addProfileGatherFlags(ctx ModuleContext, flags Flags return flags } -func (props *PgoProperties) getPgoProfileFile(ctx ModuleContext) android.OptionalPath { +func (props *PgoProperties) getPgoProfileFile(ctx BaseModuleContext) android.OptionalPath { // Test if the profile_file is present in any of the PGO profile projects for _, profileProject := range getPgoProfileProjects(ctx.DeviceConfig()) { path := android.ExistentPathForSource(ctx, "", profileProject, *props.Pgo.Profile_file) @@ -232,6 +233,12 @@ func (pgo *pgo) begin(ctx BaseModuleContext) { } } } + + if !ctx.Config().IsEnvTrue("ANDROID_PGO_NO_PROFILE_USE") { + if profileFile := pgo.Properties.getPgoProfileFile(ctx); profileFile.Valid() { + pgo.Properties.PgoCompile = true + } + } } func (pgo *pgo) deps(ctx BaseModuleContext, deps Deps) Deps { |