LLVM API Documentation
00001 //===- CallGraph.h - Build a Module's call graph ----------------*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This interface is used to build and manipulate a call graph, which is a very 00011 // useful tool for interprocedural optimization. 00012 // 00013 // Every function in a module is represented as a node in the call graph. The 00014 // callgraph node keeps track of which functions the are called by the function 00015 // corresponding to the node. 00016 // 00017 // A call graph may contain nodes where the function that they correspond to is 00018 // null. These 'external' nodes are used to represent control flow that is not 00019 // represented (or analyzable) in the module. In particular, this analysis 00020 // builds one external node such that: 00021 // 1. All functions in the module without internal linkage will have edges 00022 // from this external node, indicating that they could be called by 00023 // functions outside of the module. 00024 // 2. All functions whose address is used for something more than a direct 00025 // call, for example being stored into a memory location will also have an 00026 // edge from this external node. Since they may be called by an unknown 00027 // caller later, they must be tracked as such. 00028 // 00029 // There is a second external node added for calls that leave this module. 00030 // Functions have a call edge to the external node iff: 00031 // 1. The function is external, reflecting the fact that they could call 00032 // anything without internal linkage or that has its address taken. 00033 // 2. The function contains an indirect function call. 00034 // 00035 // As an extension in the future, there may be multiple nodes with a null 00036 // function. These will be used when we can prove (through pointer analysis) 00037 // that an indirect call site can call only a specific set of functions. 00038 // 00039 // Because of these properties, the CallGraph captures a conservative superset 00040 // of all of the caller-callee relationships, which is useful for 00041 // transformations. 00042 // 00043 // The CallGraph class also attempts to figure out what the root of the 00044 // CallGraph is, which it currently does by looking for a function named 'main'. 00045 // If no function named 'main' is found, the external node is used as the entry 00046 // node, reflecting the fact that any function without internal linkage could 00047 // be called into (which is common for libraries). 00048 // 00049 //===----------------------------------------------------------------------===// 00050 00051 #ifndef LLVM_ANALYSIS_CALLGRAPH_H 00052 #define LLVM_ANALYSIS_CALLGRAPH_H 00053 00054 #include "llvm/ADT/GraphTraits.h" 00055 #include "llvm/ADT/STLExtras.h" 00056 #include "llvm/Pass.h" 00057 #include "llvm/Support/CallSite.h" 00058 #include "llvm/System/IncludeFile.h" 00059 #include <map> 00060 00061 namespace llvm { 00062 00063 class Function; 00064 class Module; 00065 class CallGraphNode; 00066 00067 //===----------------------------------------------------------------------===// 00068 // CallGraph class definition 00069 // 00070 class CallGraph { 00071 protected: 00072 Module *Mod; // The module this call graph represents 00073 00074 typedef std::map<const Function *, CallGraphNode *> FunctionMapTy; 00075 FunctionMapTy FunctionMap; // Map from a function to its node 00076 00077 public: 00078 static char ID; // Class identification, replacement for typeinfo 00079 //===--------------------------------------------------------------------- 00080 // Accessors... 00081 // 00082 typedef FunctionMapTy::iterator iterator; 00083 typedef FunctionMapTy::const_iterator const_iterator; 00084 00085 /// getModule - Return the module the call graph corresponds to. 00086 /// 00087 Module &getModule() const { return *Mod; } 00088 00089 inline iterator begin() { return FunctionMap.begin(); } 00090 inline iterator end() { return FunctionMap.end(); } 00091 inline const_iterator begin() const { return FunctionMap.begin(); } 00092 inline const_iterator end() const { return FunctionMap.end(); } 00093 00094 // Subscripting operators, return the call graph node for the provided 00095 // function 00096 inline const CallGraphNode *operator[](const Function *F) const { 00097 const_iterator I = FunctionMap.find(F); 00098 assert(I != FunctionMap.end() && "Function not in callgraph!"); 00099 return I->second; 00100 } 00101 inline CallGraphNode *operator[](const Function *F) { 00102 const_iterator I = FunctionMap.find(F); 00103 assert(I != FunctionMap.end() && "Function not in callgraph!"); 00104 return I->second; 00105 } 00106 00107 /// Returns the CallGraphNode which is used to represent undetermined calls 00108 /// into the callgraph. Override this if you want behavioral inheritance. 00109 virtual CallGraphNode* getExternalCallingNode() const { return 0; } 00110 00111 /// Return the root/main method in the module, or some other root node, such 00112 /// as the externalcallingnode. Overload these if you behavioral 00113 /// inheritance. 00114 virtual CallGraphNode* getRoot() { return 0; } 00115 virtual const CallGraphNode* getRoot() const { return 0; } 00116 00117 //===--------------------------------------------------------------------- 00118 // Functions to keep a call graph up to date with a function that has been 00119 // modified. 00120 // 00121 00122 /// removeFunctionFromModule - Unlink the function from this module, returning 00123 /// it. Because this removes the function from the module, the call graph 00124 /// node is destroyed. This is only valid if the function does not call any 00125 /// other functions (ie, there are no edges in it's CGN). The easiest way to 00126 /// do this is to dropAllReferences before calling this. 00127 /// 00128 Function *removeFunctionFromModule(CallGraphNode *CGN); 00129 Function *removeFunctionFromModule(Function *F) { 00130 return removeFunctionFromModule((*this)[F]); 00131 } 00132 00133 /// changeFunction - This method changes the function associated with this 00134 /// CallGraphNode, for use by transformations that need to change the 00135 /// prototype of a Function (thus they must create a new Function and move the 00136 /// old code over). 00137 void changeFunction(Function *OldF, Function *NewF); 00138 00139 /// getOrInsertFunction - This method is identical to calling operator[], but 00140 /// it will insert a new CallGraphNode for the specified function if one does 00141 /// not already exist. 00142 CallGraphNode *getOrInsertFunction(const Function *F); 00143 00144 //===--------------------------------------------------------------------- 00145 // Pass infrastructure interface glue code... 00146 // 00147 protected: 00148 CallGraph() {} 00149 00150 public: 00151 virtual ~CallGraph() { destroy(); } 00152 00153 /// initialize - Call this method before calling other methods, 00154 /// re/initializes the state of the CallGraph. 00155 /// 00156 void initialize(Module &M); 00157 00158 virtual void print(std::ostream &o, const Module *M) const; 00159 void print(std::ostream *o, const Module *M) const { if (o) print(*o, M); } 00160 void dump() const; 00161 00162 protected: 00163 // destroy - Release memory for the call graph 00164 virtual void destroy(); 00165 }; 00166 00167 //===----------------------------------------------------------------------===// 00168 // CallGraphNode class definition 00169 // 00170 class CallGraphNode { 00171 Function *F; 00172 typedef std::pair<CallSite,CallGraphNode*> CallRecord; 00173 std::vector<CallRecord> CalledFunctions; 00174 00175 CallGraphNode(const CallGraphNode &); // Do not implement 00176 public: 00177 //===--------------------------------------------------------------------- 00178 // Accessor methods... 00179 // 00180 00181 typedef std::vector<CallRecord>::iterator iterator; 00182 typedef std::vector<CallRecord>::const_iterator const_iterator; 00183 00184 // getFunction - Return the function that this call graph node represents... 00185 Function *getFunction() const { return F; } 00186 00187 inline iterator begin() { return CalledFunctions.begin(); } 00188 inline iterator end() { return CalledFunctions.end(); } 00189 inline const_iterator begin() const { return CalledFunctions.begin(); } 00190 inline const_iterator end() const { return CalledFunctions.end(); } 00191 inline bool empty() const { return CalledFunctions.empty(); } 00192 inline unsigned size() const { return (unsigned)CalledFunctions.size(); } 00193 00194 // Subscripting operator - Return the i'th called function... 00195 // 00196 CallGraphNode *operator[](unsigned i) const { 00197 return CalledFunctions[i].second; 00198 } 00199 00200 /// dump - Print out this call graph node. 00201 /// 00202 void dump() const; 00203 void print(std::ostream &OS) const; 00204 void print(std::ostream *OS) const { if (OS) print(*OS); } 00205 00206 //===--------------------------------------------------------------------- 00207 // Methods to keep a call graph up to date with a function that has been 00208 // modified 00209 // 00210 00211 /// removeAllCalledFunctions - As the name implies, this removes all edges 00212 /// from this CallGraphNode to any functions it calls. 00213 void removeAllCalledFunctions() { 00214 CalledFunctions.clear(); 00215 } 00216 00217 /// addCalledFunction - Add a function to the list of functions called by this 00218 /// one. 00219 void addCalledFunction(CallSite CS, CallGraphNode *M) { 00220 CalledFunctions.push_back(std::make_pair(CS, M)); 00221 } 00222 00223 /// removeCallEdgeFor - This method removes the edge in the node for the 00224 /// specified call site. Note that this method takes linear time, so it 00225 /// should be used sparingly. 00226 void removeCallEdgeFor(CallSite CS); 00227 00228 /// removeAnyCallEdgeTo - This method removes all call edges from this node 00229 /// to the specified callee function. This takes more time to execute than 00230 /// removeCallEdgeTo, so it should not be used unless necessary. 00231 void removeAnyCallEdgeTo(CallGraphNode *Callee); 00232 00233 /// removeOneAbstractEdgeTo - Remove one edge associated with a null callsite 00234 /// from this node to the specified callee function. 00235 void removeOneAbstractEdgeTo(CallGraphNode *Callee); 00236 00237 /// replaceCallSite - Make the edge in the node for Old CallSite be for 00238 /// New CallSite instead. Note that this method takes linear time, so it 00239 /// should be used sparingly. 00240 void replaceCallSite(CallSite Old, CallSite New); 00241 00242 friend class CallGraph; 00243 00244 // CallGraphNode ctor - Create a node for the specified function. 00245 inline CallGraphNode(Function *f) : F(f) {} 00246 }; 00247 00248 //===----------------------------------------------------------------------===// 00249 // GraphTraits specializations for call graphs so that they can be treated as 00250 // graphs by the generic graph algorithms. 00251 // 00252 00253 // Provide graph traits for tranversing call graphs using standard graph 00254 // traversals. 00255 template <> struct GraphTraits<CallGraphNode*> { 00256 typedef CallGraphNode NodeType; 00257 00258 typedef std::pair<CallSite, CallGraphNode*> CGNPairTy; 00259 typedef std::pointer_to_unary_function<CGNPairTy, CallGraphNode*> CGNDerefFun; 00260 00261 static NodeType *getEntryNode(CallGraphNode *CGN) { return CGN; } 00262 00263 typedef mapped_iterator<NodeType::iterator, CGNDerefFun> ChildIteratorType; 00264 00265 static inline ChildIteratorType child_begin(NodeType *N) { 00266 return map_iterator(N->begin(), CGNDerefFun(CGNDeref)); 00267 } 00268 static inline ChildIteratorType child_end (NodeType *N) { 00269 return map_iterator(N->end(), CGNDerefFun(CGNDeref)); 00270 } 00271 00272 static CallGraphNode *CGNDeref(CGNPairTy P) { 00273 return P.second; 00274 } 00275 00276 }; 00277 00278 template <> struct GraphTraits<const CallGraphNode*> { 00279 typedef const CallGraphNode NodeType; 00280 typedef NodeType::const_iterator ChildIteratorType; 00281 00282 static NodeType *getEntryNode(const CallGraphNode *CGN) { return CGN; } 00283 static inline ChildIteratorType child_begin(NodeType *N) { return N->begin();} 00284 static inline ChildIteratorType child_end (NodeType *N) { return N->end(); } 00285 }; 00286 00287 template<> struct GraphTraits<CallGraph*> : public GraphTraits<CallGraphNode*> { 00288 static NodeType *getEntryNode(CallGraph *CGN) { 00289 return CGN->getExternalCallingNode(); // Start at the external node! 00290 } 00291 typedef std::pair<const Function*, CallGraphNode*> PairTy; 00292 typedef std::pointer_to_unary_function<PairTy, CallGraphNode&> DerefFun; 00293 00294 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph 00295 typedef mapped_iterator<CallGraph::iterator, DerefFun> nodes_iterator; 00296 static nodes_iterator nodes_begin(CallGraph *CG) { 00297 return map_iterator(CG->begin(), DerefFun(CGdereference)); 00298 } 00299 static nodes_iterator nodes_end (CallGraph *CG) { 00300 return map_iterator(CG->end(), DerefFun(CGdereference)); 00301 } 00302 00303 static CallGraphNode &CGdereference(PairTy P) { 00304 return *P.second; 00305 } 00306 }; 00307 00308 template<> struct GraphTraits<const CallGraph*> : 00309 public GraphTraits<const CallGraphNode*> { 00310 static NodeType *getEntryNode(const CallGraph *CGN) { 00311 return CGN->getExternalCallingNode(); 00312 } 00313 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph 00314 typedef CallGraph::const_iterator nodes_iterator; 00315 static nodes_iterator nodes_begin(const CallGraph *CG) { return CG->begin(); } 00316 static nodes_iterator nodes_end (const CallGraph *CG) { return CG->end(); } 00317 }; 00318 00319 } // End llvm namespace 00320 00321 // Make sure that any clients of this file link in CallGraph.cpp 00322 FORCE_DEFINING_FILE_TO_BE_LINKED(CallGraph) 00323 00324 #endif
This web site is hosted by the Computer Science Department at the University of Illinois at Urbana-Champaign.