diff options
Diffstat (limited to 'cc')
| -rw-r--r-- | cc/cc.go | 15 | ||||
| -rw-r--r-- | cc/coverage.go | 47 | ||||
| -rw-r--r-- | cc/linkable.go | 2 | ||||
| -rw-r--r-- | cc/testing.go | 39 |
4 files changed, 83 insertions, 20 deletions
@@ -437,7 +437,6 @@ var ( ndkLateStubDepTag = DependencyTag{Name: "ndk late stub", Library: true} vndkExtDepTag = DependencyTag{Name: "vndk extends", Library: true} runtimeDepTag = DependencyTag{Name: "runtime lib"} - coverageDepTag = DependencyTag{Name: "coverage"} testPerSrcDepTag = DependencyTag{Name: "test_per_src"} ) @@ -745,6 +744,15 @@ func (c *Module) OutputFile() android.OptionalPath { return c.outputFile } +func (c *Module) CoverageFiles() android.Paths { + if c.linker != nil { + if library, ok := c.linker.(libraryInterface); ok { + return library.objs().coverageFiles + } + } + panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName())) +} + var _ LinkableInterface = (*Module)(nil) func (c *Module) UnstrippedOutputFile() android.Path { @@ -2493,13 +2501,16 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // When combining coverage files for shared libraries and executables, coverage files // in static libraries act as if they were whole static libraries. The same goes for // source based Abi dump files. - // This should only be done for cc.Modules if c, ok := ccDep.(*Module); ok { staticLib := c.linker.(libraryInterface) depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, staticLib.objs().coverageFiles...) depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles, staticLib.objs().sAbiDumpFiles...) + } else if c, ok := ccDep.(LinkableInterface); ok { + // Handle non-CC modules here + depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, + c.CoverageFiles()...) } } diff --git a/cc/coverage.go b/cc/coverage.go index bde07fd63..cc9a1adab 100644 --- a/cc/coverage.go +++ b/cc/coverage.go @@ -65,10 +65,10 @@ func (cov *coverage) deps(ctx DepsContext, deps Deps) Deps { if cov.Properties.NeedCoverageVariant { ctx.AddVariationDependencies([]blueprint.Variation{ {Mutator: "link", Variation: "static"}, - }, coverageDepTag, getGcovProfileLibraryName(ctx)) + }, CoverageDepTag, getGcovProfileLibraryName(ctx)) ctx.AddVariationDependencies([]blueprint.Variation{ {Mutator: "link", Variation: "static"}, - }, coverageDepTag, getClangProfileLibraryName(ctx)) + }, CoverageDepTag, getClangProfileLibraryName(ctx)) } return deps } @@ -134,14 +134,14 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags if gcovCoverage { flags.Local.LdFlags = append(flags.Local.LdFlags, "--coverage") - coverage := ctx.GetDirectDepWithTag(getGcovProfileLibraryName(ctx), coverageDepTag).(*Module) + coverage := ctx.GetDirectDepWithTag(getGcovProfileLibraryName(ctx), CoverageDepTag).(*Module) deps.WholeStaticLibs = append(deps.WholeStaticLibs, coverage.OutputFile().Path()) flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--wrap,getenv") } else if clangCoverage { flags.Local.LdFlags = append(flags.Local.LdFlags, "-fprofile-instr-generate") - coverage := ctx.GetDirectDepWithTag(getClangProfileLibraryName(ctx), coverageDepTag).(*Module) + coverage := ctx.GetDirectDepWithTag(getClangProfileLibraryName(ctx), CoverageDepTag).(*Module) deps.WholeStaticLibs = append(deps.WholeStaticLibs, coverage.OutputFile().Path()) } } @@ -150,25 +150,30 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags } func (cov *coverage) begin(ctx BaseModuleContext) { + if ctx.Host() { + // TODO(dwillemsen): because of -nodefaultlibs, we must depend on libclang_rt.profile-*.a + // Just turn off for now. + } else { + cov.Properties = SetCoverageProperties(ctx, cov.Properties, ctx.nativeCoverage(), ctx.useSdk(), ctx.sdkVersion()) + } +} + +func SetCoverageProperties(ctx android.BaseModuleContext, properties CoverageProperties, moduleTypeHasCoverage bool, + useSdk bool, sdkVersion string) CoverageProperties { // Coverage is disabled globally if !ctx.DeviceConfig().NativeCoverageEnabled() && !ctx.DeviceConfig().ClangCoverageEnabled() { - return + return properties } var needCoverageVariant bool var needCoverageBuild bool - if ctx.Host() { - // TODO(dwillemsen): because of -nodefaultlibs, we must depend on libclang_rt.profile-*.a - // Just turn off for now. - } else if !ctx.nativeCoverage() { - // Native coverage is not supported for this module type. - } else { + if moduleTypeHasCoverage { // Check if Native_coverage is set to false. This property defaults to true. - needCoverageVariant = BoolDefault(cov.Properties.Native_coverage, true) - if sdk_version := ctx.sdkVersion(); ctx.useSdk() && sdk_version != "current" { + needCoverageVariant = BoolDefault(properties.Native_coverage, true) + if useSdk && sdkVersion != "current" { // Native coverage is not supported for SDK versions < 23 - if fromApi, err := strconv.Atoi(sdk_version); err == nil && fromApi < 23 { + if fromApi, err := strconv.Atoi(sdkVersion); err == nil && fromApi < 23 { needCoverageVariant = false } } @@ -179,8 +184,10 @@ func (cov *coverage) begin(ctx BaseModuleContext) { } } - cov.Properties.NeedCoverageBuild = needCoverageBuild - cov.Properties.NeedCoverageVariant = needCoverageVariant + properties.NeedCoverageBuild = needCoverageBuild + properties.NeedCoverageVariant = needCoverageVariant + + return properties } // Coverage is an interface for non-CC modules to implement to be mutated for coverage @@ -190,6 +197,7 @@ type Coverage interface { PreventInstall() HideFromMake() MarkAsCoverageVariant(bool) + EnableCoverageIfNeeded() } func coverageMutator(mctx android.BottomUpMutatorContext) { @@ -212,14 +220,17 @@ func coverageMutator(mctx android.BottomUpMutatorContext) { m[1].(*Module).coverage.Properties.IsCoverageVariant = true } } else if cov, ok := mctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(mctx) { - // APEX modules fall here + // APEX and Rust modules fall here // Note: variant "" is also created because an APEX can be depended on by another // module which are split into "" and "cov" variants. e.g. when cc_test refers // to an APEX via 'data' property. m := mctx.CreateVariations("", "cov") - m[0].(Coverage).MarkAsCoverageVariant(true) + m[0].(Coverage).MarkAsCoverageVariant(false) m[0].(Coverage).PreventInstall() m[0].(Coverage).HideFromMake() + + m[1].(Coverage).MarkAsCoverageVariant(true) + m[1].(Coverage).EnableCoverageIfNeeded() } } diff --git a/cc/linkable.go b/cc/linkable.go index 4a70d48f7..de36f9017 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -12,6 +12,7 @@ type LinkableInterface interface { CcLibraryInterface() bool OutputFile() android.OptionalPath + CoverageFiles() android.Paths IncludeDirs() android.Paths SetDepsInLinkOrder([]android.Path) @@ -83,4 +84,5 @@ var ( CrtBeginDepTag = DependencyTag{Name: "crtbegin"} CrtEndDepTag = DependencyTag{Name: "crtend"} + CoverageDepTag = DependencyTag{Name: "coverage"} ) diff --git a/cc/testing.go b/cc/testing.go index 611992070..be020c596 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -192,6 +192,45 @@ func GatherRequiredDepsForTest(oses ...android.OsType) string { symbol_file: "", sdk_version: "current", } + + // Coverage libraries + cc_library { + name: "libprofile-extras", + vendor_available: true, + recovery_available: true, + native_coverage: false, + system_shared_libs: [], + stl: "none", + notice: "custom_notice", + } + cc_library { + name: "libprofile-clang-extras", + vendor_available: true, + recovery_available: true, + native_coverage: false, + system_shared_libs: [], + stl: "none", + notice: "custom_notice", + } + cc_library { + name: "libprofile-extras_ndk", + vendor_available: true, + native_coverage: false, + system_shared_libs: [], + stl: "none", + notice: "custom_notice", + sdk_version: "current", + } + cc_library { + name: "libprofile-clang-extras_ndk", + vendor_available: true, + native_coverage: false, + system_shared_libs: [], + stl: "none", + notice: "custom_notice", + sdk_version: "current", + } + cc_library { name: "libdl", no_libcrt: true, |