[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