summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-cov/SourceCoverageDataManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-cov/SourceCoverageDataManager.cpp')
-rw-r--r--llvm/tools/llvm-cov/SourceCoverageDataManager.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/llvm/tools/llvm-cov/SourceCoverageDataManager.cpp b/llvm/tools/llvm-cov/SourceCoverageDataManager.cpp
new file mode 100644
index 00000000000..03382b266e7
--- /dev/null
+++ b/llvm/tools/llvm-cov/SourceCoverageDataManager.cpp
@@ -0,0 +1,57 @@
+//===- SourceCoverageDataManager.cpp - Manager for source file coverage
+// data-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This class separates and merges mapping regions for a specific source file.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SourceCoverageDataManager.h"
+
+using namespace llvm;
+using namespace coverage;
+
+void SourceCoverageDataManager::insert(const MappingRegion &Region) {
+ SourceRange Range(Region.LineStart, Region.ColumnStart, Region.LineEnd,
+ Region.ColumnEnd);
+ if (Region.Kind == CounterMappingRegion::SkippedRegion) {
+ SkippedRegions.push_back(Range);
+ return;
+ }
+ Regions.push_back(std::make_pair(Range, Region.ExecutionCount));
+}
+
+ArrayRef<std::pair<SourceCoverageDataManager::SourceRange, uint64_t>>
+SourceCoverageDataManager::getSourceRegions() {
+ if (Uniqued || Regions.size() <= 1)
+ return Regions;
+
+ // Sort.
+ std::sort(Regions.begin(), Regions.end(),
+ [](const std::pair<SourceRange, uint64_t> &LHS,
+ const std::pair<SourceRange, uint64_t> &RHS) {
+ return LHS.first < RHS.first;
+ });
+
+ // Merge duplicate source ranges and sum their execution counts.
+ auto Prev = Regions.begin();
+ for (auto I = Prev + 1, E = Regions.end(); I != E; ++I) {
+ if (I->first == Prev->first) {
+ Prev->second += I->second;
+ continue;
+ }
+ ++Prev;
+ *Prev = *I;
+ }
+ ++Prev;
+ Regions.erase(Prev, Regions.end());
+
+ Uniqued = true;
+ return Regions;
+}
OpenPOWER on IntegriCloud