diff options
author | Chris Lattner <sabre@nondot.org> | 2009-09-01 06:31:31 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-09-01 06:31:31 +0000 |
commit | a59b5decad2d3e3b9e2f565ff5d4e1857b9202a1 (patch) | |
tree | b552423321ef32d4577f0380d0ccc2575ab903be /include/llvm/Analysis | |
parent | e18cb0735189d79b73d3643f9bfda482a82f498d (diff) | |
download | external_llvm-a59b5decad2d3e3b9e2f565ff5d4e1857b9202a1.zip external_llvm-a59b5decad2d3e3b9e2f565ff5d4e1857b9202a1.tar.gz external_llvm-a59b5decad2d3e3b9e2f565ff5d4e1857b9202a1.tar.bz2 |
Change CallGraphNode to maintain it's Function as an AssertingVH
for sanity. This didn't turn up any bugs.
Change CallGraphNode to maintain its "callsite" information in the
call edges list as a WeakVH instead of as an instruction*. This fixes
a broad class of dangling pointer bugs, and makes CallGraph have a number
of useful invariants again. This fixes the class of problem indicated
by PR4029 and PR3601.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80663 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Analysis')
-rw-r--r-- | include/llvm/Analysis/CallGraph.h | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/include/llvm/Analysis/CallGraph.h b/include/llvm/Analysis/CallGraph.h index 0e997ca..ff9f119 100644 --- a/include/llvm/Analysis/CallGraph.h +++ b/include/llvm/Analysis/CallGraph.h @@ -55,6 +55,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Pass.h" #include "llvm/Support/CallSite.h" +#include "llvm/Support/ValueHandle.h" #include "llvm/System/IncludeFile.h" #include <map> @@ -158,11 +159,16 @@ protected: }; //===----------------------------------------------------------------------===// -// CallGraphNode class definition +// CallGraphNode class definition. // class CallGraphNode { - Function *F; - typedef std::pair<CallSite,CallGraphNode*> CallRecord; + AssertingVH<Function> F; + + // CallRecord - This is a pair of the calling instruction (a call or invoke) + // and the callgraph node being called. +public: + typedef std::pair<WeakVH, CallGraphNode*> CallRecord; +private: std::vector<CallRecord> CalledFunctions; /// NumReferences - This is the number of times that this CallGraphNode occurs @@ -240,19 +246,22 @@ public: /// addCalledFunction - Add a function to the list of functions called by this /// one. void addCalledFunction(CallSite CS, CallGraphNode *M) { - CalledFunctions.push_back(std::make_pair(CS, M)); + CalledFunctions.push_back(std::make_pair(CS.getInstruction(), M)); M->AddRef(); } + void removeCallEdge(iterator I) { + I->second->DropRef(); + *I = CalledFunctions.back(); + CalledFunctions.pop_back(); + } + + /// removeCallEdgeFor - This method removes the edge in the node for the /// specified call site. Note that this method takes linear time, so it /// should be used sparingly. void removeCallEdgeFor(CallSite CS); - // FIXME: REMOVE THIS WHEN HACK IS REMOVED FROM CGSCCPASSMGR. - void removeCallEdgeFor(Instruction *CS); - - /// removeAnyCallEdgeTo - This method removes all call edges from this node /// to the specified callee function. This takes more time to execute than /// removeCallEdgeTo, so it should not be used unless necessary. @@ -278,7 +287,7 @@ public: template <> struct GraphTraits<CallGraphNode*> { typedef CallGraphNode NodeType; - typedef std::pair<CallSite, CallGraphNode*> CGNPairTy; + typedef CallGraphNode::CallRecord CGNPairTy; typedef std::pointer_to_unary_function<CGNPairTy, CallGraphNode*> CGNDerefFun; static NodeType *getEntryNode(CallGraphNode *CGN) { return CGN; } |