llvm-cov: Split up reading of GCNO and GCDA files.

There are now two functions: readGCNO() and readGCDA().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196173 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Yuchen Wu 2013-12-03 00:15:49 +00:00
parent 44de223927
commit c4b184e229
2 changed files with 51 additions and 42 deletions

View File

@ -210,7 +210,8 @@ class GCOVFunction {
public: public:
GCOVFunction() : Ident(0), LineNumber(0) {} GCOVFunction() : Ident(0), LineNumber(0) {}
~GCOVFunction(); ~GCOVFunction();
bool read(GCOVBuffer &Buffer, GCOV::GCOVFormat Format); bool readGCNO(GCOVBuffer &Buffer, GCOV::GCOVFormat Format);
bool readGCDA(GCOVBuffer &Buffer, GCOV::GCOVFormat Format);
StringRef getFilename() const { return Filename; } StringRef getFilename() const { return Filename; }
void dump() const; void dump() const;
void collectLineCounts(FileInfo &FI); void collectLineCounts(FileInfo &FI);

View File

@ -50,7 +50,7 @@ bool GCOVFile::read(GCOVBuffer &Buffer) {
while (true) { while (true) {
if (!Buffer.readFunctionTag()) break; if (!Buffer.readFunctionTag()) break;
GCOVFunction *GFun = new GCOVFunction(); GCOVFunction *GFun = new GCOVFunction();
if (!GFun->read(Buffer, Format)) if (!GFun->readGCNO(Buffer, Format))
return false; return false;
Functions.push_back(GFun); Functions.push_back(GFun);
} }
@ -66,7 +66,7 @@ bool GCOVFile::read(GCOVBuffer &Buffer) {
errs() << "Unexpected number of functions.\n"; errs() << "Unexpected number of functions.\n";
return false; return false;
} }
if (!Functions[i]->read(Buffer, Format)) if (!Functions[i]->readGCDA(Buffer, Format))
return false; return false;
} }
if (Buffer.readObjectTag()) { if (Buffer.readObjectTag()) {
@ -114,52 +114,18 @@ GCOVFunction::~GCOVFunction() {
DeleteContainerPointers(Blocks); DeleteContainerPointers(Blocks);
} }
/// read - Read a function from the buffer. Return false if buffer cursor /// readGCNO - Read a function from the GCNO buffer. Return false if an error
/// does not point to a function tag. /// occurs.
bool GCOVFunction::read(GCOVBuffer &Buff, GCOV::GCOVFormat Format) { bool GCOVFunction::readGCNO(GCOVBuffer &Buff, GCOV::GCOVFormat Format) {
uint32_t Dummy; uint32_t Dummy;
if (!Buff.readInt(Dummy)) return false; // Function header length if (!Buff.readInt(Dummy)) return false; // Function header length
if (!Buff.readInt(Ident)) return false; if (!Buff.readInt(Ident)) return false;
if (!Buff.readInt(Dummy)) return false; // Checksum #1 if (!Buff.readInt(Dummy)) return false; // Checksum #1
if (Format != GCOV::GCNO_402 && Format != GCOV::GCDA_402) if (Format != GCOV::GCNO_402)
if (!Buff.readInt(Dummy)) return false; // Checksum #2 if (!Buff.readInt(Dummy)) return false; // Checksum #2
if (!Buff.readString(Name)) return false; if (!Buff.readString(Name)) return false;
if (!Buff.readString(Filename)) return false;
if (Format == GCOV::GCNO_402 || Format == GCOV::GCNO_404)
if (!Buff.readString(Filename)) return false;
if (Format == GCOV::GCDA_402 || Format == GCOV::GCDA_404) {
if (!Buff.readArcTag()) {
errs() << "Arc tag not found.\n";
return false;
}
uint32_t Count;
if (!Buff.readInt(Count)) return false;
Count /= 2;
// 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; Count > 0; ++Line) {
if (Line >= Blocks.size()) {
errs() << "Unexpected number of edges.\n";
return false;
}
GCOVBlock &Block = *Blocks[Line];
for (size_t Edge = 0, End = Block.getNumEdges(); Edge < End; ++Edge) {
if (Count == 0) {
errs() << "Unexpected number of edges.\n";
return false;
}
uint64_t ArcCount;
if (!Buff.readInt64(ArcCount)) return false;
Block.addCount(ArcCount);
--Count;
}
}
return true;
}
if (!Buff.readInt(LineNumber)) return false; if (!Buff.readInt(LineNumber)) return false;
// read blocks. // read blocks.
@ -226,6 +192,48 @@ bool GCOVFunction::read(GCOVBuffer &Buff, GCOV::GCOVFormat Format) {
return true; return true;
} }
/// readGCDA - Read a function from the GCDA buffer. Return false if an error
/// occurs.
bool GCOVFunction::readGCDA(GCOVBuffer &Buff, GCOV::GCOVFormat Format) {
uint32_t Dummy;
if (!Buff.readInt(Dummy)) return false; // Function header length
if (!Buff.readInt(Ident)) return false;
if (!Buff.readInt(Dummy)) return false; // Checksum #1
if (Format != GCOV::GCDA_402)
if (!Buff.readInt(Dummy)) return false; // Checksum #2
if (!Buff.readString(Name)) return false;
if (!Buff.readArcTag()) {
errs() << "Arc tag not found.\n";
return false;
}
uint32_t Count;
if (!Buff.readInt(Count)) return false;
Count /= 2;
// 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; Count > 0; ++Line) {
if (Line >= Blocks.size()) {
errs() << "Unexpected number of edges.\n";
return false;
}
GCOVBlock &Block = *Blocks[Line];
for (size_t Edge = 0, End = Block.getNumEdges(); Edge < End; ++Edge) {
if (Count == 0) {
errs() << "Unexpected number of edges.\n";
return false;
}
uint64_t ArcCount;
if (!Buff.readInt64(ArcCount)) return false;
Block.addCount(ArcCount);
--Count;
}
}
return true;
}
/// dump - Dump GCOVFunction content to dbgs() for debugging purposes. /// dump - Dump GCOVFunction content to dbgs() for debugging purposes.
void GCOVFunction::dump() const { void GCOVFunction::dump() const {
dbgs() << "===== " << Name << " @ " << Filename << ":" << LineNumber << "\n"; dbgs() << "===== " << Name << " @ " << Filename << ":" << LineNumber << "\n";