From 9ef9cb8b3f19e1d266863fe752bf168e8e35ffd4 Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Tue, 14 Feb 2023 10:56:14 -0500 Subject: [PATCH] rust: Fix coverage in no-std crates Coverage builds for no_std crates currently fail because profiler_builtins are part of libstd and therefore do not get included. When calculating the dependencies for coverage enabled targets, check if the stdlib is being included, and if it is not then pull the profiler_builtins sysroot. Bug: 249551848 Test: CLANG_COVERAGE=true NATIVE_COVERAGE_PATHS='*' make libtinyvec_nostd.rlib-std Change-Id: I73f89bddcb2d4d9c704cb3962ee39b73888c7f3f --- rust/compiler.go | 4 ++++ rust/coverage.go | 13 +++++++++++++ rust/rust.go | 1 + 3 files changed, 18 insertions(+) diff --git a/rust/compiler.go b/rust/compiler.go index 8ec42f079..31acd49cb 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -208,6 +208,10 @@ func (compiler *baseCompiler) SetDisabled() { panic("baseCompiler does not implement SetDisabled()") } +func (compiler *baseCompiler) noStdlibs() bool { + return Bool(compiler.Properties.No_stdlibs) +} + func (compiler *baseCompiler) coverageOutputZipPath() android.OptionalPath { panic("baseCompiler does not implement coverageOutputZipPath()") } diff --git a/rust/coverage.go b/rust/coverage.go index 5ea481fcf..bc6504ddc 100644 --- a/rust/coverage.go +++ b/rust/coverage.go @@ -21,6 +21,7 @@ import ( ) var CovLibraryName = "libprofile-clang-extras" +var ProfilerBuiltins = "libprofiler_builtins.rust_sysroot" // Add '%c' to default specifier after we resolve http://b/210012154 const profileInstrFlag = "-fprofile-instr-generate=/data/misc/trace/clang-%p-%m.profraw" @@ -41,6 +42,11 @@ func (cov *coverage) deps(ctx DepsContext, deps Deps) Deps { ctx.AddVariationDependencies([]blueprint.Variation{ {Mutator: "link", Variation: "static"}, }, cc.CoverageDepTag, CovLibraryName) + + // no_std modules are missing libprofiler_builtins which provides coverage, so we need to add it as a dependency. + if rustModule, ok := ctx.Module().(*Module); ok && rustModule.compiler.noStdlibs() { + ctx.AddVariationDependencies([]blueprint.Variation{{Mutator: "rust_libraries", Variation: "rlib"}}, rlibDepTag, ProfilerBuiltins) + } } return deps @@ -60,6 +66,13 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags flags.LinkFlags = append(flags.LinkFlags, profileInstrFlag, "-g", coverage.OutputFile().Path().String(), "-Wl,--wrap,open") deps.StaticLibs = append(deps.StaticLibs, coverage.OutputFile().Path()) + + // no_std modules are missing libprofiler_builtins which provides coverage, so we need to add it as a dependency. + if rustModule, ok := ctx.Module().(*Module); ok && rustModule.compiler.noStdlibs() { + profiler_builtins := ctx.GetDirectDepWithTag(ProfilerBuiltins, rlibDepTag).(*Module) + deps.RLibs = append(deps.RLibs, RustLibrary{Path: profiler_builtins.OutputFile().Path(), CrateName: profiler_builtins.CrateName()}) + } + 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") diff --git a/rust/rust.go b/rust/rust.go index 67e0d7c03..e4cf67129 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -490,6 +490,7 @@ type compiler interface { SetDisabled() stdLinkage(ctx *depsContext) RustLinkage + noStdlibs() bool unstrippedOutputFilePath() android.Path strippedOutputFilePath() android.OptionalPath