diff options
author | Yuchen Wu <yuchenericwu@hotmail.com> | 2013-10-25 02:22:21 +0000 |
---|---|---|
committer | Yuchen Wu <yuchenericwu@hotmail.com> | 2013-10-25 02:22:21 +0000 |
commit | 14ae8e6195ac01b02e663d3436fa82cb9b1e9cd0 (patch) | |
tree | 05dc9358f6a2078f8e4e581140f0b22402fc5640 | |
parent | b09388569655f44edd4a4282f3af316db2838a92 (diff) | |
download | bcm5719-llvm-14ae8e6195ac01b02e663d3436fa82cb9b1e9cd0.tar.gz bcm5719-llvm-14ae8e6195ac01b02e663d3436fa82cb9b1e9cd0.zip |
Support for reading program counts in llvm-cov.
llvm-cov will now be able to read program counts from the GCDA file and
output it in the same format as gcov. The program summary tag was
identified from gcov-io.h as "\0\0\0\a3".
There is currently a bug in GCOVProfiling.cpp which does not generate
the
run- or program-counting IR, so this change was tested manually by
modifying the GCDA file and comparing the gcov and llvm-cov outputs.
llvm-svn: 193389
-rw-r--r-- | llvm/include/llvm/Support/GCOV.h | 18 | ||||
-rw-r--r-- | llvm/lib/IR/GCOV.cpp | 29 |
2 files changed, 34 insertions, 13 deletions
diff --git a/llvm/include/llvm/Support/GCOV.h b/llvm/include/llvm/Support/GCOV.h index 4bcd0ed0c39..ef1a4ebd713 100644 --- a/llvm/include/llvm/Support/GCOV.h +++ b/llvm/include/llvm/Support/GCOV.h @@ -126,6 +126,19 @@ public: return true; } + /// readProgramTag - If cursor points to a program summary tag then increment + /// the cursor and return true otherwise return false. + bool readProgramTag() { + StringRef Tag = Buffer->getBuffer().slice(Cursor, Cursor+4); + if (Tag.empty() || + Tag[0] != '\0' || Tag[1] != '\0' || + Tag[2] != '\0' || Tag[3] != '\xa3') { + return false; + } + Cursor += 4; + return true; + } + uint32_t readInt() { uint32_t Result; StringRef Str = Buffer->getBuffer().slice(Cursor, Cursor+4); @@ -159,13 +172,14 @@ private: /// (.gcno and .gcda). class GCOVFile { public: - GCOVFile() {} + GCOVFile() : Functions(), ProgramCount(0) {} ~GCOVFile(); bool read(GCOVBuffer &Buffer); void dump(); void collectLineCounts(FileInfo &FI); private: SmallVector<GCOVFunction *, 16> Functions; + uint32_t ProgramCount; }; /// GCOVFunction - Collects function information. @@ -220,9 +234,11 @@ public: void addLineCount(StringRef Filename, uint32_t Line, uint64_t Count) { LineInfo[Filename][Line-1] += Count; } + void setProgramCount(uint32_t PC) { ProgramCount = PC; } void print(StringRef gcnoFile, StringRef gcdaFile); private: StringMap<LineCounts> LineInfo; + uint32_t ProgramCount; }; } diff --git a/llvm/lib/IR/GCOV.cpp b/llvm/lib/IR/GCOV.cpp index 908523a3a66..fe8ebb2e9a2 100644 --- a/llvm/lib/IR/GCOV.cpp +++ b/llvm/lib/IR/GCOV.cpp @@ -44,21 +44,24 @@ bool GCOVFile::read(GCOVBuffer &Buffer) { if (Format == GCOV::InvalidGCOV) return false; - unsigned i = 0; - while (1) { - GCOVFunction *GFun = NULL; - if (isGCDAFile(Format)) { - // Use existing function while reading .gcda file. - assert(i < Functions.size() && ".gcda data does not match .gcno data"); - GFun = Functions[i]; - } else if (isGCNOFile(Format)) { - GFun = new GCOVFunction(); + if (isGCNOFile(Format)) { + while (true) { + GCOVFunction *GFun = new GCOVFunction(); + if (!GFun->read(Buffer, Format)) + break; Functions.push_back(GFun); } - if (!GFun || !GFun->read(Buffer, Format)) - break; - ++i; } + else if (isGCDAFile(Format)) { + for (size_t i = 0, e = Functions.size(); i < e; ++i) { + bool ReadGCDA = Functions[i]->read(Buffer, Format); + (void)ReadGCDA; + assert(ReadGCDA && ".gcda data does not match .gcno data"); + } + while (Buffer.readProgramTag()) + ++ProgramCount; + } + return true; } @@ -75,6 +78,7 @@ void GCOVFile::collectLineCounts(FileInfo &FI) { for (SmallVectorImpl<GCOVFunction *>::iterator I = Functions.begin(), E = Functions.end(); I != E; ++I) (*I)->collectLineCounts(FI); + FI.setProgramCount(ProgramCount); } //===----------------------------------------------------------------------===// @@ -252,6 +256,7 @@ void FileInfo::print(StringRef gcnoFile, StringRef gcdaFile) { outs() << " -: 0:Source:" << Filename << "\n"; outs() << " -: 0:Graph:" << gcnoFile << "\n"; outs() << " -: 0:Data:" << gcdaFile << "\n"; + outs() << " -: 0:Programs:" << ProgramCount << "\n"; LineCounts &L = LineInfo[Filename]; OwningPtr<MemoryBuffer> Buff; if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, Buff)) { |