aboutsummaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorYi Kong <yikong@google.com>2018-02-16 03:41:05 +0000
committerandroid-build-merger <android-build-merger@google.com>2018-02-16 03:41:05 +0000
commit12c0a1b2cfe870d42fbb65d49b2457d8bafcfb93 (patch)
treea7643c75c78d77d40980f15ed3e9701df4061746 /cc
parent8c1f4e197145084aa26a2f8cf1b281dde494eb28 (diff)
parent3dca508089230b7ec41cc8ba37e6c4b5468dabf4 (diff)
downloadbuild_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.go12
-rw-r--r--cc/lto.go7
-rw-r--r--cc/pgo.go11
3 files changed, 28 insertions, 2 deletions
diff --git a/cc/cc.go b/cc/cc.go
index 49fefe96..f65441fa 100644
--- a/cc/cc.go
+++ b/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()
}
diff --git a/cc/lto.go b/cc/lto.go
index 4757fc7e..2ced1241 100644
--- a/cc/lto.go
+++ b/cc/lto.go
@@ -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
}
diff --git a/cc/pgo.go b/cc/pgo.go
index 1e703397..779ef39d 100644
--- a/cc/pgo.go
+++ b/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 {