1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 11:33:24 +02:00

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.

llvm-svn: 194033
This commit is contained in:
Yuchen Wu 2013-11-05 01:11:58 +00:00
parent 4e1620cfb1
commit ed0b7b997b
2 changed files with 32 additions and 3 deletions

View File

@ -126,6 +126,19 @@ public:
return true; 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 /// readProgramTag - If cursor points to a program summary tag then increment
/// the cursor and return true otherwise return false. /// the cursor and return true otherwise return false.
bool readProgramTag() { bool readProgramTag() {
@ -163,6 +176,7 @@ public:
} }
uint64_t getCursor() const { return Cursor; } uint64_t getCursor() const { return Cursor; }
void advanceCursor(uint32_t n) { Cursor += n*4; }
private: private:
MemoryBuffer *Buffer; MemoryBuffer *Buffer;
uint64_t Cursor; uint64_t Cursor;
@ -172,13 +186,14 @@ private:
/// (.gcno and .gcda). /// (.gcno and .gcda).
class GCOVFile { class GCOVFile {
public: public:
GCOVFile() : Functions(), ProgramCount(0) {} GCOVFile() : Functions(), RunCount(0), ProgramCount(0) {}
~GCOVFile(); ~GCOVFile();
bool read(GCOVBuffer &Buffer); bool read(GCOVBuffer &Buffer);
void dump(); void dump();
void collectLineCounts(FileInfo &FI); void collectLineCounts(FileInfo &FI);
private: private:
SmallVector<GCOVFunction *, 16> Functions; SmallVector<GCOVFunction *, 16> Functions;
uint32_t RunCount;
uint32_t ProgramCount; uint32_t ProgramCount;
}; };
@ -234,10 +249,12 @@ public:
void addLineCount(StringRef Filename, uint32_t Line, uint64_t Count) { void addLineCount(StringRef Filename, uint32_t Line, uint64_t Count) {
LineInfo[Filename][Line-1] += 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); void print(raw_fd_ostream &OS, StringRef gcnoFile, StringRef gcdaFile);
private: private:
StringMap<LineCounts> LineInfo; StringMap<LineCounts> LineInfo;
uint32_t RunCount;
uint32_t ProgramCount; uint32_t ProgramCount;
}; };

View File

@ -59,8 +59,18 @@ bool GCOVFile::read(GCOVBuffer &Buffer) {
(void)ReadGCDA; (void)ReadGCDA;
assert(ReadGCDA && ".gcda data does not match .gcno data"); 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; ++ProgramCount;
}
} }
return true; return true;
@ -79,6 +89,7 @@ void GCOVFile::collectLineCounts(FileInfo &FI) {
for (SmallVectorImpl<GCOVFunction *>::iterator I = Functions.begin(), for (SmallVectorImpl<GCOVFunction *>::iterator I = Functions.begin(),
E = Functions.end(); I != E; ++I) E = Functions.end(); I != E; ++I)
(*I)->collectLineCounts(FI); (*I)->collectLineCounts(FI);
FI.setRunCount(RunCount);
FI.setProgramCount(ProgramCount); FI.setProgramCount(ProgramCount);
} }
@ -258,6 +269,7 @@ void FileInfo::print(raw_fd_ostream &OS, StringRef gcnoFile,
OS << " -: 0:Source:" << Filename << "\n"; OS << " -: 0:Source:" << Filename << "\n";
OS << " -: 0:Graph:" << gcnoFile << "\n"; OS << " -: 0:Graph:" << gcnoFile << "\n";
OS << " -: 0:Data:" << gcdaFile << "\n"; OS << " -: 0:Data:" << gcdaFile << "\n";
OS << " -: 0:Runs:" << RunCount << "\n";
OS << " -: 0:Programs:" << ProgramCount << "\n"; OS << " -: 0:Programs:" << ProgramCount << "\n";
LineCounts &L = LineInfo[Filename]; LineCounts &L = LineInfo[Filename];
OwningPtr<MemoryBuffer> Buff; OwningPtr<MemoryBuffer> Buff;