diff --git a/include/llvm/Support/GCOV.h b/include/llvm/Support/GCOV.h index f1e7998bc4b..4bcd0ed0c39 100644 --- a/include/llvm/Support/GCOV.h +++ b/include/llvm/Support/GCOV.h @@ -191,7 +191,8 @@ public: ~GCOVBlock(); void addEdge(uint32_t N) { Edges.push_back(N); } void addLine(StringRef Filename, uint32_t LineNo); - void addCount(uint64_t N) { Counter = N; } + void addCount(uint64_t N) { Counter += N; } + size_t getNumEdges() { return Edges.size(); } void dump(); void collectLineCounts(FileInfo &FI); private: @@ -217,7 +218,7 @@ typedef DenseMap<uint32_t, uint64_t> LineCounts; class FileInfo { public: void addLineCount(StringRef Filename, uint32_t Line, uint64_t Count) { - LineInfo[Filename][Line-1] = Count; + LineInfo[Filename][Line-1] += Count; } void print(StringRef gcnoFile, StringRef gcdaFile); private: diff --git a/lib/IR/GCOV.cpp b/lib/IR/GCOV.cpp index 68b91e6dc9a..908523a3a66 100644 --- a/lib/IR/GCOV.cpp +++ b/lib/IR/GCOV.cpp @@ -103,9 +103,18 @@ bool GCOVFunction::read(GCOVBuffer &Buff, GCOV::GCOVFormat Format) { if (Format == GCOV::GCDA_402 || Format == GCOV::GCDA_404) { Buff.readArcTag(); + uint32_t i = 0; uint32_t Count = Buff.readInt() / 2; - for (unsigned i = 0, e = Count; i != e; ++i) { - Blocks[i]->addCount(Buff.readInt64()); + + // This for loop adds the counts for each block. A second nested loop is + // required to combine the edge counts that are contained in the GCDA file. + for (uint32_t Line = 0; i < Count; ++Line) { + GCOVBlock &Block = *Blocks[Line]; + for (size_t Edge = 0, End = Block.getNumEdges(); Edge < End; ++Edge) { + assert(i < Count && "Unexpected number of Edges!"); + Block.addCount(Buff.readInt64()); + ++i; + } } return true; }