From 812ad83e58f94c006034b942b9482ec1331ae3a2 Mon Sep 17 00:00:00 2001 From: Yuchen Wu Date: Wed, 4 Dec 2013 04:49:23 +0000 Subject: llvm-cov: Split GCOVFile's read into GCNO and GCDA. This splits the file-scope read() function into readGCNO() and readGCDA(). Also broke file format read into functions that first read the file type, then check the version. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196353 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/GCOV.h | 73 +++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 25 deletions(-) (limited to 'include/llvm/Support/GCOV.h') diff --git a/include/llvm/Support/GCOV.h b/include/llvm/Support/GCOV.h index 9aa44139f0..d80913717a 100644 --- a/include/llvm/Support/GCOV.h +++ b/include/llvm/Support/GCOV.h @@ -28,12 +28,9 @@ class GCOVBlock; class FileInfo; namespace GCOV { - enum GCOVFormat { - InvalidGCOV, - GCNO_402, - GCNO_404, - GCDA_402, - GCDA_404 + enum GCOVVersion { + V402, + V404 }; } // end GCOV namespace @@ -43,21 +40,43 @@ class GCOVBuffer { public: GCOVBuffer(MemoryBuffer *B) : Buffer(B), Cursor(0) {} - /// readGCOVFormat - Read GCOV signature at the beginning of buffer. - GCOV::GCOVFormat readGCOVFormat() { - StringRef Magic = Buffer->getBuffer().slice(0, 8); - Cursor = 8; - if (Magic == "oncg*404") - return GCOV::GCNO_404; - else if (Magic == "oncg*204") - return GCOV::GCNO_402; - else if (Magic == "adcg*404") - return GCOV::GCDA_404; - else if (Magic == "adcg*204") - return GCOV::GCDA_402; - - Cursor = 0; - return GCOV::InvalidGCOV; + /// readGCNOFormat - Check GCNO signature is valid at the beginning of buffer. + bool readGCNOFormat() { + StringRef File = Buffer->getBuffer().slice(0, 4); + if (File != "oncg") { + errs() << "Unexpected file type: " << File << ".\n"; + return false; + } + Cursor = 4; + return true; + } + + /// readGCDAFormat - Check GCDA signature is valid at the beginning of buffer. + bool readGCDAFormat() { + StringRef File = Buffer->getBuffer().slice(0, 4); + if (File != "adcg") { + errs() << "Unexpected file type: " << File << ".\n"; + return false; + } + Cursor = 4; + return true; + } + + /// readGCOVVersion - Read GCOV version. + bool readGCOVVersion(GCOV::GCOVVersion &Version) { + StringRef VersionStr = Buffer->getBuffer().slice(Cursor, Cursor+4); + if (VersionStr == "*204") { + Cursor += 4; + Version = GCOV::V402; + return true; + } + if (VersionStr == "*404") { + Cursor += 4; + Version = GCOV::V404; + return true; + } + errs() << "Unexpected version: " << VersionStr << ".\n"; + return false; } /// readFunctionTag - If cursor points to a function tag then increment the @@ -193,12 +212,16 @@ private: /// (.gcno and .gcda). class GCOVFile { public: - GCOVFile() : Checksum(0), Functions(), RunCount(0), ProgramCount(0) {} + GCOVFile() : gcnoInitialized(false), Checksum(0), Functions(), RunCount(0), + ProgramCount(0) {} ~GCOVFile(); - bool read(GCOVBuffer &Buffer); + bool readGCNO(GCOVBuffer &Buffer); + bool readGCDA(GCOVBuffer &Buffer); void dump() const; void collectLineCounts(FileInfo &FI); private: + bool gcnoInitialized; + GCOV::GCOVVersion Version; uint32_t Checksum; SmallVector Functions; uint32_t RunCount; @@ -218,8 +241,8 @@ class GCOVFunction { public: GCOVFunction() : Ident(0), LineNumber(0) {} ~GCOVFunction(); - bool readGCNO(GCOVBuffer &Buffer, GCOV::GCOVFormat Format); - bool readGCDA(GCOVBuffer &Buffer, GCOV::GCOVFormat Format); + bool readGCNO(GCOVBuffer &Buffer, GCOV::GCOVVersion Version); + bool readGCDA(GCOVBuffer &Buffer, GCOV::GCOVVersion Version); StringRef getFilename() const { return Filename; } void dump() const; void collectLineCounts(FileInfo &FI); -- cgit v1.2.3