[llvm] r260162 - llvm-cov: Fix reading gcov data that does not have function names

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 8 14:49:41 PST 2016


Author: bogner
Date: Mon Feb  8 16:49:40 2016
New Revision: 260162

URL: http://llvm.org/viewvc/llvm-project?rev=260162&view=rev
Log:
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!

Added:
    llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcda
    llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcno
    llvm/trunk/test/tools/llvm-cov/gcov47_compatibility.cpp
Modified:
    llvm/trunk/lib/IR/GCOV.cpp

Modified: llvm/trunk/lib/IR/GCOV.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/GCOV.cpp?rev=260162&r1=260161&r2=260162&view=diff
==============================================================================
--- llvm/trunk/lib/IR/GCOV.cpp (original)
+++ llvm/trunk/lib/IR/GCOV.cpp Mon Feb  8 16:49:40 2016
@@ -248,10 +248,12 @@ bool GCOVFunction::readGCNO(GCOVBuffer &
 /// 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 &
     }
   }
 
-  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()) {

Added: llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcda
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcda?rev=260162&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcda (added) and llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcda Mon Feb  8 16:49:40 2016 differ

Added: llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcno
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcno?rev=260162&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcno (added) and llvm/trunk/test/tools/llvm-cov/Inputs/gcov47_compatibility.gcno Mon Feb  8 16:49:40 2016 differ

Added: llvm/trunk/test/tools/llvm-cov/gcov47_compatibility.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/gcov47_compatibility.cpp?rev=260162&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/gcov47_compatibility.cpp (added)
+++ llvm/trunk/test/tools/llvm-cov/gcov47_compatibility.cpp Mon Feb  8 16:49:40 2016
@@ -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




More information about the llvm-commits mailing list