[llvm] r194033 - Support for reading run counts in llvm-cov.

Yuchen Wu yuchenericwu at hotmail.com
Mon Nov 4 17:11:58 PST 2013


Author: ywu
Date: Mon Nov  4 19:11:58 2013
New Revision: 194033

URL: http://llvm.org/viewvc/llvm-project?rev=194033&view=rev
Log:
Support for reading run counts in llvm-cov.

This patch enables llvm-cov to correctly output the run count stored in
the GCDA file. GCOVProfiling currently does not generate this
information, so the GCDA run data had to be hacked on from a GCDA file
generated by gcc. This is corrected by a subsequent patch.

With the run and program data included, both llvm-cov and gcov produced
the same output.

Modified:
    llvm/trunk/include/llvm/Support/GCOV.h
    llvm/trunk/lib/IR/GCOV.cpp

Modified: llvm/trunk/include/llvm/Support/GCOV.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/GCOV.h?rev=194033&r1=194032&r2=194033&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/GCOV.h (original)
+++ llvm/trunk/include/llvm/Support/GCOV.h Mon Nov  4 19:11:58 2013
@@ -126,6 +126,19 @@ public:
     return true;
   }
 
+  /// readObjectTag - If cursor points to an object summary tag then increment
+  /// the cursor and return true otherwise return false.
+  bool readObjectTag() {
+    StringRef Tag = Buffer->getBuffer().slice(Cursor, Cursor+4);
+    if (Tag.empty() ||
+        Tag[0] != '\0' || Tag[1] != '\0' ||
+        Tag[2] != '\0' || Tag[3] != '\xa1') {
+      return false;
+    }
+    Cursor += 4;
+    return true;
+  }
+
   /// readProgramTag - If cursor points to a program summary tag then increment
   /// the cursor and return true otherwise return false.
   bool readProgramTag() {
@@ -163,6 +176,7 @@ public:
   }
 
   uint64_t getCursor() const { return Cursor; }
+  void advanceCursor(uint32_t n) { Cursor += n*4; }
 private:
   MemoryBuffer *Buffer;
   uint64_t Cursor;
@@ -172,13 +186,14 @@ private:
 /// (.gcno and .gcda).
 class GCOVFile {
 public:
-  GCOVFile() : Functions(), ProgramCount(0) {}
+  GCOVFile() : Functions(), RunCount(0), ProgramCount(0) {}
   ~GCOVFile();
   bool read(GCOVBuffer &Buffer);
   void dump();
   void collectLineCounts(FileInfo &FI);
 private:
   SmallVector<GCOVFunction *, 16> Functions;
+  uint32_t RunCount;
   uint32_t ProgramCount;
 };
 
@@ -234,10 +249,12 @@ public:
   void addLineCount(StringRef Filename, uint32_t Line, uint64_t Count) {
     LineInfo[Filename][Line-1] += Count;
   }
-  void setProgramCount(uint32_t PC) { ProgramCount = PC; }
+  void setRunCount(uint32_t Runs) { RunCount = Runs; }
+  void setProgramCount(uint32_t Programs) { ProgramCount = Programs; }
   void print(raw_fd_ostream &OS, StringRef gcnoFile, StringRef gcdaFile);
 private:
   StringMap<LineCounts> LineInfo;
+  uint32_t RunCount;
   uint32_t ProgramCount;
 };
 

Modified: llvm/trunk/lib/IR/GCOV.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/GCOV.cpp?rev=194033&r1=194032&r2=194033&view=diff
==============================================================================
--- llvm/trunk/lib/IR/GCOV.cpp (original)
+++ llvm/trunk/lib/IR/GCOV.cpp Mon Nov  4 19:11:58 2013
@@ -59,8 +59,18 @@ bool GCOVFile::read(GCOVBuffer &Buffer)
       (void)ReadGCDA;
       assert(ReadGCDA && ".gcda data does not match .gcno data");
     }
-    while (Buffer.readProgramTag())
+    if (Buffer.readObjectTag()) {
+      uint32_t Length = Buffer.readInt();
+      Buffer.readInt(); // checksum
+      Buffer.readInt(); // num
+      RunCount = Buffer.readInt();
+      Buffer.advanceCursor(Length-3);
+    }
+    while (Buffer.readProgramTag()) {
+      uint32_t Length = Buffer.readInt();
+      Buffer.advanceCursor(Length);
       ++ProgramCount;
+    }
   }
 
   return true;
@@ -79,6 +89,7 @@ void GCOVFile::collectLineCounts(FileInf
   for (SmallVectorImpl<GCOVFunction *>::iterator I = Functions.begin(),
          E = Functions.end(); I != E; ++I) 
     (*I)->collectLineCounts(FI);
+  FI.setRunCount(RunCount);
   FI.setProgramCount(ProgramCount);
 }
 
@@ -258,6 +269,7 @@ void FileInfo::print(raw_fd_ostream &OS,
     OS << "        -:    0:Source:" << Filename << "\n";
     OS << "        -:    0:Graph:" << gcnoFile << "\n";
     OS << "        -:    0:Data:" << gcdaFile << "\n";
+    OS << "        -:    0:Runs:" << RunCount << "\n";
     OS << "        -:    0:Programs:" << ProgramCount << "\n";
     LineCounts &L = LineInfo[Filename];
     OwningPtr<MemoryBuffer> Buff;





More information about the llvm-commits mailing list