From 71d697c5cbaa6ad0b2d92ab70f3dd5b91d039582 Mon Sep 17 00:00:00 2001 From: Pirama Arumuga Nainar Date: Tue, 8 Jun 2021 16:05:18 -0700 Subject: [PATCH] Enable memory-mapped coverage instrumentation Bug: http://b/194128476 Bug: http://b/210012154 - pass -runtime-counter-relocation flag, which is needed to enable memory-mapped coverage on Linux/Android. - Include '%c' specifier in -fprofile-instr-generate compiler flag to default to memory-mapped coverage. - Disable continuous coverage if instrumentation is on for bionic/libc (http://b/210012154). Test: Run few coverage tests on Forrest. Change-Id: Ie3a912f66470fcd3ffc2ffd73371a4e1d2b15df3 --- cc/coverage.go | 12 ++++++++++++ rust/coverage.go | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/cc/coverage.go b/cc/coverage.go index 8dd2db19d..59c886439 100644 --- a/cc/coverage.go +++ b/cc/coverage.go @@ -22,6 +22,7 @@ import ( "android/soong/android" ) +// Add '%c' to default specifier after we resolve http://b/210012154 const profileInstrFlag = "-fprofile-instr-generate=/data/misc/trace/clang-%p-%m.profraw" type CoverageProperties struct { @@ -77,6 +78,11 @@ func (cov *coverage) deps(ctx DepsContext, deps Deps) Deps { return deps } +func EnableContinuousCoverage(ctx android.BaseModuleContext) bool { + // http://b/210012154 Disable continuous coverage if we're instrumenting bionic/libc. + return !ctx.DeviceConfig().NativeCoverageEnabledForPath("bionic/libc") +} + func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags, PathDeps) { clangCoverage := ctx.DeviceConfig().ClangCoverageEnabled() gcovCoverage := ctx.DeviceConfig().GcovCoverageEnabled() @@ -98,6 +104,9 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags } else if clangCoverage { flags.Local.CommonFlags = append(flags.Local.CommonFlags, profileInstrFlag, "-fcoverage-mapping", "-Wno-pass-failed", "-D__ANDROID_CLANG_COVERAGE__") + if EnableContinuousCoverage(ctx) { + flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-mllvm", "-runtime-counter-relocation") + } } } @@ -149,6 +158,9 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--wrap,getenv") } else if clangCoverage { flags.Local.LdFlags = append(flags.Local.LdFlags, profileInstrFlag) + if EnableContinuousCoverage(ctx) { + flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,-mllvm=-runtime-counter-relocation") + } coverage := ctx.GetDirectDepWithTag(getClangProfileLibraryName(ctx), CoverageDepTag).(*Module) deps.WholeStaticLibs = append(deps.WholeStaticLibs, coverage.OutputFile().Path()) diff --git a/rust/coverage.go b/rust/coverage.go index 8fdfa2342..91d34acce 100644 --- a/rust/coverage.go +++ b/rust/coverage.go @@ -22,6 +22,7 @@ import ( var CovLibraryName = "libprofile-clang-extras" +// Add '%c' to default specifier after we resolve http://b/210012154 const profileInstrFlag = "-fprofile-instr-generate=/data/misc/trace/clang-%p-%m.profraw" type coverage struct { @@ -70,6 +71,10 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags "-Wl,-z,nostart-stop-gc", ) deps.StaticLibs = append(deps.StaticLibs, coverage.OutputFile().Path()) + if cc.EnableContinuousCoverage(ctx) { + flags.RustFlags = append(flags.RustFlags, "-C llvm-args=--runtime-counter-relocation") + flags.LinkFlags = append(flags.LinkFlags, "-Wl,-mllvm,-runtime-counter-relocation") + } } return flags, deps