Merge "Disable inlining and loop unrolling in LTO without PGO profile" am: 06d1060041

am: db764c0315

Change-Id: Iab7ec6e91e5dd975b4312a162bc3c84810b38438
This commit is contained in:
Yi Kong 2018-02-16 03:27:28 +00:00 committed by android-build-merger
commit 3dca508089
3 changed files with 28 additions and 2 deletions

View file

@ -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()
}

View file

@ -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
}

View file

@ -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 {