Fix llvm-cov counts to be 64-bit integers to avoid overflows.
authorBob Wilson <bob.wilson@apple.com>
Tue, 22 Oct 2013 17:43:47 +0000 (17:43 +0000)
committerBob Wilson <bob.wilson@apple.com>
Tue, 22 Oct 2013 17:43:47 +0000 (17:43 +0000)
Line counts in llvm-cov are read in as 64-bit integers but were being truncated
to 32-bit in collectLineCounts(), which caused overflow for large counts.
This patch fixes all counts to be uint64_t.

Patch by Yuchen Wu!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193172 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/GCOV.h
lib/IR/GCOV.cpp

index 67d637021a23d92196ca236b40174285b0ca167a..aa436fbea973ca48021379af18364f30d6aa87b1 100644 (file)
@@ -205,17 +205,17 @@ class GCOVLines {
 public:
   ~GCOVLines() { Lines.clear(); }
   void add(uint32_t N) { Lines.push_back(N); }
-  void collectLineCounts(FileInfo &FI, StringRef Filename, uint32_t Count);
+  void collectLineCounts(FileInfo &FI, StringRef Filename, uint64_t Count);
   void dump();
 
 private:
   SmallVector<uint32_t, 4> Lines;
 };
 
-typedef SmallVector<uint32_t, 16> LineCounts;
+typedef SmallVector<uint64_t, 16> LineCounts;
 class FileInfo {
 public:
-  void addLineCount(StringRef Filename, uint32_t Line, uint32_t Count);
+  void addLineCount(StringRef Filename, uint32_t Line, uint64_t Count);
   void print(StringRef gcnoFile, StringRef gcdaFile);
 private:
   StringMap<LineCounts> LineInfo;
index 36c5390bbdbdfd89065a61bae3c18e570225f2b5..8a3fb47bf17a6bf60379cb55bac88b4f94c61991 100644 (file)
@@ -219,7 +219,7 @@ void GCOVBlock::dump() {
 /// collectLineCounts - Collect line counts. This must be used after
 /// reading .gcno and .gcda files.
 void GCOVLines::collectLineCounts(FileInfo &FI, StringRef Filename, 
-                                  uint32_t Count) {
+                                  uint64_t Count) {
   for (SmallVectorImpl<uint32_t>::iterator I = Lines.begin(),
          E = Lines.end(); I != E; ++I)
     FI.addLineCount(Filename, *I, Count);
@@ -236,7 +236,7 @@ void GCOVLines::dump() {
 // FileInfo implementation.
 
 /// addLineCount - Add line count for the given line number in a file.
-void FileInfo::addLineCount(StringRef Filename, uint32_t Line, uint32_t Count) {
+void FileInfo::addLineCount(StringRef Filename, uint32_t Line, uint64_t Count) {
   if (LineInfo.find(Filename) == LineInfo.end()) {
     OwningPtr<MemoryBuffer> Buff;
     if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, Buff)) {