[llvm] r218074 - llvm-cov: Simplify FunctionInstantiationSetCollector (NFC)

Justin Bogner mail at justinbogner.com
Thu Sep 18 13:31:26 PDT 2014


Author: bogner
Date: Thu Sep 18 15:31:26 2014
New Revision: 218074

URL: http://llvm.org/viewvc/llvm-project?rev=218074&view=rev
Log:
llvm-cov: Simplify FunctionInstantiationSetCollector (NFC)

- Replace std::unordered_map with DenseMap
- Use std::pair instead of manually combining two unsigneds
- Assert if insert is called with invalid arguments
- Avoid an unnecessary copy of a std::vector

Modified:
    llvm/trunk/tools/llvm-cov/CodeCoverage.cpp

Modified: llvm/trunk/tools/llvm-cov/CodeCoverage.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/CodeCoverage.cpp?rev=218074&r1=218073&r2=218074&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-cov/CodeCoverage.cpp (original)
+++ llvm/trunk/tools/llvm-cov/CodeCoverage.cpp Thu Sep 18 15:31:26 2014
@@ -20,6 +20,7 @@
 #include "SourceCoverageView.h"
 #include "CoverageSummary.h"
 #include "CoverageReport.h"
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallSet.h"
@@ -37,49 +38,35 @@
 #include "llvm/Support/PrettyStackTrace.h"
 #include <functional>
 #include <system_error>
-#include <unordered_map>
 
 using namespace llvm;
 using namespace coverage;
 
 namespace {
 /// \brief Distribute the functions into instantiation sets.
-/// An instantiation set is a collection of functions
-/// that have the same source code, e.g.
-/// template functions specializations.
+///
+/// An instantiation set is a collection of functions that have the same source
+/// code, ie, template functions specializations.
 class FunctionInstantiationSetCollector {
-  ArrayRef<FunctionCoverageMapping> FunctionMappings;
-  typedef uint64_t KeyType;
-  typedef std::vector<const FunctionCoverageMapping *> SetType;
-  std::unordered_map<uint64_t, SetType> InstantiatedFunctions;
-
-  static KeyType getKey(const CountedRegion &R) {
-    return uint64_t(R.LineStart) | uint64_t(R.ColumnStart) << 32;
-  }
+  typedef DenseMap<std::pair<unsigned, unsigned>,
+                   std::vector<const FunctionCoverageMapping *>> MapT;
+  MapT InstantiatedFunctions;
 
 public:
   void insert(const FunctionCoverageMapping &Function, unsigned FileID) {
-    KeyType Key = 0;
-    for (const auto &R : Function.CountedRegions) {
-      if (R.FileID == FileID) {
-        Key = getKey(R);
-        break;
-      }
-    }
-    auto I = InstantiatedFunctions.find(Key);
-    if (I == InstantiatedFunctions.end()) {
-      SetType Set;
-      Set.push_back(&Function);
-      InstantiatedFunctions.insert(std::make_pair(Key, Set));
-    } else
-      I->second.push_back(&Function);
+    auto I = Function.CountedRegions.begin(), E = Function.CountedRegions.end();
+    while (I != E && I->FileID != FileID)
+      ++I;
+    assert(I != E && "function does not cover the given file");
+    auto &Functions = InstantiatedFunctions[I->startLoc()];
+    Functions.push_back(&Function);
   }
 
-  std::unordered_map<KeyType, SetType>::iterator begin() {
+  MapT::iterator begin() {
     return InstantiatedFunctions.begin();
   }
 
-  std::unordered_map<KeyType, SetType>::iterator end() {
+  MapT::iterator end() {
     return InstantiatedFunctions.end();
   }
 };





More information about the llvm-commits mailing list