[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