Fix bug: FunctionResolve/2003-05-31-AllInternalDecls.ll
[oota-llvm.git] / lib / Transforms / IPO / FunctionResolution.cpp
1 //===- FunctionResolution.cpp - Resolve declarations to implementations ---===//
2 //
3 // Loop over the functions that are in the module and look for functions that
4 // have the same name.  More often than not, there will be things like:
5 //
6 //    declare void %foo(...)
7 //    void %foo(int, int) { ... }
8 //
9 // because of the way things are declared in C.  If this is the case, patch
10 // things up.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/Transforms/IPO.h"
15 #include "llvm/Module.h"
16 #include "llvm/SymbolTable.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Pass.h"
19 #include "llvm/iOther.h"
20 #include "llvm/Constants.h"
21 #include "llvm/Assembly/Writer.h"  // FIXME: remove when varargs implemented
22 #include "Support/Statistic.h"
23 #include <algorithm>
24
25 namespace {
26   Statistic<>NumResolved("funcresolve", "Number of varargs functions resolved");
27   Statistic<> NumGlobals("funcresolve", "Number of global variables resolved");
28
29   struct FunctionResolvingPass : public Pass {
30     bool run(Module &M);
31   };
32   RegisterOpt<FunctionResolvingPass> X("funcresolve", "Resolve Functions");
33 }
34
35 Pass *createFunctionResolvingPass() {
36   return new FunctionResolvingPass();
37 }
38
39 // ConvertCallTo - Convert a call to a varargs function with no arg types
40 // specified to a concrete nonvarargs function.
41 //
42 static void ConvertCallTo(CallInst *CI, Function *Dest) {
43   const FunctionType::ParamTypes &ParamTys =
44     Dest->getFunctionType()->getParamTypes();
45   BasicBlock *BB = CI->getParent();
46
47   // Keep an iterator to where we want to insert cast instructions if the
48   // argument types don't agree.
49   //
50   unsigned NumArgsToCopy = CI->getNumOperands()-1;
51   if (NumArgsToCopy != ParamTys.size() &&
52       !(NumArgsToCopy > ParamTys.size() &&
53         Dest->getFunctionType()->isVarArg())) {
54     std::cerr << "WARNING: Call arguments do not match expected number of"
55               << " parameters.\n";
56     std::cerr << "WARNING: In function '"
57               << CI->getParent()->getParent()->getName() << "': call: " << *CI;
58     std::cerr << "Function resolved to: ";
59     WriteAsOperand(std::cerr, Dest);
60     std::cerr << "\n";
61     if (NumArgsToCopy > ParamTys.size())
62       NumArgsToCopy = ParamTys.size();
63   }
64
65   std::vector<Value*> Params;
66
67   // Convert all of the call arguments over... inserting cast instructions if
68   // the types are not compatible.
69   for (unsigned i = 1; i <= NumArgsToCopy; ++i) {
70     Value *V = CI->getOperand(i);
71
72     if (i-1 < ParamTys.size() && V->getType() != ParamTys[i-1]) {
73       // Must insert a cast...
74       V = new CastInst(V, ParamTys[i-1], "argcast", CI);
75     }
76
77     Params.push_back(V);
78   }
79   
80   // If the function takes extra parameters that are not being passed in, pass
81   // null values in now...
82   for (unsigned i = NumArgsToCopy; i < ParamTys.size(); ++i)
83     Params.push_back(Constant::getNullValue(ParamTys[i]));
84
85   // Replace the old call instruction with a new call instruction that calls
86   // the real function.
87   //
88   Instruction *NewCall = new CallInst(Dest, Params, "", CI);
89   std::string Name = CI->getName(); CI->setName("");
90
91   // Transfer the name over...
92   if (NewCall->getType() != Type::VoidTy)
93     NewCall->setName(Name);
94
95   // Replace uses of the old instruction with the appropriate values...
96   //
97   if (NewCall->getType() == CI->getType()) {
98     CI->replaceAllUsesWith(NewCall);
99     NewCall->setName(Name);
100
101   } else if (NewCall->getType() == Type::VoidTy) {
102     // Resolved function does not return a value but the prototype does.  This
103     // often occurs because undefined functions default to returning integers.
104     // Just replace uses of the call (which are broken anyway) with dummy
105     // values.
106     CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
107   } else if (CI->getType() == Type::VoidTy) {
108     // If we are gaining a new return value, we don't have to do anything
109     // special here, because it will automatically be ignored.
110   } else {
111     // Insert a cast instruction to convert the return value of the function
112     // into it's new type.  Of course we only need to do this if the return
113     // value of the function is actually USED.
114     //
115     if (!CI->use_empty()) {
116       // Insert the new cast instruction...
117       CastInst *NewCast = new CastInst(NewCall, CI->getType(), Name, CI);
118       CI->replaceAllUsesWith(NewCast);
119     }
120   }
121
122   // The old instruction is no longer needed, destroy it!
123   BB->getInstList().erase(CI);
124 }
125
126
127 static bool ResolveFunctions(Module &M, std::vector<GlobalValue*> &Globals,
128                              Function *Concrete) {
129   bool Changed = false;
130   for (unsigned i = 0; i != Globals.size(); ++i)
131     if (Globals[i] != Concrete) {
132       Function *Old = cast<Function>(Globals[i]);
133       const FunctionType *OldMT = Old->getFunctionType();
134       const FunctionType *ConcreteMT = Concrete->getFunctionType();
135       
136       if (OldMT->getParamTypes().size() > ConcreteMT->getParamTypes().size() &&
137           !ConcreteMT->isVarArg())
138         if (!Old->use_empty()) {
139           std::cerr << "WARNING: Linking function '" << Old->getName()
140                     << "' is causing arguments to be dropped.\n";
141           std::cerr << "WARNING: Prototype: ";
142           WriteAsOperand(std::cerr, Old);
143           std::cerr << " resolved to ";
144           WriteAsOperand(std::cerr, Concrete);
145           std::cerr << "\n";
146         }
147       
148       // Check to make sure that if there are specified types, that they
149       // match...
150       //
151       unsigned NumArguments = std::min(OldMT->getParamTypes().size(),
152                                        ConcreteMT->getParamTypes().size());
153
154       if (!Old->use_empty() && !Concrete->use_empty())
155         for (unsigned i = 0; i < NumArguments; ++i)
156           if (OldMT->getParamTypes()[i] != ConcreteMT->getParamTypes()[i]) {
157             std::cerr << "WARNING: Function [" << Old->getName()
158                       << "]: Parameter types conflict for: '" << OldMT
159                       << "' and '" << ConcreteMT << "'\n";
160             return Changed;
161           }
162       
163       // Attempt to convert all of the uses of the old function to the concrete
164       // form of the function.  If there is a use of the fn that we don't
165       // understand here we punt to avoid making a bad transformation.
166       //
167       // At this point, we know that the return values are the same for our two
168       // functions and that the Old function has no varargs fns specified.  In
169       // otherwords it's just <retty> (...)
170       //
171       for (unsigned i = 0; i < Old->use_size(); ) {
172         User *U = *(Old->use_begin()+i);
173         if (CastInst *CI = dyn_cast<CastInst>(U)) {
174           // Convert casts directly
175           assert(CI->getOperand(0) == Old);
176           CI->setOperand(0, Concrete);
177           Changed = true;
178           ++NumResolved;
179         } else if (CallInst *CI = dyn_cast<CallInst>(U)) {
180           // Can only fix up calls TO the argument, not args passed in.
181           if (CI->getCalledValue() == Old) {
182             ConvertCallTo(CI, Concrete);
183             Changed = true;
184             ++NumResolved;
185           } else {
186             ++i;
187           }
188         } else {
189           ++i;
190         }
191       }
192
193       // If there are any more uses that we could not resolve, force them to use
194       // a casted pointer now.
195       if (!Old->use_empty()) {
196         NumResolved += Old->use_size();
197         Constant *NewCPR = ConstantPointerRef::get(Concrete);
198         Old->replaceAllUsesWith(ConstantExpr::getCast(NewCPR, Old->getType()));
199         Changed = true;
200       }
201
202       // Since there are no uses of Old anymore, remove it from the module.
203       M.getFunctionList().erase(Old);
204     }
205   return Changed;
206 }
207
208
209 static bool ResolveGlobalVariables(Module &M,
210                                    std::vector<GlobalValue*> &Globals,
211                                    GlobalVariable *Concrete) {
212   bool Changed = false;
213   assert(isa<ArrayType>(Concrete->getType()->getElementType()) &&
214          "Concrete version should be an array type!");
215
216   // Get the type of the things that may be resolved to us...
217   const ArrayType *CATy =cast<ArrayType>(Concrete->getType()->getElementType());
218   const Type *AETy = CATy->getElementType();
219
220   Constant *CCPR = ConstantPointerRef::get(Concrete);
221
222   for (unsigned i = 0; i != Globals.size(); ++i)
223     if (Globals[i] != Concrete) {
224       GlobalVariable *Old = cast<GlobalVariable>(Globals[i]);
225       const ArrayType *OATy = cast<ArrayType>(Old->getType()->getElementType());
226       if (OATy->getElementType() != AETy || OATy->getNumElements() != 0) {
227         std::cerr << "WARNING: Two global variables exist with the same name "
228                   << "that cannot be resolved!\n";
229         return false;
230       }
231
232       Old->replaceAllUsesWith(ConstantExpr::getCast(CCPR, Old->getType()));
233
234       // Since there are no uses of Old anymore, remove it from the module.
235       M.getGlobalList().erase(Old);
236
237       ++NumGlobals;
238       Changed = true;
239     }
240   return Changed;
241 }
242
243 static bool ProcessGlobalsWithSameName(Module &M,
244                                        std::vector<GlobalValue*> &Globals) {
245   assert(!Globals.empty() && "Globals list shouldn't be empty here!");
246
247   bool isFunction = isa<Function>(Globals[0]);   // Is this group all functions?
248   GlobalValue *Concrete = 0;  // The most concrete implementation to resolve to
249
250   assert((isFunction ^ isa<GlobalVariable>(Globals[0])) &&
251          "Should either be function or gvar!");
252
253   for (unsigned i = 0; i != Globals.size(); ) {
254     if (isa<Function>(Globals[i]) != isFunction) {
255       std::cerr << "WARNING: Found function and global variable with the "
256                 << "same name: '" << Globals[i]->getName() << "'.\n";
257       return false;                 // Don't know how to handle this, bail out!
258     }
259
260     if (isFunction) {
261       // For functions, we look to merge functions definitions of "int (...)"
262       // to 'int (int)' or 'int ()' or whatever else is not completely generic.
263       //
264       Function *F = cast<Function>(Globals[i]);
265       if (!F->isExternal()) {
266         if (Concrete && !Concrete->isExternal())
267           return false;   // Found two different functions types.  Can't choose!
268         
269         Concrete = Globals[i];
270       } else if (Concrete) {
271         if (Concrete->isExternal()) // If we have multiple external symbols...x
272           if (F->getFunctionType()->getNumParams() > 
273               cast<Function>(Concrete)->getFunctionType()->getNumParams())
274             Concrete = F;  // We are more concrete than "Concrete"!
275
276       } else {
277         Concrete = F;
278       }
279     } else {
280       // For global variables, we have to merge C definitions int A[][4] with
281       // int[6][4].  A[][4] is represented as A[0][4] by the CFE.
282       GlobalVariable *GV = cast<GlobalVariable>(Globals[i]);
283       if (!isa<ArrayType>(GV->getType()->getElementType())) {
284         Concrete = 0;
285         break;  // Non array's cannot be compatible with other types.
286       } else if (Concrete == 0) {
287         Concrete = GV;
288       } else {
289         // Must have different types... allow merging A[0][4] w/ A[6][4] if
290         // A[0][4] is external.
291         const ArrayType *NAT = cast<ArrayType>(GV->getType()->getElementType());
292         const ArrayType *CAT =
293           cast<ArrayType>(Concrete->getType()->getElementType());
294
295         if (NAT->getElementType() != CAT->getElementType()) {
296           Concrete = 0;  // Non-compatible types
297           break;
298         } else if (NAT->getNumElements() == 0 && GV->isExternal()) {
299           // Concrete remains the same
300         } else if (CAT->getNumElements() == 0 && Concrete->isExternal()) {
301           Concrete = GV;   // Concrete becomes GV
302         } else {
303           Concrete = 0;    // Cannot merge these types...
304           break;
305         }
306       }
307     }
308     ++i;
309   }
310
311   if (Globals.size() > 1) {         // Found a multiply defined global...
312     // If there are no external declarations, and there is at most one
313     // externally visible instance of the global, then there is nothing to do.
314     //
315     bool HasExternal = false;
316     unsigned NumInstancesWithExternalLinkage = 0;
317
318     for (unsigned i = 0, e = Globals.size(); i != e; ++i) {
319       if (Globals[i]->isExternal())
320         HasExternal = true;
321       else if (!Globals[i]->hasInternalLinkage())
322         NumInstancesWithExternalLinkage++;
323     }
324     
325     if (!HasExternal && NumInstancesWithExternalLinkage <= 1)
326       return false;  // Nothing to do?  Must have multiple internal definitions.
327
328
329     // We should find exactly one concrete function definition, which is
330     // probably the implementation.  Change all of the function definitions and
331     // uses to use it instead.
332     //
333     if (!Concrete) {
334       std::cerr << "WARNING: Found global types that are not compatible:\n";
335       for (unsigned i = 0; i < Globals.size(); ++i) {
336         std::cerr << "\t" << Globals[i]->getType()->getDescription() << " %"
337                   << Globals[i]->getName() << "\n";
338       }
339       std::cerr << "  No linkage of globals named '" << Globals[0]->getName()
340                 << "' performed!\n";
341       return false;
342     }
343
344     if (isFunction)
345       return ResolveFunctions(M, Globals, cast<Function>(Concrete));
346     else
347       return ResolveGlobalVariables(M, Globals,
348                                     cast<GlobalVariable>(Concrete));
349   }
350   return false;
351 }
352
353 bool FunctionResolvingPass::run(Module &M) {
354   SymbolTable &ST = M.getSymbolTable();
355
356   std::map<std::string, std::vector<GlobalValue*> > Globals;
357
358   // Loop over the entries in the symbol table. If an entry is a func pointer,
359   // then add it to the Functions map.  We do a two pass algorithm here to avoid
360   // problems with iterators getting invalidated if we did a one pass scheme.
361   //
362   for (SymbolTable::iterator I = ST.begin(), E = ST.end(); I != E; ++I)
363     if (const PointerType *PT = dyn_cast<PointerType>(I->first)) {
364       SymbolTable::VarMap &Plane = I->second;
365       for (SymbolTable::type_iterator PI = Plane.begin(), PE = Plane.end();
366            PI != PE; ++PI) {
367         GlobalValue *GV = cast<GlobalValue>(PI->second);
368         assert(PI->first == GV->getName() &&
369                "Global name and symbol table do not agree!");
370         Globals[PI->first].push_back(GV);
371       }
372     }
373
374   bool Changed = false;
375
376   // Now we have a list of all functions with a particular name.  If there is
377   // more than one entry in a list, merge the functions together.
378   //
379   for (std::map<std::string, std::vector<GlobalValue*> >::iterator
380          I = Globals.begin(), E = Globals.end(); I != E; ++I)
381     Changed |= ProcessGlobalsWithSameName(M, I->second);
382
383   // Now loop over all of the globals, checking to see if any are trivially
384   // dead.  If so, remove them now.
385
386   for (Module::iterator I = M.begin(), E = M.end(); I != E; )
387     if (I->isExternal() && I->use_empty()) {
388       Function *F = I;
389       ++I;
390       M.getFunctionList().erase(F);
391       ++NumResolved;
392       Changed = true;
393     } else {
394       ++I;
395     }
396
397   for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; )
398     if (I->isExternal() && I->use_empty()) {
399       GlobalVariable *GV = I;
400       ++I;
401       M.getGlobalList().erase(GV);
402       ++NumGlobals;
403       Changed = true;
404     } else {
405       ++I;
406     }
407
408   return Changed;
409 }