Funcresolve no longer performs nicification of resolved functions
[oota-llvm.git] / tools / gccld / gccld.cpp
1 //===- gccld.cpp - LLVM 'ld' compatible linker ----------------------------===//
2 //
3 // This utility is intended to be compatible with GCC, and follows standard
4 // system 'ld' conventions.  As such, the default output file is ./a.out.
5 // Additionally, this program outputs a shell script that is used to invoke LLI
6 // to execute the program.  In this manner, the generated executable (a.out for
7 // example), is directly executable, whereas the bytecode file actually lives in
8 // the a.out.bc file generated by this program.  Also, Force is on by default.
9 //
10 // Note that if someone (or a script) deletes the executable program generated,
11 // the .bc file will be left around.  Considering that this is a temporary hack,
12 // I'm not too worried about this.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "llvm/Transforms/Utils/Linker.h"
17 #include "llvm/Module.h"
18 #include "llvm/PassManager.h"
19 #include "llvm/Bytecode/Reader.h"
20 #include "llvm/Bytecode/WriteBytecodePass.h"
21 #include "llvm/Target/TargetData.h"
22 #include "llvm/Transforms/IPO.h"
23 #include "llvm/Transforms/Scalar.h"
24 #include "Support/CommandLine.h"
25 #include "Support/Signals.h"
26 #include <fstream>
27 #include <memory>
28 #include <set>
29 #include <algorithm>
30 #include <sys/types.h>     // For FileExists
31 #include <sys/stat.h>
32
33 namespace {
34   cl::list<std::string> 
35   InputFilenames(cl::Positional, cl::desc("<input bytecode files>"),
36                  cl::OneOrMore);
37
38   cl::opt<std::string> 
39   OutputFilename("o", cl::desc("Override output filename"), cl::init("a.out"),
40                  cl::value_desc("filename"));
41
42   cl::opt<bool>    
43   Verbose("v", cl::desc("Print information about actions taken"));
44   
45   cl::list<std::string> 
46   LibPaths("L", cl::desc("Specify a library search path"), cl::Prefix,
47            cl::value_desc("directory"));
48
49   cl::list<std::string> 
50   Libraries("l", cl::desc("Specify libraries to link to"), cl::Prefix,
51             cl::value_desc("library prefix"));
52
53   cl::opt<bool>
54   Strip("s", cl::desc("Strip symbol info from executable"));
55
56   cl::opt<bool>
57   NoInternalize("disable-internalize",
58                 cl::desc("Do not mark all symbols as internal"));
59
60   cl::opt<bool>
61   LinkAsLibrary("link-as-library", cl::desc("Link the .bc files together as a"
62                                             " library, not an executable"));
63
64   // Compatibility options that are ignored, but support by LD
65   cl::opt<std::string>
66   CO3("soname", cl::Hidden, cl::desc("Compatibility option: ignored"));
67   cl::opt<std::string>
68   CO4("version-script", cl::Hidden, cl::desc("Compatibility option: ignored"));
69   cl::opt<bool>
70   CO5("eh-frame-hdr", cl::Hidden, cl::desc("Compatibility option: ignored"));
71   cl::opt<bool>
72   CO6("r", cl::Hidden, cl::desc("Compatibility option: ignored"));
73 }
74
75 // FileExists - Return true if the specified string is an openable file...
76 static inline bool FileExists(const std::string &FN) {
77   struct stat StatBuf;
78   return stat(FN.c_str(), &StatBuf) != -1;
79 }
80
81
82 // LoadObject - Read the specified "object file", which should not search the
83 // library path to find it.
84 static inline std::auto_ptr<Module> LoadObject(std::string FN,
85                                                std::string &OutErrorMessage) {
86   if (Verbose) std::cerr << "Loading '" << FN << "'\n";
87   if (!FileExists(FN)) {
88     // Attempt to load from the LLVM_LIB_SEARCH_PATH directory... if we would
89     // otherwise fail.  This is used to locate objects like crtend.o.
90     //
91     char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH");
92     if (SearchPath && FileExists(std::string(SearchPath)+"/"+FN))
93       FN = std::string(SearchPath)+"/"+FN;
94     else {
95       OutErrorMessage = "could not find input file '" + FN + "'!";
96       return std::auto_ptr<Module>();
97     }
98   }
99
100   std::string ErrorMessage;
101   Module *Result = ParseBytecodeFile(FN, &ErrorMessage);
102   if (Result) return std::auto_ptr<Module>(Result);
103
104   OutErrorMessage = "Bytecode file '" + FN + "' corrupt!";
105   if (ErrorMessage.size()) OutErrorMessage += ": " + ErrorMessage;
106   return std::auto_ptr<Module>();
107 }
108
109
110 static Module *LoadSingleLibraryObject(const std::string &Filename) {
111   std::string ErrorMessage;
112   std::auto_ptr<Module> M = LoadObject(Filename, ErrorMessage);
113   if (M.get() == 0 && Verbose) {
114     std::cerr << "Error loading '" + Filename + "'";
115     if (!ErrorMessage.empty()) std::cerr << ": " << ErrorMessage;
116     std::cerr << "\n";
117   }
118   
119   return M.release();
120 }
121
122 // IsArchive -  Returns true iff FILENAME appears to be the name of an ar
123 // archive file. It determines this by checking the magic string at the
124 // beginning of the file.
125 static bool IsArchive(const std::string &filename) {
126   std::string ArchiveMagic("!<arch>\012");
127   char buf[1 + ArchiveMagic.size()];
128   std::ifstream f(filename.c_str());
129   f.read(buf, ArchiveMagic.size());
130   buf[ArchiveMagic.size()] = '\0';
131   return ArchiveMagic == buf;
132 }
133
134 // LoadLibraryExactName - This looks for a file with a known name and tries to
135 // load it, similarly to LoadLibraryFromDirectory(). 
136 static inline bool LoadLibraryExactName(const std::string &FileName,
137     std::vector<Module*> &Objects, bool &isArchive) {
138   if (Verbose) std::cerr << "  Considering '" << FileName << "'\n";
139   if (FileExists(FileName)) {
140         if (IsArchive(FileName)) {
141       std::string ErrorMessage;
142       if (Verbose) std::cerr << "  Loading '" << FileName << "'\n";
143       if (!ReadArchiveFile(FileName, Objects, &ErrorMessage)) {
144         isArchive = true;
145         return false;           // Success!
146       }
147       if (Verbose) {
148         std::cerr << "  Error loading archive '" + FileName + "'";
149         if (!ErrorMessage.empty()) std::cerr << ": " << ErrorMessage;
150         std::cerr << "\n";
151       }
152     } else {
153       if (Module *M = LoadSingleLibraryObject(FileName)) {
154         isArchive = false;
155         Objects.push_back(M);
156         return false;
157       }
158     }
159   }
160   return true;
161 }
162
163 // LoadLibrary - Try to load a library named LIBNAME that contains
164 // LLVM bytecode. If SEARCH is true, then search for a file named
165 // libLIBNAME.{a,so,bc} in the current library search path.  Otherwise,
166 // assume LIBNAME is the real name of the library file.  This method puts
167 // the loaded modules into the Objects list, and sets isArchive to true if
168 // a .a file was loaded. It returns true if no library is found or if an
169 // error occurs; otherwise it returns false.
170 //
171 static inline bool LoadLibrary(const std::string &LibName,
172                                std::vector<Module*> &Objects, bool &isArchive,
173                                bool search, std::string &ErrorMessage) {
174   if (search) {
175     // First, try the current directory. Then, iterate over the
176     // directories in LibPaths, looking for a suitable match for LibName
177     // in each one.
178     for (unsigned NextLibPathIdx = 0; NextLibPathIdx != LibPaths.size();
179          ++NextLibPathIdx) {
180       std::string Directory = LibPaths[NextLibPathIdx] + "/";
181       if (!LoadLibraryExactName(Directory + "lib" + LibName + ".a",
182         Objects, isArchive))
183           return false;
184       if (!LoadLibraryExactName(Directory + "lib" + LibName + ".so",
185         Objects, isArchive))
186           return false;
187       if (!LoadLibraryExactName(Directory + "lib" + LibName + ".bc",
188         Objects, isArchive))
189           return false;
190     }
191   } else {
192     // If they said no searching, then assume LibName is the real name.
193     if (!LoadLibraryExactName(LibName, Objects, isArchive))
194       return false;
195   }
196   ErrorMessage = "error linking library '-l" + LibName+ "': library not found!";
197   return true;
198 }
199
200 static void GetAllDefinedSymbols(Module *M, 
201                                  std::set<std::string> &DefinedSymbols) {
202   for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
203     if (I->hasName() && !I->isExternal() && !I->hasInternalLinkage())
204       DefinedSymbols.insert(I->getName());
205   for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
206     if (I->hasName() && !I->isExternal() && !I->hasInternalLinkage())
207       DefinedSymbols.insert(I->getName());
208 }
209
210 // GetAllUndefinedSymbols - This calculates the set of undefined symbols that
211 // still exist in an LLVM module.  This is a bit tricky because there may be two
212 // symbols with the same name, but different LLVM types that will be resolved to
213 // each other, but aren't currently (thus we need to treat it as resolved).
214 //
215 static void GetAllUndefinedSymbols(Module *M, 
216                                    std::set<std::string> &UndefinedSymbols) {
217   std::set<std::string> DefinedSymbols;
218   UndefinedSymbols.clear();   // Start out empty
219   
220   for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
221     if (I->hasName()) {
222       if (I->isExternal())
223         UndefinedSymbols.insert(I->getName());
224       else if (!I->hasInternalLinkage())
225         DefinedSymbols.insert(I->getName());
226     }
227   for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
228     if (I->hasName()) {
229       if (I->isExternal())
230         UndefinedSymbols.insert(I->getName());
231       else if (!I->hasInternalLinkage())
232         DefinedSymbols.insert(I->getName());
233     }
234   
235   // Prune out any defined symbols from the undefined symbols set...
236   for (std::set<std::string>::iterator I = UndefinedSymbols.begin();
237        I != UndefinedSymbols.end(); )
238     if (DefinedSymbols.count(*I))
239       UndefinedSymbols.erase(I++);  // This symbol really is defined!
240     else
241       ++I; // Keep this symbol in the undefined symbols list
242 }
243
244
245 static bool LinkLibrary(Module *M, const std::string &LibName,
246                         bool search, std::string &ErrorMessage) {
247   std::set<std::string> UndefinedSymbols;
248   GetAllUndefinedSymbols(M, UndefinedSymbols);
249   if (UndefinedSymbols.empty()) {
250     if (Verbose) std::cerr << "  No symbols undefined, don't link library!\n";
251     return false;  // No need to link anything in!
252   }
253
254   std::vector<Module*> Objects;
255   bool isArchive;
256   if (LoadLibrary(LibName, Objects, isArchive, search, ErrorMessage))
257     return true;
258
259   // Figure out which symbols are defined by all of the modules in the .a file
260   std::vector<std::set<std::string> > DefinedSymbols;
261   DefinedSymbols.resize(Objects.size());
262   for (unsigned i = 0; i != Objects.size(); ++i)
263     GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]);
264
265   bool Linked = true;
266   while (Linked) {     // While we are linking in object files, loop.
267     Linked = false;
268
269     for (unsigned i = 0; i != Objects.size(); ++i) {
270       // Consider whether we need to link in this module...  we only need to
271       // link it in if it defines some symbol which is so far undefined.
272       //
273       const std::set<std::string> &DefSymbols = DefinedSymbols[i];
274
275       bool ObjectRequired = false;
276       for (std::set<std::string>::iterator I = UndefinedSymbols.begin(),
277              E = UndefinedSymbols.end(); I != E; ++I)
278         if (DefSymbols.count(*I)) {
279           if (Verbose)
280             std::cerr << "  Found object providing symbol '" << *I << "'...\n";
281           ObjectRequired = true;
282           break;
283         }
284       
285       // We DO need to link this object into the program...
286       if (ObjectRequired) {
287         if (LinkModules(M, Objects[i], &ErrorMessage))
288           return true;   // Couldn't link in the right object file...        
289         
290         // Since we have linked in this object, delete it from the list of
291         // objects to consider in this archive file.
292         std::swap(Objects[i], Objects.back());
293         std::swap(DefinedSymbols[i], DefinedSymbols.back());
294         Objects.pop_back();
295         DefinedSymbols.pop_back();
296         --i;   // Do not skip an entry
297         
298         // The undefined symbols set should have shrunk.
299         GetAllUndefinedSymbols(M, UndefinedSymbols);
300         Linked = true;  // We have linked something in!
301       }
302     }
303   }
304   
305   return false;
306 }
307
308 static int PrintAndReturn(const char *progname, const std::string &Message,
309                           const std::string &Extra = "") {
310   std::cerr << progname << Extra << ": " << Message << "\n";
311   return 1;
312 }
313
314
315 int main(int argc, char **argv) {
316   cl::ParseCommandLineOptions(argc, argv, " llvm linker for GCC\n");
317
318   std::string ErrorMessage;
319   std::auto_ptr<Module> Composite(LoadObject(InputFilenames[0], ErrorMessage));
320   if (Composite.get() == 0)
321     return PrintAndReturn(argv[0], ErrorMessage);
322
323   // We always look first in the current directory when searching for libraries.
324   LibPaths.insert(LibPaths.begin(), ".");
325
326   // If the user specied an extra search path in their environment, respect it.
327   if (char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH"))
328     LibPaths.push_back(SearchPath);
329
330   for (unsigned i = 1; i < InputFilenames.size(); ++i) {
331     // A user may specify an ar archive without -l, perhaps because it
332     // is not installed as a library. Detect that and link the library.
333     if (IsArchive(InputFilenames[i])) {
334       if (Verbose) std::cerr << "Linking archive '" << InputFilenames[i]
335                              << "'\n";
336       if (LinkLibrary(Composite.get(), InputFilenames[i], false, ErrorMessage))
337         return PrintAndReturn(argv[0], ErrorMessage,
338                               ": error linking in '" + InputFilenames[i] + "'");
339       continue;
340     }
341
342     std::auto_ptr<Module> M(LoadObject(InputFilenames[i], ErrorMessage));
343     if (M.get() == 0)
344       return PrintAndReturn(argv[0], ErrorMessage);
345
346     if (Verbose) std::cerr << "Linking in '" << InputFilenames[i] << "'\n";
347
348     if (LinkModules(Composite.get(), M.get(), &ErrorMessage))
349       return PrintAndReturn(argv[0], ErrorMessage,
350                             ": error linking in '" + InputFilenames[i] + "'");
351   }
352
353   // Remove any consecutive duplicates of the same library...
354   Libraries.erase(std::unique(Libraries.begin(), Libraries.end()),
355                   Libraries.end());
356
357   // Link in all of the libraries next...
358   for (unsigned i = 0; i != Libraries.size(); ++i) {
359     if (Verbose) std::cerr << "Linking in library: -l" << Libraries[i] << "\n";
360     if (LinkLibrary(Composite.get(), Libraries[i], true, ErrorMessage))
361       return PrintAndReturn(argv[0], ErrorMessage);
362   }
363
364   // In addition to just linking the input from GCC, we also want to spiff it up
365   // a little bit.  Do this now.
366   //
367   PassManager Passes;
368
369   // Add an appropriate TargetData instance for this module...
370   Passes.add(new TargetData("gccas", Composite.get()));
371
372   // Linking modules together can lead to duplicated global constants, only keep
373   // one copy of each constant...
374   //
375   Passes.add(createConstantMergePass());
376
377   // If the -s command line option was specified, strip the symbols out of the
378   // resulting program to make it smaller.  -s is a GCC option that we are
379   // supporting.
380   //
381   if (Strip)
382     Passes.add(createSymbolStrippingPass());
383
384   // Often if the programmer does not specify proper prototypes for the
385   // functions they are calling, they end up calling a vararg version of the
386   // function that does not get a body filled in (the real function has typed
387   // arguments).  This pass merges the two functions.
388   //
389   Passes.add(createFunctionResolvingPass());
390
391   if (!NoInternalize) {
392     // Now that composite has been compiled, scan through the module, looking
393     // for a main function.  If main is defined, mark all other functions
394     // internal.
395     //
396     Passes.add(createInternalizePass());
397   }
398
399   // Remove unused arguments from functions...
400   //
401   Passes.add(createDeadArgEliminationPass());
402
403   // Now that we have optimized the program, discard unreachable functions...
404   //
405   Passes.add(createGlobalDCEPass());
406
407   // The FuncResolve pass may leave cruft around if functions were prototyped
408   // differently than they were defined.  Remove this cruft.
409   //
410   Passes.add(createInstructionCombiningPass());
411
412   // Add the pass that writes bytecode to the output file...
413   std::string RealBytecodeOutput = OutputFilename;
414   if (!LinkAsLibrary) RealBytecodeOutput += ".bc";
415   std::ofstream Out(RealBytecodeOutput.c_str());
416   if (!Out.good())
417     return PrintAndReturn(argv[0], "error opening '" + RealBytecodeOutput +
418                                    "' for writing!");
419   Passes.add(new WriteBytecodePass(&Out));        // Write bytecode to file...
420
421   // Make sure that the Out file gets unlink'd from the disk if we get a SIGINT
422   RemoveFileOnSignal(RealBytecodeOutput);
423
424   // Run our queue of passes all at once now, efficiently.
425   Passes.run(*Composite.get());
426   Out.close();
427
428   if (!LinkAsLibrary) {
429     // Output the script to start the program...
430     std::ofstream Out2(OutputFilename.c_str());
431     if (!Out2.good())
432       return PrintAndReturn(argv[0], "error opening '" + OutputFilename +
433                                      "' for writing!");
434     Out2 << "#!/bin/sh\nlli -q -abort-on-exception $0.bc $*\n";
435     Out2.close();
436   
437     // Make the script executable...
438     chmod(OutputFilename.c_str(), 0755);
439   }
440
441   return 0;
442 }