Merge "Disable inlining and loop unrolling in LTO without PGO profile" am: 06d1060041
am: db764c0315
Change-Id: Iab7ec6e91e5dd975b4312a162bc3c84810b38438
This commit is contained in:
commit
3dca508089
3 changed files with 28 additions and 2 deletions
12
cc/cc.go
12
cc/cc.go
|
@ -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
|
||||
}
|
||||
|
|
11
cc/pgo.go
11
cc/pgo.go
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue