mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 06:06:19 +00:00
llvm-cov: Removed StringMap holding GCOVLines.
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
This commit is contained in:
parent
dbb51ff01f
commit
131a764e0e
@ -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;
|
||||
|
@ -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,34 +261,13 @@ 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.
|
||||
|
||||
|
BIN
test/tools/llvm-cov/Inputs/test_read_fail.gcno
Normal file
BIN
test/tools/llvm-cov/Inputs/test_read_fail.gcno
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user