Description
I tried this code:
use num_integer::Roots;
fn main() {
let a:u32 = 54321;
let c = a.cbrt();
println!("Hello, world {} {}!", a, c);
}
compiled with RUSTFLAGS="-Zinstrument-coverage -C opt-level=1"
and Cargo.toml having
[dependencies]
num-integer = "0.1"
I expected to see this happen:
Running llvm-profdata merge -j=1 -sparse
, then llvm-cov should give me a coverage report
Instead, this happened:
llvm-cov fails with `Failed to load coverage: Malformed instrumentation profile data
When building with -C opt-level=0
, the buggy behavior does not show up with this reproducer
Meta
rustc --version --verbose
:
rustc 1.52.0-nightly (07194ffcd 2021-02-10)
binary: rustc
commit-hash: 07194ffcd25b0871ce560b9f702e52db27ac9f77
commit-date: 2021-02-10
host: x86_64-unknown-linux-gnu
release: 1.52.0-nightly
LLVM version: 11.0.1
Backtrace
There is no backtrace here as the failure happens with llvm-cov
I used the following clang
clang --version
clang version 12.0.0 (https://github.com/llvm/llvm-project.git f086e85eea94a51eb42115496ac5d24f07bc8791)
Using this patch in clang
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
index b75738bc360c..1ad5d930eafd 100644
--- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
+++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
@@ -525,7 +525,8 @@ class VersionedCovMapFuncRecordReader : public CovMapFuncRecordReader {
if (Error Err = CFR->template getFuncName<Endian>(ProfileNames, FuncName))
return Err;
if (FuncName.empty())
- return make_error<InstrProfError>(instrprof_error::malformed);
+ FuncName = "lola";
+ //return make_error<InstrProfError>(instrprof_error::malformed);
++CovMapNumUsedRecords;
Records.emplace_back(Version, FuncName, FuncHash, Mapping,
FileRange.StartingIndex, FileRange.Length);
I get more information with
./bin/llvm-cov show -name-regex="lol" -instr-profile=dump.profdata -object=/path/to/rustbinary
It shows the pretendedly unnamed function code which can be found here https://github.com/rust-num/num-integer/blob/master/src/roots.rs#L174
174| 0|fn fixpoint<T, F>(mut x: T, f: F) -> T
175| 0|where
176| 0| T: Integer + Copy,
177| 0| F: Fn(T) -> T,
178| 0|{
...
cc @richkadel
Original discussion comes from google/oss-fuzz#4697