More additions
[oota-llvm.git] / lib / Analysis / IPA / CallGraph.cpp
1 //===- CallGraph.cpp - Build a Module's call graph ------------------------===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This interface is used to build and manipulate a call graph, which is a very 
11 // useful tool for interprocedural optimization.
12 //
13 // Every function in a module is represented as a node in the call graph.  The
14 // callgraph node keeps track of which functions the are called by the function
15 // corresponding to the node.
16 //
17 // A call graph will contain nodes where the function that they correspond to is
18 // null.  This 'external' node is used to represent control flow that is not
19 // represented (or analyzable) in the module.  As such, the external node will
20 // have edges to functions with the following properties:
21 //   1. All functions in the module without internal linkage, since they could
22 //      be called by functions outside of the our analysis capability.
23 //   2. All functions whose address is used for something more than a direct
24 //      call, for example being stored into a memory location.  Since they may
25 //      be called by an unknown caller later, they must be tracked as such.
26 //
27 // Similarly, functions have a call edge to the external node iff:
28 //   1. The function is external, reflecting the fact that they could call
29 //      anything without internal linkage or that has its address taken.
30 //   2. The function contains an indirect function call.
31 //
32 // As an extension in the future, there may be multiple nodes with a null
33 // function.  These will be used when we can prove (through pointer analysis)
34 // that an indirect call site can call only a specific set of functions.
35 //
36 // Because of these properties, the CallGraph captures a conservative superset
37 // of all of the caller-callee relationships, which is useful for
38 // transformations.
39 //
40 // The CallGraph class also attempts to figure out what the root of the
41 // CallGraph is, which is currently does by looking for a function named 'main'.
42 // If no function named 'main' is found, the external node is used as the entry
43 // node, reflecting the fact that any function without internal linkage could
44 // be called into (which is common for libraries).
45 //
46 //===----------------------------------------------------------------------===//
47
48 #include "llvm/Analysis/CallGraph.h"
49 #include "llvm/Constants.h"     // Remove when ConstantPointerRefs are gone
50 #include "llvm/Module.h"
51 #include "llvm/iOther.h"
52 #include "llvm/iTerminators.h"
53 #include "llvm/Support/CallSite.h"
54 #include "Support/STLExtras.h"
55
56 static RegisterAnalysis<CallGraph> X("callgraph", "Call Graph Construction");
57
58 static const char * const KnownExternalFunctions[] = {
59   // Low-level system calls
60   "open",
61   "read",
62   "write",
63   "writev",
64   "lseek",
65   "poll",
66   "ioctl",
67
68   // Low-level stdc library functions
69   "abort", "exit",
70   "getenv", "putenv",
71   
72   // Standard IO functions
73   "printf",
74   "sprintf",
75   "fopen",
76   "freopen",
77   "fclose",
78   "fwrite",
79   "puts",
80   "fputs",
81   "getc",
82   "ungetc",
83   "putc",
84   "putchar",
85   "fread",
86   "fileno",
87   "ftell",
88   "fflush",
89   "fseek",
90   "fileno",
91   "ferror",
92   "feof",
93   "fdopen",
94   "__fxstat",
95   "setbuf",
96   "setbuffer",
97   "etlinebuf",
98   "setvbuf",
99
100   // Memory functions
101   "malloc",
102   "free",
103   "realloc",
104   "calloc",
105   "memalign",
106   
107   // String functions
108   "atoi",
109   "memmove",
110   "memset",
111   "memchr",
112   "memcmp",
113   "strchr",
114   "strncpy",
115   "strncmp",
116   "strcmp",
117   "strtok",
118   "__strcoll_l",
119   "__strxfrm_l",
120   "__strftime_l",
121   "__strtol_l",
122   "__strtoul_l",
123   "__strtoll_l",
124   "__strtoull_l",
125   "__strtof_l",
126   "__strtod_l",
127   "__strtold_l",
128   "isalpha",
129
130   // Math functions
131   "exp", "sqrt", "cbrt", "hypot",
132   "log", "log10", "pow",
133   "sin", "cos", "tan",
134   "asin", "acos", "atan", "atan2",
135
136   // Locale functions
137   "__uselocale",
138   "__newlocale",
139   "__freelocale",
140   "__duplocale",
141   "__nl_langinfo_l",
142
143   // gettext functions used by libstdc++
144   "gettext",
145   "dgettext",
146   "dcgettext",
147   "textdomain",
148   "bindtextdomain",
149   
150   // Random stuff
151   "__assert_fail",
152   "__errno_location",
153   "clock", "time",
154   "__main",
155 };
156
157
158 /// ExternalFunctionDoesntCallIntoProgram - This hack is used to indicate to the
159 /// call graph that the specified external function is _KNOWN_ to not call back
160 /// into the program.  This is important, because otherwise functions which call
161 /// "printf" for example, end up in a great big SCC that goes from the function
162 /// through main.
163 ///
164 static bool ExternalFunctionDoesntCallIntoProgram(const std::string &Name) {
165   static std::vector<std::string> Funcs;
166
167   // First time this is called?
168   if (Funcs.empty()) {
169     // Add a whole bunch of functions which are often used...
170     Funcs.insert(Funcs.end(), KnownExternalFunctions,
171                  KnownExternalFunctions+
172               sizeof(KnownExternalFunctions)/sizeof(KnownExternalFunctions[0]));
173     // Sort the list for efficient access
174     std::sort(Funcs.begin(), Funcs.end());
175   }
176
177   if (Name.size() > 7 && !memcmp("__llvm_", Name.c_str(), 7))
178     return true;
179
180   // Binary search for the function name...
181   std::vector<std::string>::iterator I =
182     std::lower_bound(Funcs.begin(), Funcs.end(), Name);
183
184   // Found it?
185   return I != Funcs.end() && *I == Name;
186 }
187
188
189
190 // getNodeFor - Return the node for the specified function or create one if it
191 // does not already exist.
192 //
193 CallGraphNode *CallGraph::getNodeFor(Function *F) {
194   CallGraphNode *&CGN = FunctionMap[F];
195   if (CGN) return CGN;
196
197   assert((!F || F->getParent() == Mod) && "Function not in current module!");
198   return CGN = new CallGraphNode(F);
199 }
200
201 static bool isOnlyADirectCall(Function *F, CallSite CS) {
202   if (!CS.getInstruction()) return false;
203   for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); I != E; ++I)
204     if (*I == F) return false;
205   return true;
206 }
207
208 // addToCallGraph - Add a function to the call graph, and link the node to all
209 // of the functions that it calls.
210 //
211 void CallGraph::addToCallGraph(Function *F) {
212   CallGraphNode *Node = getNodeFor(F);
213
214   // If this function has external linkage, anything could call it...
215   if (!F->hasInternalLinkage()) {
216     ExternalNode->addCalledFunction(Node);
217
218     // Found the entry point?
219     if (F->getName() == "main") {
220       if (Root)
221         Root = ExternalNode;  // Found multiple external mains?  Don't pick one.
222       else
223         Root = Node;          // Found a main, keep track of it!
224     }
225   }
226   
227   // If this function is not defined in this translation unit, it could call
228   // anything.
229   if (F->isExternal() && !F->getIntrinsicID() && 
230       !ExternalFunctionDoesntCallIntoProgram(F->getName()))
231     Node->addCalledFunction(ExternalNode);
232
233   // Loop over all of the users of the function... looking for callers...
234   //
235   bool isUsedExternally = false;
236   for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ++I) {
237     if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
238       if (isOnlyADirectCall(F, CallSite::get(Inst)))
239         getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
240       else
241         isUsedExternally = true;
242     } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(*I)) {
243       // THIS IS A DISGUSTING HACK.  Brought to you by the power of
244       // ConstantPointerRefs!
245       for (Value::use_iterator I = CPR->use_begin(), E = CPR->use_end();
246            I != E; ++I)
247         if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
248           if (isOnlyADirectCall(F, CallSite::get(Inst)))
249             getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
250           else
251             isUsedExternally = true;
252         } else {
253           isUsedExternally = true;
254         }
255     } else {                        // Can't classify the user!
256       isUsedExternally = true;
257     }
258   }
259   if (isUsedExternally)
260     ExternalNode->addCalledFunction(Node);
261
262   // Look for an indirect function call...
263   for (Function::iterator BB = F->begin(), BBE = F->end(); BB != BBE; ++BB)
264     for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II){
265       CallSite CS = CallSite::get(II);
266       if (CS.getInstruction() && !CS.getCalledFunction())
267         Node->addCalledFunction(ExternalNode);
268     }
269 }
270
271 bool CallGraph::run(Module &M) {
272   destroy();
273
274   Mod = &M;
275   ExternalNode = getNodeFor(0);
276   Root = 0;
277
278   // Add every function to the call graph...
279   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
280     addToCallGraph(I);
281
282   // If we didn't find a main function, use the external call graph node
283   if (Root == 0) Root = ExternalNode;
284   
285   return false;
286 }
287
288 void CallGraph::destroy() {
289   for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end();
290        I != E; ++I)
291     delete I->second;
292   FunctionMap.clear();
293 }
294
295 static void WriteToOutput(const CallGraphNode *CGN, std::ostream &o) {
296   if (CGN->getFunction())
297     o << "Call graph node for function: '"
298       << CGN->getFunction()->getName() <<"'\n";
299   else
300     o << "Call graph node <<null function: 0x" << CGN << ">>:\n";
301
302   for (unsigned i = 0; i < CGN->size(); ++i)
303     if ((*CGN)[i]->getFunction())
304       o << "  Calls function '" << (*CGN)[i]->getFunction()->getName() << "'\n";
305     else
306       o << "  Calls external node\n";
307   o << "\n";
308 }
309
310 void CallGraph::print(std::ostream &o, const Module *M) const {
311   o << "CallGraph Root is: ";
312   if (getRoot()->getFunction())
313     o << getRoot()->getFunction()->getName() << "\n";
314   else
315     o << "<<null function: 0x" << getRoot() << ">>\n";
316   
317   for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I)
318     WriteToOutput(I->second, o);
319 }
320
321
322 //===----------------------------------------------------------------------===//
323 // Implementations of public modification methods
324 //
325
326 // Functions to keep a call graph up to date with a function that has been
327 // modified
328 //
329 void CallGraph::addFunctionToModule(Function *Meth) {
330   assert(0 && "not implemented");
331   abort();
332 }
333
334 // removeFunctionFromModule - Unlink the function from this module, returning
335 // it.  Because this removes the function from the module, the call graph node
336 // is destroyed.  This is only valid if the function does not call any other
337 // functions (ie, there are no edges in it's CGN).  The easiest way to do this
338 // is to dropAllReferences before calling this.
339 //
340 Function *CallGraph::removeFunctionFromModule(CallGraphNode *CGN) {
341   assert(CGN->CalledFunctions.empty() && "Cannot remove function from call "
342          "graph if it references other functions!");
343   Function *F = CGN->getFunction(); // Get the function for the call graph node
344   delete CGN;                       // Delete the call graph node for this func
345   FunctionMap.erase(F);             // Remove the call graph node from the map
346
347   Mod->getFunctionList().remove(F);
348   return F;
349 }
350
351 void CallGraph::stub() {}