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