mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Change the implemented interfaces list on PassInfo from a std::vector to a manually implemented
linked list. This is a little slower and involves more malloc'ing, but these lists are typically short, and it allows PassInfo to be entirely constant initializable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108755 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4332792deb
commit
7ee5d35493
@ -36,6 +36,10 @@ class TargetMachine;
|
|||||||
class PassInfo {
|
class PassInfo {
|
||||||
public:
|
public:
|
||||||
typedef Pass* (*NormalCtor_t)();
|
typedef Pass* (*NormalCtor_t)();
|
||||||
|
struct InterfaceInfo {
|
||||||
|
const PassInfo *interface;
|
||||||
|
const InterfaceInfo *next;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char *const PassName; // Nice name for Pass
|
const char *const PassName; // Nice name for Pass
|
||||||
@ -44,7 +48,7 @@ private:
|
|||||||
const bool IsCFGOnlyPass; // Pass only looks at the CFG.
|
const bool IsCFGOnlyPass; // Pass only looks at the CFG.
|
||||||
const bool IsAnalysis; // True if an analysis pass.
|
const bool IsAnalysis; // True if an analysis pass.
|
||||||
const bool IsAnalysisGroup; // True if an analysis group.
|
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;
|
NormalCtor_t NormalCtor;
|
||||||
|
|
||||||
@ -116,13 +120,16 @@ public:
|
|||||||
/// template.
|
/// template.
|
||||||
///
|
///
|
||||||
void addInterfaceImplemented(const PassInfo *ItfPI) {
|
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
|
/// getInterfacesImplemented - Return a list of all of the analysis group
|
||||||
/// interfaces implemented by this pass.
|
/// interfaces implemented by this pass.
|
||||||
///
|
///
|
||||||
const std::vector<const PassInfo*> &getInterfacesImplemented() const {
|
const InterfaceInfo *getInterfacesImplemented() const {
|
||||||
return ItfImpl;
|
return ItfImpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,10 +638,14 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
|
|||||||
|
|
||||||
// If Pass not found then check the interfaces implemented by Immutable Pass
|
// If Pass not found then check the interfaces implemented by Immutable Pass
|
||||||
if (!P) {
|
if (!P) {
|
||||||
const std::vector<const PassInfo*> &ImmPI =
|
const PassInfo::InterfaceInfo *ImmPI = PI->getInterfacesImplemented();
|
||||||
PI->getInterfacesImplemented();
|
while (ImmPI) {
|
||||||
if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end())
|
if (ImmPI->interface == AID) {
|
||||||
P = *I;
|
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
|
//This pass is the current implementation of all of the interfaces it
|
||||||
//implements as well.
|
//implements as well.
|
||||||
const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
|
const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented();
|
||||||
for (unsigned i = 0, e = II.size(); i != e; ++i)
|
while (II) {
|
||||||
AvailableAnalysis[II[i]] = P;
|
AvailableAnalysis[II->interface] = P;
|
||||||
|
II = II->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return true if P preserves high level analysis used by other
|
// 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
|
// Remove all interfaces this pass implements, for which it is also
|
||||||
// listed as the available implementation.
|
// listed as the available implementation.
|
||||||
const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
|
const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented();
|
||||||
for (unsigned i = 0, e = II.size(); i != e; ++i) {
|
while (II) {
|
||||||
std::map<AnalysisID, Pass*>::iterator Pos =
|
std::map<AnalysisID, Pass*>::iterator Pos =
|
||||||
AvailableAnalysis.find(II[i]);
|
AvailableAnalysis.find(II->interface);
|
||||||
if (Pos != AvailableAnalysis.end() && Pos->second == P)
|
if (Pos != AvailableAnalysis.end() && Pos->second == P)
|
||||||
AvailableAnalysis.erase(Pos);
|
AvailableAnalysis.erase(Pos);
|
||||||
|
II = II->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user