mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
llvm-cov: Fix reading gcov data that does not have function names
In order for recent gcov versions to read the coverage data, you have to use UseCfgChecksum=true and FunctionNamesInData=false options for coverage profiling pass. This is because gcov is expecting the function section in .gcda to be exactly 3 words in size, containing ident and two checksums. While llvm-cov is compatible with UseCfgChecksum=true, it always expects a function name in .gcda function sections (it's not compatible with FunctionNamesInData=false). Thus it's currently impossible to generate one set of coverage files that works with both gcov and llvm-cov. This change fixes the reading of coverage information to only read the function name if it's present. Patch by Arseny Kapoulkine. Thanks! llvm-svn: 260162
This commit is contained in:
parent
edbd3d1ae7
commit
072ef25de8
@ -248,10 +248,12 @@ bool GCOVFunction::readGCNO(GCOVBuffer &Buff, GCOV::GCOVVersion Version) {
|
||||
/// readGCDA - Read a function from the GCDA buffer. Return false if an error
|
||||
/// occurs.
|
||||
bool GCOVFunction::readGCDA(GCOVBuffer &Buff, GCOV::GCOVVersion Version) {
|
||||
uint32_t Dummy;
|
||||
if (!Buff.readInt(Dummy))
|
||||
uint32_t HeaderLength;
|
||||
if (!Buff.readInt(HeaderLength))
|
||||
return false; // Function header length
|
||||
|
||||
uint64_t EndPos = Buff.getCursor() + HeaderLength * sizeof(uint32_t);
|
||||
|
||||
uint32_t GCDAIdent;
|
||||
if (!Buff.readInt(GCDAIdent))
|
||||
return false;
|
||||
@ -281,13 +283,15 @@ bool GCOVFunction::readGCDA(GCOVBuffer &Buff, GCOV::GCOVVersion Version) {
|
||||
}
|
||||
}
|
||||
|
||||
StringRef GCDAName;
|
||||
if (!Buff.readString(GCDAName))
|
||||
return false;
|
||||
if (Name != GCDAName) {
|
||||
errs() << "Function names do not match: " << Name << " != " << GCDAName
|
||||
<< ".\n";
|
||||
return false;
|
||||
if (Buff.getCursor() < EndPos) {
|
||||
StringRef GCDAName;
|
||||
if (!Buff.readString(GCDAName))
|
||||
return false;
|
||||
if (Name != GCDAName) {
|
||||
errs() << "Function names do not match: " << Name << " != " << GCDAName
|
||||
<< ".\n";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Buff.readArcTag()) {
|
||||
|
BIN
test/tools/llvm-cov/Inputs/gcov47_compatibility.gcda
Normal file
BIN
test/tools/llvm-cov/Inputs/gcov47_compatibility.gcda
Normal file
Binary file not shown.
BIN
test/tools/llvm-cov/Inputs/gcov47_compatibility.gcno
Normal file
BIN
test/tools/llvm-cov/Inputs/gcov47_compatibility.gcno
Normal file
Binary file not shown.
30
test/tools/llvm-cov/gcov47_compatibility.cpp
Normal file
30
test/tools/llvm-cov/gcov47_compatibility.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
// Make sure that llvm-cov can read coverage data written in gcov47+ compatible
|
||||
// format.
|
||||
|
||||
// Compile with these arguments and run the result to generate .gc* files:
|
||||
// -coverage -Xclang -coverage-no-function-names-in-data
|
||||
// -Xclang -coverage-cfg-checksum -Xclang -coverage-version='407*'
|
||||
|
||||
// We need shell for cd
|
||||
// REQUIRES: shell
|
||||
|
||||
// RUN: rm -rf %t
|
||||
// RUN: mkdir %t
|
||||
// RUN: cd %t
|
||||
// RUN: cp %s %p/Inputs/gcov47_compatibility.gc* .
|
||||
|
||||
// RUN: llvm-cov gcov gcov47_compatibility.cpp | FileCheck %s --check-prefix=STDOUT
|
||||
// STDOUT: File 'gcov47_compatibility.cpp'
|
||||
// STDOUT: Lines executed:100.00% of 1
|
||||
// STDOUT: gcov47_compatibility.cpp:creating 'gcov47_compatibility.cpp.gcov'
|
||||
|
||||
// RUN: FileCheck %s --check-prefix=GCOV < %t/gcov47_compatibility.cpp.gcov
|
||||
// GCOV: -: 0:Runs:1
|
||||
// GCOV: -: 0:Programs:1
|
||||
|
||||
int main(int argc, const char *argv[]) { // GCOV: -: [[@LINE]]:int main(
|
||||
return 0; // GCOV: 1: [[@LINE]]: return
|
||||
} // GCOV: -: [[@LINE]]:}
|
||||
|
||||
// llvm-cov doesn't work on big endian yet
|
||||
// XFAIL: powerpc64-, s390x, mips-, mips64-, sparc
|
Loading…
Reference in New Issue
Block a user