Make the call graph more precise despite the hated constantpointerrefs.
[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",
70   "getenv",
71   "putenv",
72   
73   // Standard IO functions
74   "printf",
75   "sprintf",
76   "fopen",
77   "freopen",
78   "fclose",
79   "fwrite",
80   "puts",
81   "fputs",
82   "getc",
83   "ungetc",
84   "putc",
85   "putchar",
86   "fread",
87   "fileno",
88   "ftell",
89   "fflush",
90   "fseek",
91   "fileno",
92   "ferror",
93   "feof",
94   "fdopen",
95   "__fxstat",
96   "setbuf",
97   "setbuffer",
98   "etlinebuf",
99   "setvbuf",
100
101   // Memory functions
102   "malloc",
103   "free",
104   "realloc",
105   "calloc",
106   "memalign",
107   
108   // String functions
109   "atoi",
110   "memmove",
111   "memset",
112   "memchr",
113   "memcmp",
114   "strchr",
115   "strncpy",
116   "strncmp",
117   "strcmp",
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
129   // Locale functions
130   "__uselocale",
131   "__newlocale",
132   "__freelocale",
133   "__duplocale",
134   "__nl_langinfo_l",
135
136   // gettext functions used by libstdc++
137   "gettext",
138   "dgettext",
139   "dcgettext",
140   "textdomain",
141   "bindtextdomain",
142   
143   // Random stuff
144   "__assert_fail",
145   "__errno_location",
146 };
147
148
149 /// ExternalFunctionDoesntCallIntoProgram - This hack is used to indicate to the
150 /// call graph that the specified external function is _KNOWN_ to not call back
151 /// into the program.  This is important, because otherwise functions which call
152 /// "printf" for example, end up in a great big SCC that goes from the function
153 /// through main.
154 ///
155 static bool ExternalFunctionDoesntCallIntoProgram(const std::string &Name) {
156   static std::vector<std::string> Funcs;
157
158   // First time this is called?
159   if (Funcs.empty()) {
160     // Add a whole bunch of functions which are often used...
161     Funcs.insert(Funcs.end(), KnownExternalFunctions,
162                  KnownExternalFunctions+
163               sizeof(KnownExternalFunctions)/sizeof(KnownExternalFunctions[0]));
164     // Sort the list for efficient access
165     std::sort(Funcs.begin(), Funcs.end());
166   }
167
168   // Binary search for the function name...
169   std::vector<std::string>::iterator I =
170     std::lower_bound(Funcs.begin(), Funcs.end(), Name);
171
172   // Found it?
173   return I != Funcs.end() && *I == Name;
174 }
175
176
177
178 // getNodeFor - Return the node for the specified function or create one if it
179 // does not already exist.
180 //
181 CallGraphNode *CallGraph::getNodeFor(Function *F) {
182   CallGraphNode *&CGN = FunctionMap[F];
183   if (CGN) return CGN;
184
185   assert((!F || F->getParent() == Mod) && "Function not in current module!");
186   return CGN = new CallGraphNode(F);
187 }
188
189 static bool isOnlyADirectCall(Function *F, CallSite CS) {
190   if (!CS.getInstruction()) return false;
191   for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); I != E; ++I)
192     if (*I == F) return false;
193   return true;
194 }
195
196 // addToCallGraph - Add a function to the call graph, and link the node to all
197 // of the functions that it calls.
198 //
199 void CallGraph::addToCallGraph(Function *F) {
200   CallGraphNode *Node = getNodeFor(F);
201
202   // If this function has external linkage, anything could call it...
203   if (!F->hasInternalLinkage()) {
204     ExternalNode->addCalledFunction(Node);
205
206     // Found the entry point?
207     if (F->getName() == "main") {
208       if (Root)
209         Root = ExternalNode;  // Found multiple external mains?  Don't pick one.
210       else
211         Root = Node;          // Found a main, keep track of it!
212     }
213   }
214   
215   // If this function is not defined in this translation unit, it could call
216   // anything.
217   if (F->isExternal() && !F->getIntrinsicID() && 
218       !ExternalFunctionDoesntCallIntoProgram(F->getName()))
219     Node->addCalledFunction(ExternalNode);
220
221   // Loop over all of the users of the function... looking for callers...
222   //
223   bool isUsedExternally = false;
224   for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ++I) {
225     if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
226       if (isOnlyADirectCall(F, CallSite::get(Inst)))
227         getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
228       else
229         isUsedExternally = true;
230     } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(*I)) {
231       // THIS IS A DISGUSTING HACK.  Brought to you by the power of
232       // ConstantPointerRefs!
233       for (Value::use_iterator I = CPR->use_begin(), E = CPR->use_end();
234            I != E; ++I)
235         if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
236           if (isOnlyADirectCall(F, CallSite::get(Inst)))
237             getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
238           else
239             isUsedExternally = true;
240         } else {
241           isUsedExternally = true;
242         }
243     } else {                        // Can't classify the user!
244       isUsedExternally = true;
245     }
246   }
247   if (isUsedExternally)
248     ExternalNode->addCalledFunction(Node);
249
250   // Look for an indirect function call...
251   for (Function::iterator BB = F->begin(), BBE = F->end(); BB != BBE; ++BB)
252     for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II){
253       CallSite CS = CallSite::get(II);
254       if (CS.getInstruction() && !CS.getCalledFunction())
255         Node->addCalledFunction(ExternalNode);
256     }
257 }
258
259 bool CallGraph::run(Module &M) {
260   destroy();
261
262   Mod = &M;
263   ExternalNode = getNodeFor(0);
264   Root = 0;
265
266   // Add every function to the call graph...
267   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
268     addToCallGraph(I);
269
270   // If we didn't find a main function, use the external call graph node
271   if (Root == 0) Root = ExternalNode;
272   
273   return false;
274 }
275
276 void CallGraph::destroy() {
277   for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end();
278        I != E; ++I)
279     delete I->second;
280   FunctionMap.clear();
281 }
282
283 static void WriteToOutput(const CallGraphNode *CGN, std::ostream &o) {
284   if (CGN->getFunction())
285     o << "Call graph node for function: '"
286       << CGN->getFunction()->getName() <<"'\n";
287   else
288     o << "Call graph node <<null function: 0x" << CGN << ">>:\n";
289
290   for (unsigned i = 0; i < CGN->size(); ++i)
291     if ((*CGN)[i]->getFunction())
292       o << "  Calls function '" << (*CGN)[i]->getFunction()->getName() << "'\n";
293     else
294       o << "  Calls external node\n";
295   o << "\n";
296 }
297
298 void CallGraph::print(std::ostream &o, const Module *M) const {
299   o << "CallGraph Root is: ";
300   if (getRoot()->getFunction())
301     o << getRoot()->getFunction()->getName() << "\n";
302   else
303     o << "<<null function: 0x" << getRoot() << ">>\n";
304   
305   for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I)
306     WriteToOutput(I->second, o);
307 }
308
309
310 //===----------------------------------------------------------------------===//
311 // Implementations of public modification methods
312 //
313
314 // Functions to keep a call graph up to date with a function that has been
315 // modified
316 //
317 void CallGraph::addFunctionToModule(Function *Meth) {
318   assert(0 && "not implemented");
319   abort();
320 }
321
322 // removeFunctionFromModule - Unlink the function from this module, returning
323 // it.  Because this removes the function from the module, the call graph node
324 // is destroyed.  This is only valid if the function does not call any other
325 // functions (ie, there are no edges in it's CGN).  The easiest way to do this
326 // is to dropAllReferences before calling this.
327 //
328 Function *CallGraph::removeFunctionFromModule(CallGraphNode *CGN) {
329   assert(CGN->CalledFunctions.empty() && "Cannot remove function from call "
330          "graph if it references other functions!");
331   Function *F = CGN->getFunction(); // Get the function for the call graph node
332   delete CGN;                       // Delete the call graph node for this func
333   FunctionMap.erase(F);             // Remove the call graph node from the map
334
335   Mod->getFunctionList().remove(F);
336   return F;
337 }
338
339 void CallGraph::stub() {}