Merge changes from topic "gcov-clang-migration" into rvc-dev

* changes:
  Make native_coverage clause work with ClangCoverage
  Introduce product variables to select Java code coverage paths in Soong.
  Rename native code coverage paths product variables in Soong.
This commit is contained in:
Oliver Nguyen 2020-07-06 21:07:54 +00:00 committed by Android (Google) Code Review
commit f6cd2a0cc6
7 changed files with 63 additions and 19 deletions

View File

@ -406,6 +406,14 @@ func NewConfig(srcDir, buildDir string) (Config, error) {
return Config{}, err return Config{}, err
} }
if Bool(config.productVariables.GcovCoverage) && Bool(config.productVariables.ClangCoverage) {
return Config{}, fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
}
config.productVariables.Native_coverage = proptools.BoolPtr(
Bool(config.productVariables.GcovCoverage) ||
Bool(config.productVariables.ClangCoverage))
return Config{config}, nil return Config{config}, nil
} }
@ -1037,27 +1045,55 @@ func (c *deviceConfig) SamplingPGO() bool {
return Bool(c.config.productVariables.SamplingPGO) return Bool(c.config.productVariables.SamplingPGO)
} }
func (c *config) NativeLineCoverage() bool { // JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
return Bool(c.productVariables.NativeLineCoverage) // path. Coverage is enabled by default when the product variable
// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
// enabled for any path which is part of this variable (and not part of the
// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
// represents any path.
func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
coverage := false
if c.config.productVariables.JavaCoveragePaths == nil ||
InList("*", c.config.productVariables.JavaCoveragePaths) ||
HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
coverage = true
}
if coverage && c.config.productVariables.JavaCoverageExcludePaths != nil {
if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
coverage = false
}
}
return coverage
} }
// Returns true if gcov or clang coverage is enabled.
func (c *deviceConfig) NativeCoverageEnabled() bool { func (c *deviceConfig) NativeCoverageEnabled() bool {
return Bool(c.config.productVariables.Native_coverage) || Bool(c.config.productVariables.NativeLineCoverage) return Bool(c.config.productVariables.GcovCoverage) ||
Bool(c.config.productVariables.ClangCoverage)
} }
func (c *deviceConfig) ClangCoverageEnabled() bool { func (c *deviceConfig) ClangCoverageEnabled() bool {
return Bool(c.config.productVariables.ClangCoverage) return Bool(c.config.productVariables.ClangCoverage)
} }
func (c *deviceConfig) CoverageEnabledForPath(path string) bool { func (c *deviceConfig) GcovCoverageEnabled() bool {
return Bool(c.config.productVariables.GcovCoverage)
}
// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
// code coverage is enabled for path. By default, coverage is not enabled for a
// given path unless it is part of the NativeCoveragePaths product variable (and
// not part of the NativeCoverageExcludePaths product variable). Value "*" in
// NativeCoveragePaths represents any path.
func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
coverage := false coverage := false
if c.config.productVariables.CoveragePaths != nil { if c.config.productVariables.NativeCoveragePaths != nil {
if InList("*", c.config.productVariables.CoveragePaths) || HasAnyPrefix(path, c.config.productVariables.CoveragePaths) { if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
coverage = true coverage = true
} }
} }
if coverage && c.config.productVariables.CoverageExcludePaths != nil { if coverage && c.config.productVariables.NativeCoverageExcludePaths != nil {
if HasAnyPrefix(path, c.config.productVariables.CoverageExcludePaths) { if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
coverage = false coverage = false
} }
} }

View File

@ -253,11 +253,16 @@ type productVariables struct {
SamplingPGO *bool `json:",omitempty"` SamplingPGO *bool `json:",omitempty"`
NativeLineCoverage *bool `json:",omitempty"` JavaCoveragePaths []string `json:",omitempty"`
Native_coverage *bool `json:",omitempty"` JavaCoverageExcludePaths []string `json:",omitempty"`
ClangCoverage *bool `json:",omitempty"`
CoveragePaths []string `json:",omitempty"` GcovCoverage *bool `json:",omitempty"`
CoverageExcludePaths []string `json:",omitempty"` ClangCoverage *bool `json:",omitempty"`
NativeCoveragePaths []string `json:",omitempty"`
NativeCoverageExcludePaths []string `json:",omitempty"`
// Set by NewConfig
Native_coverage *bool
DevicePrefer32BitApps *bool `json:",omitempty"` DevicePrefer32BitApps *bool `json:",omitempty"`
DevicePrefer32BitExecutables *bool `json:",omitempty"` DevicePrefer32BitExecutables *bool `json:",omitempty"`

View File

@ -1660,7 +1660,7 @@ func (a *apexBundle) IsSanitizerEnabled(ctx android.BaseModuleContext, sanitizer
} }
func (a *apexBundle) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool { func (a *apexBundle) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool {
return ctx.Device() && (ctx.DeviceConfig().NativeCoverageEnabled() || ctx.DeviceConfig().ClangCoverageEnabled()) return ctx.Device() && ctx.DeviceConfig().NativeCoverageEnabled()
} }
func (a *apexBundle) PreventInstall() { func (a *apexBundle) PreventInstall() {

View File

@ -155,6 +155,7 @@ func TestVndkApexUsesVendorVariant(t *testing.T) {
sdk_version: "current", sdk_version: "current",
} }
`, func(fs map[string][]byte, config android.Config) { `, func(fs map[string][]byte, config android.Config) {
config.TestProductVariables.GcovCoverage = proptools.BoolPtr(true)
config.TestProductVariables.Native_coverage = proptools.BoolPtr(true) config.TestProductVariables.Native_coverage = proptools.BoolPtr(true)
}) })

View File

@ -74,8 +74,8 @@ func (cov *coverage) deps(ctx DepsContext, deps Deps) Deps {
} }
func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags, PathDeps) { func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags, PathDeps) {
gcovCoverage := ctx.DeviceConfig().NativeCoverageEnabled()
clangCoverage := ctx.DeviceConfig().ClangCoverageEnabled() clangCoverage := ctx.DeviceConfig().ClangCoverageEnabled()
gcovCoverage := ctx.DeviceConfig().GcovCoverageEnabled()
if !gcovCoverage && !clangCoverage { if !gcovCoverage && !clangCoverage {
return flags, deps return flags, deps
@ -151,7 +151,7 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags
func (cov *coverage) begin(ctx BaseModuleContext) { func (cov *coverage) begin(ctx BaseModuleContext) {
// Coverage is disabled globally // Coverage is disabled globally
if !ctx.DeviceConfig().NativeCoverageEnabled() && !ctx.DeviceConfig().ClangCoverageEnabled() { if !ctx.DeviceConfig().NativeCoverageEnabled() {
return return
} }
@ -175,7 +175,7 @@ func (cov *coverage) begin(ctx BaseModuleContext) {
if needCoverageVariant { if needCoverageVariant {
// Coverage variant is actually built with coverage if enabled for its module path // Coverage variant is actually built with coverage if enabled for its module path
needCoverageBuild = ctx.DeviceConfig().CoverageEnabledForPath(ctx.ModuleDir()) needCoverageBuild = ctx.DeviceConfig().NativeCoverageEnabledForPath(ctx.ModuleDir())
} }
} }

View File

@ -952,7 +952,7 @@ func (a *AndroidApp) Privileged() bool {
} }
func (a *AndroidApp) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool { func (a *AndroidApp) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool {
return ctx.Device() && (ctx.DeviceConfig().NativeCoverageEnabled() || ctx.DeviceConfig().ClangCoverageEnabled()) return ctx.Device() && ctx.DeviceConfig().NativeCoverageEnabled()
} }
func (a *AndroidApp) PreventInstall() { func (a *AndroidApp) PreventInstall() {

View File

@ -633,7 +633,9 @@ type jniLib struct {
} }
func (j *Module) shouldInstrument(ctx android.BaseModuleContext) bool { func (j *Module) shouldInstrument(ctx android.BaseModuleContext) bool {
return j.properties.Instrument && ctx.Config().IsEnvTrue("EMMA_INSTRUMENT") return j.properties.Instrument &&
ctx.Config().IsEnvTrue("EMMA_INSTRUMENT") &&
ctx.DeviceConfig().JavaCoverageEnabledForPath(ctx.ModuleDir())
} }
func (j *Module) shouldInstrumentStatic(ctx android.BaseModuleContext) bool { func (j *Module) shouldInstrumentStatic(ctx android.BaseModuleContext) bool {