From ceb5b76c91817c90818f0f6700124debc83821de Mon Sep 17 00:00:00 2001 From: Yi Kong Date: Fri, 20 Mar 2020 15:22:27 +0800 Subject: [PATCH] Add platform-wide sampling PGO option This causes the compiler to emit some additional debug infomation that will be used for sampling PGO. These debug infomation will get stripped so it only affects intermediate files. Test: build Bug: 79161490 Change-Id: Ie4d1d5ffbd311ba6e268cb94a618f5272be246ef --- android/config.go | 4 ++++ android/variable.go | 2 ++ cc/pgo.go | 33 +++++++++++++++++++-------------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/android/config.go b/android/config.go index 795317030..558c828e0 100644 --- a/android/config.go +++ b/android/config.go @@ -1032,6 +1032,10 @@ func (c *deviceConfig) DeviceKernelHeaderDirs() []string { return c.config.productVariables.DeviceKernelHeaders } +func (c *deviceConfig) SamplingPGO() bool { + return Bool(c.config.productVariables.SamplingPGO) +} + func (c *config) NativeLineCoverage() bool { return Bool(c.productVariables.NativeLineCoverage) } diff --git a/android/variable.go b/android/variable.go index 91de956bb..8357d2fff 100644 --- a/android/variable.go +++ b/android/variable.go @@ -252,6 +252,8 @@ type productVariables struct { ClangTidy *bool `json:",omitempty"` TidyChecks *string `json:",omitempty"` + SamplingPGO *bool `json:",omitempty"` + NativeLineCoverage *bool `json:",omitempty"` Native_coverage *bool `json:",omitempty"` ClangCoverage *bool `json:",omitempty"` diff --git a/cc/pgo.go b/cc/pgo.go index d5c4b87dd..88903bb73 100644 --- a/cc/pgo.go +++ b/cc/pgo.go @@ -88,20 +88,21 @@ func (pgo *pgo) props() []interface{} { return []interface{}{&pgo.Properties} } -func (props *PgoProperties) addProfileGatherFlags(ctx ModuleContext, flags Flags) Flags { +func (props *PgoProperties) addInstrumentationProfileGatherFlags(ctx ModuleContext, flags Flags) Flags { flags.Local.CFlags = append(flags.Local.CFlags, props.Pgo.Cflags...) - if props.isInstrumentation() { - flags.Local.CFlags = append(flags.Local.CFlags, profileInstrumentFlag) - // The profile runtime is added below in deps(). Add the below - // flag, which is the only other link-time action performed by - // the Clang driver during link. - flags.Local.LdFlags = append(flags.Local.LdFlags, "-u__llvm_profile_runtime") - } - if props.isSampling() { - flags.Local.CFlags = append(flags.Local.CFlags, profileSamplingFlag) - flags.Local.LdFlags = append(flags.Local.LdFlags, profileSamplingFlag) - } + flags.Local.CFlags = append(flags.Local.CFlags, profileInstrumentFlag) + // The profile runtime is added below in deps(). Add the below + // flag, which is the only other link-time action performed by + // the Clang driver during link. + flags.Local.LdFlags = append(flags.Local.LdFlags, "-u__llvm_profile_runtime") + return flags +} +func (props *PgoProperties) addSamplingProfileGatherFlags(ctx ModuleContext, flags Flags) Flags { + flags.Local.CFlags = append(flags.Local.CFlags, props.Pgo.Cflags...) + + flags.Local.CFlags = append(flags.Local.CFlags, profileSamplingFlag) + flags.Local.LdFlags = append(flags.Local.LdFlags, profileSamplingFlag) return flags } @@ -286,8 +287,12 @@ func (pgo *pgo) flags(ctx ModuleContext, flags Flags) Flags { props := pgo.Properties // Add flags to profile this module based on its profile_kind - if props.ShouldProfileModule { - return props.addProfileGatherFlags(ctx, flags) + if props.ShouldProfileModule && props.isInstrumentation() { + return props.addInstrumentationProfileGatherFlags(ctx, flags) + } else if props.ShouldProfileModule && props.isSampling() { + return props.addSamplingProfileGatherFlags(ctx, flags) + } else if ctx.DeviceConfig().SamplingPGO() { + return props.addSamplingProfileGatherFlags(ctx, flags) } if !ctx.Config().IsEnvTrue("ANDROID_PGO_NO_PROFILE_USE") {