aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/PassSupport.h13
-rw-r--r--lib/VMCore/PassManager.cpp27
2 files changed, 27 insertions, 13 deletions
diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h
index b018351..09abe93 100644
--- a/include/llvm/PassSupport.h
+++ b/include/llvm/PassSupport.h
@@ -36,6 +36,10 @@ class TargetMachine;
class PassInfo {
public:
typedef Pass* (*NormalCtor_t)();
+ struct InterfaceInfo {
+ const PassInfo *interface;
+ const InterfaceInfo *next;
+ };
private:
const char *const PassName; // Nice name for Pass
@@ -44,7 +48,7 @@ private:
const bool IsCFGOnlyPass; // Pass only looks at the CFG.
const bool IsAnalysis; // True if an analysis pass.
const bool IsAnalysisGroup; // True if an analysis group.
- std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
+ const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass
NormalCtor_t NormalCtor;
@@ -116,13 +120,16 @@ public:
/// template.
///
void addInterfaceImplemented(const PassInfo *ItfPI) {
- ItfImpl.push_back(ItfPI);
+ InterfaceInfo *NewInfo = new InterfaceInfo();
+ NewInfo->interface = ItfPI;
+ NewInfo->next = ItfImpl;
+ ItfImpl = NewInfo;
}
/// getInterfacesImplemented - Return a list of all of the analysis group
/// interfaces implemented by this pass.
///
- const std::vector<const PassInfo*> &getInterfacesImplemented() const {
+ const InterfaceInfo *getInterfacesImplemented() const {
return ItfImpl;
}
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index 296b0d1..4cf5501 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -638,10 +638,14 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
// If Pass not found then check the interfaces implemented by Immutable Pass
if (!P) {
- const std::vector<const PassInfo*> &ImmPI =
- PI->getInterfacesImplemented();
- if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end())
- P = *I;
+ const PassInfo::InterfaceInfo *ImmPI = PI->getInterfacesImplemented();
+ while (ImmPI) {
+ if (ImmPI->interface == AID) {
+ P = *I;
+ break;
+ } else
+ ImmPI = ImmPI->next;
+ }
}
}
@@ -731,9 +735,11 @@ void PMDataManager::recordAvailableAnalysis(Pass *P) {
//This pass is the current implementation of all of the interfaces it
//implements as well.
- const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
- for (unsigned i = 0, e = II.size(); i != e; ++i)
- AvailableAnalysis[II[i]] = P;
+ const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented();
+ while (II) {
+ AvailableAnalysis[II->interface] = P;
+ II = II->next;
+ }
}
// Return true if P preserves high level analysis used by other
@@ -867,12 +873,13 @@ void PMDataManager::freePass(Pass *P, StringRef Msg,
// Remove all interfaces this pass implements, for which it is also
// listed as the available implementation.
- const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
- for (unsigned i = 0, e = II.size(); i != e; ++i) {
+ const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented();
+ while (II) {
std::map<AnalysisID, Pass*>::iterator Pos =
- AvailableAnalysis.find(II[i]);
+ AvailableAnalysis.find(II->interface);
if (Pos != AvailableAnalysis.end() && Pos->second == P)
AvailableAnalysis.erase(Pos);
+ II = II->next;
}
}
}