Support coverage instrumentation for Linux host

am: 358056c058

Change-Id: Ie8a42f2e7cc8d80041ae5f6f0fc6c2ddb29b0c37
This commit is contained in:
Pirama Arumuga Nainar 2018-04-23 14:04:42 -07:00 committed by android-build-merger
commit ba4d455e87
5 changed files with 38 additions and 10 deletions

View file

@ -40,6 +40,7 @@ func init() {
ctx.BottomUp("ndk_api", ndkApiMutator).Parallel()
ctx.BottomUp("test_per_src", testPerSrcMutator).Parallel()
ctx.BottomUp("begin", beginMutator).Parallel()
ctx.BottomUp("coverage", coverageLinkingMutator).Parallel()
})
android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
@ -54,7 +55,6 @@ func init() {
ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator())
ctx.BottomUp("coverage", coverageLinkingMutator).Parallel()
ctx.TopDown("vndk_deps", sabiDepsMutator)
ctx.TopDown("lto_deps", ltoDepsMutator)
@ -809,12 +809,15 @@ func (c *Module) deps(ctx DepsContext) Deps {
if c.compiler != nil {
deps = c.compiler.compilerDeps(ctx, deps)
}
// Add the PGO dependency (the clang_rt.profile runtime library), which
// sometimes depends on symbols from libgcc, before libgcc gets added
// in linkerDeps().
// clang_rt.profile runtime libraries necessary for PGO and coverage
// depend on symbols from libgcc. Add the runtime library dependency
// before libgcc gets added in linkerDeps().
if c.pgo != nil {
deps = c.pgo.deps(ctx, deps)
}
if c.coverage != nil {
deps = c.coverage.deps(ctx, deps)
}
if c.linker != nil {
deps = c.linker.linkerDeps(ctx, deps)
}
@ -824,9 +827,6 @@ func (c *Module) deps(ctx DepsContext) Deps {
if c.sanitize != nil {
deps = c.sanitize.deps(ctx, deps)
}
if c.coverage != nil {
deps = c.coverage.deps(ctx, deps)
}
if c.sabi != nil {
deps = c.sabi.deps(ctx, deps)
}

View file

@ -85,6 +85,8 @@ type Toolchain interface {
AvailableLibraries() []string
Bionic() bool
profileRuntimeLibrary() string
}
type toolchainBase struct {
@ -169,6 +171,10 @@ func (toolchainBase) Bionic() bool {
return true
}
func (t toolchainBase) profileRuntimeLibrary() string {
return ""
}
func (t toolchainBase) ToolPath() string {
return ""
}
@ -240,6 +246,12 @@ func ThreadSanitizerRuntimeLibrary(t Toolchain) string {
}
func ProfileRuntimeLibrary(t Toolchain) string {
lib := t.profileRuntimeLibrary()
if lib != "" {
// Return the directly exported profile library
return lib
}
// Return the Android-specific library
return SanitizerRuntimeLibrary(t, "profile")
}

View file

@ -151,6 +151,10 @@ func (t *toolchainLinuxBionic) Bionic() bool {
return true
}
func (t *toolchainLinuxBionic) profileRuntimeLibrary() string {
return "libclang_rt.profile-x86_64"
}
var toolchainLinuxBionicSingleton Toolchain = &toolchainLinuxBionic{}
func linuxBionicToolchainFactory(arch android.Arch) Toolchain {

View file

@ -270,6 +270,14 @@ func (t *toolchainLinuxX8664) YasmFlags() string {
return "${config.LinuxX8664YasmFlags}"
}
func (t *toolchainLinuxX86) profileRuntimeLibrary() string {
return "libclang_rt.profile-i386"
}
func (t *toolchainLinuxX8664) profileRuntimeLibrary() string {
return "libclang_rt.profile-x86_64"
}
func (t *toolchainLinux) AvailableLibraries() []string {
return linuxAvailableLibraries
}

View file

@ -16,6 +16,7 @@ package cc
import (
"android/soong/android"
"android/soong/cc/config"
)
type CoverageProperties struct {
@ -38,6 +39,10 @@ func (cov *coverage) props() []interface{} {
func (cov *coverage) begin(ctx BaseModuleContext) {}
func (cov *coverage) deps(ctx BaseModuleContext, deps Deps) Deps {
if cov.Properties.CoverageEnabled {
runtimeLibrary := config.ProfileRuntimeLibrary(ctx.toolchain())
deps.LateStaticLibs = append(deps.LateStaticLibs, runtimeLibrary)
}
return deps
}
@ -99,9 +104,8 @@ func coverageLinkingMutator(mctx android.BottomUpMutatorContext) {
if !mctx.DeviceConfig().NativeCoverageEnabled() {
// Coverage is disabled globally
} else if mctx.Host() {
// TODO(dwillemsen): because of -nodefaultlibs, we must depend on libclang_rt.profile-*.a
// Just turn off for now.
} else if mctx.Darwin() || mctx.Windows() {
// Coverage not supported for Darwin and Windows
} else if c.coverage.Properties.Native_coverage != nil {
enabled = *c.coverage.Properties.Native_coverage
} else {