summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: dbb51ff)
raw | patch | inline | side by side (parent: dbb51ff)
author | Yuchen Wu <yuchenericwu@hotmail.com> | |
Thu, 14 Nov 2013 00:32:00 +0000 (00:32 +0000) | ||
committer | Yuchen Wu <yuchenericwu@hotmail.com> | |
Thu, 14 Nov 2013 00:32:00 +0000 (00:32 +0000) |
According to the hazy gcov documentation, it appeared to be technically
possible for lines within a block to belong to different source files.
However, upon further investigation, gcov does not actually support
multiple source files for a single block.
This change removes a level of separation between blocks and lines by
replacing the StringMap of GCOVLines with a SmallVector of ints
representing line numbers. This also means that the GCOVLines class is
no longer needed.
This paves the way for supporting the "-a" option, which will output
block information.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194637 91177308-0d34-0410-b5e6-96231b3b80d8
possible for lines within a block to belong to different source files.
However, upon further investigation, gcov does not actually support
multiple source files for a single block.
This change removes a level of separation between blocks and lines by
replacing the StringMap of GCOVLines with a SmallVector of ints
representing line numbers. This also means that the GCOVLines class is
no longer needed.
This paves the way for supporting the "-a" option, which will output
block information.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194637 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Support/GCOV.h | patch | blob | history | |
lib/IR/GCOV.cpp | patch | blob | history | |
test/tools/llvm-cov/Inputs/test_read_fail.gcno | [new file with mode: 0644] | patch | blob |
index d79c0f9a742160621b02de272e1cb2982c4aae1a..469a9e3ef94eb2508d4e8c5eb13ea2279178fc0c 100644 (file)
class GCOVFunction;
class GCOVBlock;
-class GCOVLines;
class FileInfo;
namespace GCOV {
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:
/// 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 ba45d91224fa4f13c6fab959f342f0033ac570e8..65ed3a5a84bf47da5820dfd22a4bdb86454cec26 100644 (file)
--- a/lib/IR/GCOV.cpp
+++ b/lib/IR/GCOV.cpp
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.
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
/// ~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.
}
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.
diff --git a/test/tools/llvm-cov/Inputs/test_read_fail.gcno b/test/tools/llvm-cov/Inputs/test_read_fail.gcno
new file mode 100644 (file)
index 0000000..63b5d71
Binary files /dev/null and b/test/tools/llvm-cov/Inputs/test_read_fail.gcno differ
index 0000000..63b5d71
Binary files /dev/null and b/test/tools/llvm-cov/Inputs/test_read_fail.gcno differ