diff --git a/cc/coverage.go b/cc/coverage.go index cbd8a6f3e..393a8a6b4 100644 --- a/cc/coverage.go +++ b/cc/coverage.go @@ -22,6 +22,29 @@ import ( "android/soong/android" ) +var ( + clangCoverageHostLdFlags = []string{ + "-Wl,--no-as-needed", + "-Wl,--wrap,open", + } + clangContinuousCoverageFlags = []string{ + "-mllvm", + "-runtime-counter-relocation", + } + clangCoverageCFlags = []string{ + "-Wno-frame-larger-than=", + } + clangCoverageCommonFlags = []string{ + "-fcoverage-mapping", + "-Wno-pass-failed", + "-D__ANDROID_CLANG_COVERAGE__", + } + clangCoverageHWASanFlags = []string{ + "-mllvm", + "-hwasan-globals=0", + } +) + const profileInstrFlag = "-fprofile-instr-generate=/data/misc/trace/clang-%p-%m.profraw" type CoverageProperties struct { @@ -102,19 +125,19 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags // flags that the module may use. flags.Local.CFlags = append(flags.Local.CFlags, "-Wno-frame-larger-than=", "-O0") } else if clangCoverage { - flags.Local.CommonFlags = append(flags.Local.CommonFlags, profileInstrFlag, - "-fcoverage-mapping", "-Wno-pass-failed", "-D__ANDROID_CLANG_COVERAGE__") + flags.Local.CommonFlags = append(flags.Local.CommonFlags, profileInstrFlag) + flags.Local.CommonFlags = append(flags.Local.CommonFlags, clangCoverageCommonFlags...) // Override -Wframe-larger-than. We can expect frame size increase after // coverage instrumentation. - flags.Local.CFlags = append(flags.Local.CFlags, "-Wno-frame-larger-than=") + flags.Local.CFlags = append(flags.Local.CFlags, clangCoverageCFlags...) if EnableContinuousCoverage(ctx) { - flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-mllvm", "-runtime-counter-relocation") + flags.Local.CommonFlags = append(flags.Local.CommonFlags, clangContinuousCoverageFlags...) } // http://b/248022906, http://b/247941801 enabling coverage and hwasan-globals // instrumentation together causes duplicate-symbol errors for __llvm_profile_filename. if c, ok := ctx.Module().(*Module); ok && c.sanitize.isSanitizerEnabled(Hwasan) { - flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-mllvm", "-hwasan-globals=0") + flags.Local.CommonFlags = append(flags.Local.CommonFlags, clangCoverageHWASanFlags...) } } } diff --git a/cc/makevars.go b/cc/makevars.go index 6c3f551d7..70fdd57bf 100644 --- a/cc/makevars.go +++ b/cc/makevars.go @@ -123,6 +123,13 @@ func makeVarsProvider(ctx android.MakeVarsContext) { ctx.Strict("SOONG_MODULES_USING_WNO_ERROR", makeStringOfKeys(ctx, modulesUsingWnoErrorKey)) ctx.Strict("SOONG_MODULES_MISSING_PGO_PROFILE_FILE", makeStringOfKeys(ctx, modulesMissingProfileFileKey)) + ctx.Strict("CLANG_COVERAGE_CONFIG_CFLAGS", strings.Join(clangCoverageCFlags, " ")) + ctx.Strict("CLANG_COVERAGE_CONFIG_COMMFLAGS", strings.Join(clangCoverageCommonFlags, " ")) + ctx.Strict("CLANG_COVERAGE_HOST_LDFLAGS", strings.Join(clangCoverageHostLdFlags, " ")) + ctx.Strict("CLANG_COVERAGE_INSTR_PROFILE", profileInstrFlag) + ctx.Strict("CLANG_COVERAGE_CONTINUOUS_FLAGS", strings.Join(clangContinuousCoverageFlags, " ")) + ctx.Strict("CLANG_COVERAGE_HWASAN_FLAGS", strings.Join(clangCoverageHWASanFlags, " ")) + ctx.Strict("ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS", strings.Join(asanCflags, " ")) ctx.Strict("ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS", strings.Join(asanLdflags, " "))