Include libprofile-extras to all coverage variants

Bug: http://b/128524141

Include libprofile-extras (defined in system/extras/toolchain-extras) to
all modules that need a coverage variant.  Also add
'-uinit_profile_extras' when linking with coverage.  This causes the
setup code in libprofile-extras to be linked into binaries/libraries
with coverage enabled.

We add the static library to the non-coverage variants as well but is a
no-op for them (since the '-u...' flag is not added for them).

Adding this dependency creates several circular dependencies since
coverage variants were being created for other module types that never
had any compilation or linking done during the build.  This change stops
creating coverage variants for toolchain_library, cc_prebuilt_library_*,
cc_library_headers module types (by adding a function to the linker
interface to specify whether native coverage is enabled).

Test: m NATIVE_COVERAGE=true COVERAGE_PATHS=*
Test: blueline_coverage target in internal branch (using forrest)
Change-Id: I5db876eb953639a55ba007248dd24e497f987730
This commit is contained in:
Pirama Arumuga Nainar
2019-03-25 10:21:31 -07:00
parent ee30d5e132
commit 65c95ff1fb
9 changed files with 64 additions and 4 deletions

View File

@@ -417,6 +417,10 @@ func (binary *binaryDecorator) symlinkList() []string {
return binary.symlinks
}
func (binary *binaryDecorator) nativeCoverage() bool {
return true
}
// /system/bin/linker -> /apex/com.android.runtime/bin/linker
func (binary *binaryDecorator) installSymlinkToRuntimeApex(ctx ModuleContext, file android.Path) {
dir := binary.baseInstaller.installDir(ctx)

View File

@@ -267,6 +267,7 @@ type ModuleContextIntf interface {
isStubs() bool
bootstrap() bool
mustUseVendorVariant() bool
nativeCoverage() bool
}
type ModuleContext interface {
@@ -312,6 +313,8 @@ type linker interface {
link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
appendLdflags([]string)
unstrippedOutputFilePath() android.Path
nativeCoverage() bool
}
type installer interface {
@@ -604,6 +607,10 @@ func (c *Module) bootstrap() bool {
return Bool(c.Properties.Bootstrap)
}
func (c *Module) nativeCoverage() bool {
return c.linker != nil && c.linker.nativeCoverage()
}
func isBionic(name string) bool {
switch name {
case "libc", "libm", "libdl", "linker":
@@ -794,6 +801,10 @@ func (ctx *moduleContextImpl) bootstrap() bool {
return ctx.mod.bootstrap()
}
func (ctx *moduleContextImpl) nativeCoverage() bool {
return ctx.mod.nativeCoverage()
}
func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
return &Module{
hod: hod,

View File

@@ -42,6 +42,23 @@ func (cov *coverage) props() []interface{} {
}
func (cov *coverage) deps(ctx BaseModuleContext, deps Deps) Deps {
if cov.Properties.NeedCoverageBuild {
// Link libprofile-extras/libprofile-extras_ndk when coverage
// variant is required. This is a no-op unless coverage is
// actually enabled during linking, when
// '-uinit_profile_extras' is added (in flags()) to force the
// setup code in libprofile-extras be linked into the
// binary/library.
//
// We cannot narrow it further to only the 'cov' variant since
// the mutator hasn't run (and we don't have the 'cov' variant
// yet).
if !ctx.useSdk() {
deps.LateStaticLibs = append(deps.LateStaticLibs, "libprofile-extras")
} else {
deps.LateStaticLibs = append(deps.LateStaticLibs, "libprofile-extras_ndk")
}
}
return deps
}
@@ -96,6 +113,9 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags) Flags {
if cov.linkCoverage {
flags.LdFlags = append(flags.LdFlags, "--coverage")
// Force linking of constructor/setup code in libprofile-extras
flags.LdFlags = append(flags.LdFlags, "-uinit_profile_extras")
}
return flags
@@ -113,10 +133,8 @@ 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 if ctx.isStubs() {
// Do not enable coverage for platform stub libraries
} else if ctx.isNDKStubLibrary() {
// Do not enable coverage for NDK stub libraries
} else if !ctx.nativeCoverage() {
// Native coverage is not supported for this module type.
} else {
// Check if Native_coverage is set to false. This property defaults to true.
needCoverageVariant = BoolDefault(cov.Properties.Native_coverage, true)

View File

@@ -761,6 +761,13 @@ func (library *libraryDecorator) unstrippedOutputFilePath() android.Path {
return library.unstrippedOutputFile
}
func (library *libraryDecorator) nativeCoverage() bool {
if library.header() || library.buildStubs() {
return false
}
return true
}
func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android.Path {
isLlndk := inList(ctx.baseModuleName(), llndkLibraries) || inList(ctx.baseModuleName(), ndkMigratedLibs)

View File

@@ -161,6 +161,10 @@ func (stub *llndkStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDe
return stub.libraryDecorator.link(ctx, flags, deps, objs)
}
func (stub *llndkStubDecorator) nativeCoverage() bool {
return false
}
func NewLLndkStubLibrary() *Module {
module, library := NewLibrary(android.DeviceSupported)
library.BuildOnlyShared()

View File

@@ -338,6 +338,10 @@ func (stub *stubDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps,
return stub.libraryDecorator.link(ctx, flags, deps, objs)
}
func (stub *stubDecorator) nativeCoverage() bool {
return false
}
func (stub *stubDecorator) install(ctx ModuleContext, path android.Path) {
arch := ctx.Target().Arch.ArchType.Name
apiLevel := stub.properties.ApiLevel

View File

@@ -114,3 +114,7 @@ func (object *objectLinker) link(ctx ModuleContext,
func (object *objectLinker) unstrippedOutputFilePath() android.Path {
return nil
}
func (object *objectLinker) nativeCoverage() bool {
return true
}

View File

@@ -108,6 +108,10 @@ func (p *prebuiltLibraryLinker) shared() bool {
return p.libraryDecorator.shared()
}
func (p *prebuiltLibraryLinker) nativeCoverage() bool {
return false
}
func prebuiltSharedLibraryFactory() android.Module {
module, _ := NewPrebuiltSharedLibrary(android.HostAndDeviceSupported)
return module.Init()

View File

@@ -77,3 +77,7 @@ func (library *toolchainLibraryDecorator) link(ctx ModuleContext,
return android.PathForSource(ctx, *library.Properties.Src)
}
func (library *toolchainLibraryDecorator) nativeCoverage() bool {
return false
}