diff options
-rw-r--r-- | include/llvm/Support/GCOV.h | 22 | ||||
-rw-r--r-- | lib/IR/GCOV.cpp | 54 | ||||
-rw-r--r-- | test/tools/llvm-cov/Inputs/test_read_fail.gcno | bin | 0 -> 111 bytes |
3 files changed, 21 insertions, 55 deletions
diff --git a/include/llvm/Support/GCOV.h b/include/llvm/Support/GCOV.h index d79c0f9a74..469a9e3ef9 100644 --- a/include/llvm/Support/GCOV.h +++ b/include/llvm/Support/GCOV.h @@ -25,7 +25,6 @@ namespace llvm { class GCOVFunction; class GCOVBlock; -class GCOVLines; class FileInfo; namespace GCOV { @@ -211,6 +210,7 @@ public: GCOVFunction() : Ident(0), LineNumber(0) {} ~GCOVFunction(); bool read(GCOVBuffer &Buffer, GCOV::GCOVFormat Format); + StringRef getFilename() const { return Filename; } void dump(); void collectLineCounts(FileInfo &FI); private: @@ -224,31 +224,21 @@ private: /// GCOVBlock - Collects block information. class GCOVBlock { public: - GCOVBlock(uint32_t N) : Number(N), Counter(0) {} + GCOVBlock(GCOVFunction &P, uint32_t N) : + Parent(P), Number(N), Counter(0), Edges(), Lines() {} ~GCOVBlock(); void addEdge(uint32_t N) { Edges.push_back(N); } - void addLine(StringRef Filename, uint32_t LineNo); + void addLine(uint32_t N) { Lines.push_back(N); } void addCount(uint64_t N) { Counter += N; } size_t getNumEdges() { return Edges.size(); } void dump(); void collectLineCounts(FileInfo &FI); private: + GCOVFunction &Parent; uint32_t Number; uint64_t Counter; SmallVector<uint32_t, 16> Edges; - StringMap<GCOVLines *> Lines; -}; - -/// GCOVLines - A wrapper around a vector of int to keep track of line nos. -class GCOVLines { -public: - ~GCOVLines() { Lines.clear(); } - void add(uint32_t N) { Lines.push_back(N); } - void collectLineCounts(FileInfo &FI, StringRef Filename, uint64_t Count); - void dump(); - -private: - SmallVector<uint32_t, 4> Lines; + SmallVector<uint32_t, 16> Lines; }; typedef DenseMap<uint32_t, uint64_t> LineCounts; diff --git a/lib/IR/GCOV.cpp b/lib/IR/GCOV.cpp index ba45d91224..65ed3a5a84 100644 --- a/lib/IR/GCOV.cpp +++ b/lib/IR/GCOV.cpp @@ -161,7 +161,7 @@ bool GCOVFunction::read(GCOVBuffer &Buff, GCOV::GCOVFormat Format) { if (!Buff.readInt(BlockCount)) return false; for (uint32_t i = 0, e = BlockCount; i != e; ++i) { if (!Buff.readInt(Dummy)) return false; // Block flags; - Blocks.push_back(new GCOVBlock(i)); + Blocks.push_back(new GCOVBlock(*this, i)); } // read edges. @@ -197,14 +197,18 @@ bool GCOVFunction::read(GCOVBuffer &Buff, GCOV::GCOVFormat Format) { GCOVBlock *Block = Blocks[BlockNo]; if (!Buff.readInt(Dummy)) return false; // flag while (Buff.getCursor() != (EndPos - 4)) { - StringRef Filename; - if (!Buff.readString(Filename)) return false; + StringRef F; + if (!Buff.readString(F)) return false; + if (F != Filename) { + errs() << "Multiple sources for a single basic block.\n"; + return false; + } if (Buff.getCursor() == (EndPos - 4)) break; while (true) { uint32_t Line; if (!Buff.readInt(Line)) return false; if (!Line) break; - Block->addLine(Filename, Line); + Block->addLine(Line); } } if (!Buff.readInt(Dummy)) return false; // flag @@ -234,22 +238,15 @@ void GCOVFunction::collectLineCounts(FileInfo &FI) { /// ~GCOVBlock - Delete GCOVBlock and its content. GCOVBlock::~GCOVBlock() { Edges.clear(); - DeleteContainerSeconds(Lines); -} - -void GCOVBlock::addLine(StringRef Filename, uint32_t LineNo) { - GCOVLines *&LinesForFile = Lines[Filename]; - if (!LinesForFile) - LinesForFile = new GCOVLines(); - LinesForFile->add(LineNo); + Lines.clear(); } /// collectLineCounts - Collect line counts. This must be used after /// reading .gcno and .gcda files. void GCOVBlock::collectLineCounts(FileInfo &FI) { - for (StringMap<GCOVLines *>::iterator I = Lines.begin(), + for (SmallVectorImpl<uint32_t>::iterator I = Lines.begin(), E = Lines.end(); I != E; ++I) - I->second->collectLineCounts(FI, I->first(), Counter); + FI.addLineCount(Parent.getFilename(), *I, Counter); } /// dump - Dump GCOVBlock content to dbgs() for debugging purposes. @@ -264,35 +261,14 @@ void GCOVBlock::dump() { } if (!Lines.empty()) { dbgs() << "\tLines : "; - for (StringMap<GCOVLines *>::iterator LI = Lines.begin(), - LE = Lines.end(); LI != LE; ++LI) { - dbgs() << LI->first() << " -> "; - LI->second->dump(); - dbgs() << "\n"; - } + for (SmallVectorImpl<uint32_t>::iterator I = Lines.begin(), + E = Lines.end(); I != E; ++I) + dbgs() << (*I) << ","; + dbgs() << "\n"; } } //===----------------------------------------------------------------------===// -// GCOVLines implementation. - -/// collectLineCounts - Collect line counts. This must be used after -/// reading .gcno and .gcda files. -void GCOVLines::collectLineCounts(FileInfo &FI, StringRef Filename, - uint64_t Count) { - for (SmallVectorImpl<uint32_t>::iterator I = Lines.begin(), - E = Lines.end(); I != E; ++I) - FI.addLineCount(Filename, *I, Count); -} - -/// dump - Dump GCOVLines content to dbgs() for debugging purposes. -void GCOVLines::dump() { - for (SmallVectorImpl<uint32_t>::iterator I = Lines.begin(), - E = Lines.end(); I != E; ++I) - dbgs() << (*I) << ","; -} - -//===----------------------------------------------------------------------===// // FileInfo implementation. /// print - Print source files with collected line count information. diff --git a/test/tools/llvm-cov/Inputs/test_read_fail.gcno b/test/tools/llvm-cov/Inputs/test_read_fail.gcno Binary files differnew file mode 100644 index 0000000000..63b5d71e69 --- /dev/null +++ b/test/tools/llvm-cov/Inputs/test_read_fail.gcno |