mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 05:29:24 +00:00
Change the ActualCallees callgraph from hash_multimap<Instruction,Function>
to std::set<std::pair<Inst,Func>> to avoid duplicate entries. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21030 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7332f3e05d
commit
df968b8b37
@ -102,7 +102,7 @@ protected:
|
||||
// DSInfo, one graph for each function
|
||||
hash_map<Function*, DSGraph*> DSInfo;
|
||||
DSGraph *GlobalsGraph;
|
||||
hash_multimap<Instruction*, Function*> ActualCallees;
|
||||
std::set<std::pair<Instruction*, Function*> > ActualCallees;
|
||||
|
||||
// This map is only maintained during construction of BU Graphs
|
||||
std::map<std::vector<Function*>,
|
||||
@ -152,11 +152,20 @@ public:
|
||||
AU.addRequired<LocalDataStructures>();
|
||||
}
|
||||
|
||||
typedef hash_multimap<Instruction*, Function*> ActualCalleesTy;
|
||||
typedef std::set<std::pair<Instruction*, Function*> > ActualCalleesTy;
|
||||
const ActualCalleesTy &getActualCallees() const {
|
||||
return ActualCallees;
|
||||
}
|
||||
|
||||
ActualCalleesTy::iterator callee_begin(Instruction *I) const {
|
||||
return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
|
||||
}
|
||||
|
||||
ActualCalleesTy::iterator callee_end(Instruction *I) const {
|
||||
I = (Instruction*)((char*)I + 1);
|
||||
return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
|
||||
}
|
||||
|
||||
private:
|
||||
void calculateGraph(DSGraph &G);
|
||||
|
||||
@ -177,6 +186,7 @@ class TDDataStructures : public ModulePass {
|
||||
hash_map<Function*, DSGraph*> DSInfo;
|
||||
hash_set<Function*> ArgsRemainIncomplete;
|
||||
DSGraph *GlobalsGraph;
|
||||
BUDataStructures *BUInfo;
|
||||
|
||||
/// GlobalECs - The equivalence classes for each global value that is merged
|
||||
/// with other global values in the DSGraphs.
|
||||
@ -257,8 +267,7 @@ private:
|
||||
void InlineCallersIntoGraph(DSGraph &G);
|
||||
DSGraph &getOrCreateDSGraph(Function &F);
|
||||
void ComputePostOrder(Function &F, hash_set<DSGraph*> &Visited,
|
||||
std::vector<DSGraph*> &PostOrder,
|
||||
const BUDataStructures::ActualCalleesTy &ActualCallees);
|
||||
std::vector<DSGraph*> &PostOrder);
|
||||
};
|
||||
|
||||
|
||||
|
@ -39,7 +39,7 @@ namespace llvm {
|
||||
|
||||
/// ActualCallees - The actual functions callable from indirect call sites.
|
||||
///
|
||||
hash_multimap<Instruction*, Function*> ActualCallees;
|
||||
std::set<std::pair<Instruction*, Function*> > ActualCallees;
|
||||
|
||||
// Equivalence class where functions that can potentially be called via the
|
||||
// same function pointer are in the same class.
|
||||
@ -96,10 +96,19 @@ namespace llvm {
|
||||
return *GlobalsGraph;
|
||||
}
|
||||
|
||||
typedef hash_multimap<Instruction*, Function*> ActualCalleesTy;
|
||||
typedef std::set<std::pair<Instruction*, Function*> > ActualCalleesTy;
|
||||
const ActualCalleesTy &getActualCallees() const {
|
||||
return ActualCallees;
|
||||
}
|
||||
|
||||
ActualCalleesTy::iterator callee_begin(Instruction *I) const {
|
||||
return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
|
||||
}
|
||||
|
||||
ActualCalleesTy::iterator callee_end(Instruction *I) const {
|
||||
I = (Instruction*)((char*)I + 1);
|
||||
return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
|
||||
}
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesAll();
|
||||
|
Loading…
Reference in New Issue
Block a user