blob: c53378731828f1eb7ea9f0103f22ec494324ed10 [file] [log] [blame]
Chris Lattner10970eb2003-04-19 22:44:38 +00001//===- gccld.cpp - LLVM 'ld' compatible linker ----------------------------===//
Chris Lattnere7fca512002-01-24 19:12:12 +00002//
3// This utility is intended to be compatible with GCC, and follows standard
Chris Lattner10970eb2003-04-19 22:44:38 +00004// system 'ld' conventions. As such, the default output file is ./a.out.
Chris Lattnere7fca512002-01-24 19:12:12 +00005// 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,
Brian Gaeke69a79602003-05-23 20:27:07 +000012// I'm not too worried about this.
Chris Lattnere7fca512002-01-24 19:12:12 +000013//
14//===----------------------------------------------------------------------===//
15
Chris Lattnerc8cc4cb2002-05-07 18:36:35 +000016#include "llvm/Transforms/Utils/Linker.h"
Chris Lattnere7fca512002-01-24 19:12:12 +000017#include "llvm/Module.h"
Chris Lattnerad202a02002-04-08 00:14:58 +000018#include "llvm/PassManager.h"
19#include "llvm/Bytecode/Reader.h"
20#include "llvm/Bytecode/WriteBytecodePass.h"
Chris Lattner9c3b55e2003-04-24 19:13:02 +000021#include "llvm/Target/TargetData.h"
Chris Lattnerd9d8c072002-07-23 22:04:43 +000022#include "llvm/Transforms/IPO.h"
Chris Lattnerd9d8c072002-07-23 22:04:43 +000023#include "llvm/Transforms/Scalar.h"
John Criswelld35b5b52003-09-02 20:17:20 +000024#include "Support/FileUtilities.h"
John Criswell621727c2003-09-17 15:20:51 +000025#include "Support/SystemUtils.h"
Chris Lattnere7fca512002-01-24 19:12:12 +000026#include "Support/CommandLine.h"
Chris Lattner76d12292002-04-18 19:55:25 +000027#include "Support/Signals.h"
John Criswell22edc392003-09-02 21:11:22 +000028#include "Config/unistd.h"
Chris Lattnere7fca512002-01-24 19:12:12 +000029#include <fstream>
30#include <memory>
Chris Lattner10970eb2003-04-19 22:44:38 +000031#include <set>
Chris Lattner41c34652002-03-11 17:49:53 +000032#include <algorithm>
Chris Lattnere7fca512002-01-24 19:12:12 +000033
Chris Lattnerf3d4f172003-04-18 23:01:25 +000034namespace {
35 cl::list<std::string>
36 InputFilenames(cl::Positional, cl::desc("<input bytecode files>"),
37 cl::OneOrMore);
Chris Lattner5ff62e92002-07-22 02:10:13 +000038
Chris Lattnerf3d4f172003-04-18 23:01:25 +000039 cl::opt<std::string>
40 OutputFilename("o", cl::desc("Override output filename"), cl::init("a.out"),
41 cl::value_desc("filename"));
Chris Lattner5ff62e92002-07-22 02:10:13 +000042
Chris Lattnerf3d4f172003-04-18 23:01:25 +000043 cl::opt<bool>
44 Verbose("v", cl::desc("Print information about actions taken"));
45
46 cl::list<std::string>
47 LibPaths("L", cl::desc("Specify a library search path"), cl::Prefix,
48 cl::value_desc("directory"));
Chris Lattner5ff62e92002-07-22 02:10:13 +000049
Chris Lattnerf3d4f172003-04-18 23:01:25 +000050 cl::list<std::string>
51 Libraries("l", cl::desc("Specify libraries to link to"), cl::Prefix,
52 cl::value_desc("library prefix"));
Chris Lattner5ff62e92002-07-22 02:10:13 +000053
Chris Lattnerf3d4f172003-04-18 23:01:25 +000054 cl::opt<bool>
55 Strip("s", cl::desc("Strip symbol info from executable"));
Chris Lattner5ff62e92002-07-22 02:10:13 +000056
Chris Lattnerf3d4f172003-04-18 23:01:25 +000057 cl::opt<bool>
58 NoInternalize("disable-internalize",
59 cl::desc("Do not mark all symbols as internal"));
Chris Lattnera2b2dc92003-08-22 19:18:45 +000060 static cl::alias
61 ExportDynamic("export-dynamic", cl::desc("Alias for -disable-internalize"),
62 cl::aliasopt(NoInternalize));
Chris Lattnera856db22003-04-18 23:38:22 +000063
Chris Lattner10970eb2003-04-19 22:44:38 +000064 cl::opt<bool>
65 LinkAsLibrary("link-as-library", cl::desc("Link the .bc files together as a"
66 " library, not an executable"));
67
John Criswelldabaf7d2003-09-16 21:27:35 +000068 cl::opt<bool>
69 Native("native", cl::desc("Generate a native binary instead of a shell script"));
70
Chris Lattnera856db22003-04-18 23:38:22 +000071 // Compatibility options that are ignored, but support by LD
72 cl::opt<std::string>
73 CO3("soname", cl::Hidden, cl::desc("Compatibility option: ignored"));
74 cl::opt<std::string>
75 CO4("version-script", cl::Hidden, cl::desc("Compatibility option: ignored"));
76 cl::opt<bool>
77 CO5("eh-frame-hdr", cl::Hidden, cl::desc("Compatibility option: ignored"));
Chris Lattner6ac79d12003-05-27 19:15:11 +000078 cl::opt<bool>
79 CO6("r", cl::Hidden, cl::desc("Compatibility option: ignored"));
Chris Lattnerf3d4f172003-04-18 23:01:25 +000080}
Chris Lattnere7fca512002-01-24 19:12:12 +000081
82// FileExists - Return true if the specified string is an openable file...
83static inline bool FileExists(const std::string &FN) {
John Criswell22edc392003-09-02 21:11:22 +000084 return access(FN.c_str(), F_OK) != -1;
Chris Lattnere7fca512002-01-24 19:12:12 +000085}
86
Chris Lattnere7fca512002-01-24 19:12:12 +000087
Chris Lattner10970eb2003-04-19 22:44:38 +000088// LoadObject - Read the specified "object file", which should not search the
89// library path to find it.
Chris Lattner7cb77e12003-05-13 22:14:13 +000090static inline std::auto_ptr<Module> LoadObject(std::string FN,
Chris Lattner10970eb2003-04-19 22:44:38 +000091 std::string &OutErrorMessage) {
92 if (Verbose) std::cerr << "Loading '" << FN << "'\n";
93 if (!FileExists(FN)) {
Chris Lattner7cb77e12003-05-13 22:14:13 +000094 // Attempt to load from the LLVM_LIB_SEARCH_PATH directory... if we would
95 // otherwise fail. This is used to locate objects like crtend.o.
96 //
97 char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH");
98 if (SearchPath && FileExists(std::string(SearchPath)+"/"+FN))
99 FN = std::string(SearchPath)+"/"+FN;
100 else {
101 OutErrorMessage = "could not find input file '" + FN + "'!";
102 return std::auto_ptr<Module>();
103 }
Chris Lattnere7fca512002-01-24 19:12:12 +0000104 }
105
Chris Lattner10970eb2003-04-19 22:44:38 +0000106 std::string ErrorMessage;
107 Module *Result = ParseBytecodeFile(FN, &ErrorMessage);
108 if (Result) return std::auto_ptr<Module>(Result);
109
110 OutErrorMessage = "Bytecode file '" + FN + "' corrupt!";
111 if (ErrorMessage.size()) OutErrorMessage += ": " + ErrorMessage;
Chris Lattnere7fca512002-01-24 19:12:12 +0000112 return std::auto_ptr<Module>();
113}
114
115
Chris Lattner10970eb2003-04-19 22:44:38 +0000116static Module *LoadSingleLibraryObject(const std::string &Filename) {
117 std::string ErrorMessage;
118 std::auto_ptr<Module> M = LoadObject(Filename, ErrorMessage);
119 if (M.get() == 0 && Verbose) {
120 std::cerr << "Error loading '" + Filename + "'";
121 if (!ErrorMessage.empty()) std::cerr << ": " << ErrorMessage;
122 std::cerr << "\n";
123 }
124
125 return M.release();
126}
127
Brian Gaeke69a79602003-05-23 20:27:07 +0000128// IsArchive - Returns true iff FILENAME appears to be the name of an ar
129// archive file. It determines this by checking the magic string at the
130// beginning of the file.
Chris Lattnere68e4d52003-05-29 15:13:15 +0000131static bool IsArchive(const std::string &filename) {
132 std::string ArchiveMagic("!<arch>\012");
133 char buf[1 + ArchiveMagic.size()];
134 std::ifstream f(filename.c_str());
135 f.read(buf, ArchiveMagic.size());
136 buf[ArchiveMagic.size()] = '\0';
137 return ArchiveMagic == buf;
Brian Gaeke69a79602003-05-23 20:27:07 +0000138}
Chris Lattner10970eb2003-04-19 22:44:38 +0000139
Brian Gaeke69a79602003-05-23 20:27:07 +0000140// LoadLibraryExactName - This looks for a file with a known name and tries to
141// load it, similarly to LoadLibraryFromDirectory().
Chris Lattnere68e4d52003-05-29 15:13:15 +0000142static inline bool LoadLibraryExactName(const std::string &FileName,
Brian Gaeke69a79602003-05-23 20:27:07 +0000143 std::vector<Module*> &Objects, bool &isArchive) {
144 if (Verbose) std::cerr << " Considering '" << FileName << "'\n";
145 if (FileExists(FileName)) {
Chris Lattnere68e4d52003-05-29 15:13:15 +0000146 if (IsArchive(FileName)) {
Brian Gaeke69a79602003-05-23 20:27:07 +0000147 std::string ErrorMessage;
148 if (Verbose) std::cerr << " Loading '" << FileName << "'\n";
149 if (!ReadArchiveFile(FileName, Objects, &ErrorMessage)) {
150 isArchive = true;
151 return false; // Success!
152 }
153 if (Verbose) {
154 std::cerr << " Error loading archive '" + FileName + "'";
155 if (!ErrorMessage.empty()) std::cerr << ": " << ErrorMessage;
156 std::cerr << "\n";
157 }
158 } else {
159 if (Module *M = LoadSingleLibraryObject(FileName)) {
160 isArchive = false;
161 Objects.push_back(M);
162 return false;
163 }
Chris Lattner10970eb2003-04-19 22:44:38 +0000164 }
165 }
Chris Lattner10970eb2003-04-19 22:44:38 +0000166 return true;
167}
168
Brian Gaeke69a79602003-05-23 20:27:07 +0000169// LoadLibrary - Try to load a library named LIBNAME that contains
170// LLVM bytecode. If SEARCH is true, then search for a file named
171// libLIBNAME.{a,so,bc} in the current library search path. Otherwise,
172// assume LIBNAME is the real name of the library file. This method puts
173// the loaded modules into the Objects list, and sets isArchive to true if
174// a .a file was loaded. It returns true if no library is found or if an
175// error occurs; otherwise it returns false.
Chris Lattner10970eb2003-04-19 22:44:38 +0000176//
177static inline bool LoadLibrary(const std::string &LibName,
178 std::vector<Module*> &Objects, bool &isArchive,
Brian Gaeke69a79602003-05-23 20:27:07 +0000179 bool search, std::string &ErrorMessage) {
180 if (search) {
181 // First, try the current directory. Then, iterate over the
182 // directories in LibPaths, looking for a suitable match for LibName
183 // in each one.
184 for (unsigned NextLibPathIdx = 0; NextLibPathIdx != LibPaths.size();
Chris Lattnere68e4d52003-05-29 15:13:15 +0000185 ++NextLibPathIdx) {
Brian Gaeke69a79602003-05-23 20:27:07 +0000186 std::string Directory = LibPaths[NextLibPathIdx] + "/";
187 if (!LoadLibraryExactName(Directory + "lib" + LibName + ".a",
188 Objects, isArchive))
189 return false;
190 if (!LoadLibraryExactName(Directory + "lib" + LibName + ".so",
191 Objects, isArchive))
192 return false;
193 if (!LoadLibraryExactName(Directory + "lib" + LibName + ".bc",
194 Objects, isArchive))
195 return false;
196 }
197 } else {
198 // If they said no searching, then assume LibName is the real name.
199 if (!LoadLibraryExactName(LibName, Objects, isArchive))
Chris Lattner10970eb2003-04-19 22:44:38 +0000200 return false;
Chris Lattner10970eb2003-04-19 22:44:38 +0000201 }
Chris Lattner10970eb2003-04-19 22:44:38 +0000202 ErrorMessage = "error linking library '-l" + LibName+ "': library not found!";
203 return true;
204}
205
206static void GetAllDefinedSymbols(Module *M,
207 std::set<std::string> &DefinedSymbols) {
208 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
209 if (I->hasName() && !I->isExternal() && !I->hasInternalLinkage())
210 DefinedSymbols.insert(I->getName());
211 for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
212 if (I->hasName() && !I->isExternal() && !I->hasInternalLinkage())
213 DefinedSymbols.insert(I->getName());
214}
215
216// GetAllUndefinedSymbols - This calculates the set of undefined symbols that
217// still exist in an LLVM module. This is a bit tricky because there may be two
218// symbols with the same name, but different LLVM types that will be resolved to
219// each other, but aren't currently (thus we need to treat it as resolved).
220//
221static void GetAllUndefinedSymbols(Module *M,
222 std::set<std::string> &UndefinedSymbols) {
223 std::set<std::string> DefinedSymbols;
224 UndefinedSymbols.clear(); // Start out empty
225
226 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
227 if (I->hasName()) {
228 if (I->isExternal())
229 UndefinedSymbols.insert(I->getName());
230 else if (!I->hasInternalLinkage())
231 DefinedSymbols.insert(I->getName());
232 }
233 for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
234 if (I->hasName()) {
235 if (I->isExternal())
236 UndefinedSymbols.insert(I->getName());
237 else if (!I->hasInternalLinkage())
238 DefinedSymbols.insert(I->getName());
239 }
240
241 // Prune out any defined symbols from the undefined symbols set...
242 for (std::set<std::string>::iterator I = UndefinedSymbols.begin();
243 I != UndefinedSymbols.end(); )
244 if (DefinedSymbols.count(*I))
245 UndefinedSymbols.erase(I++); // This symbol really is defined!
246 else
247 ++I; // Keep this symbol in the undefined symbols list
248}
249
250
251static bool LinkLibrary(Module *M, const std::string &LibName,
Brian Gaeke69a79602003-05-23 20:27:07 +0000252 bool search, std::string &ErrorMessage) {
Chris Lattner7cb77e12003-05-13 22:14:13 +0000253 std::set<std::string> UndefinedSymbols;
254 GetAllUndefinedSymbols(M, UndefinedSymbols);
255 if (UndefinedSymbols.empty()) {
256 if (Verbose) std::cerr << " No symbols undefined, don't link library!\n";
257 return false; // No need to link anything in!
258 }
259
Chris Lattner10970eb2003-04-19 22:44:38 +0000260 std::vector<Module*> Objects;
261 bool isArchive;
Brian Gaeke69a79602003-05-23 20:27:07 +0000262 if (LoadLibrary(LibName, Objects, isArchive, search, ErrorMessage))
263 return true;
Chris Lattner10970eb2003-04-19 22:44:38 +0000264
265 // Figure out which symbols are defined by all of the modules in the .a file
266 std::vector<std::set<std::string> > DefinedSymbols;
267 DefinedSymbols.resize(Objects.size());
268 for (unsigned i = 0; i != Objects.size(); ++i)
269 GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]);
270
Chris Lattner10970eb2003-04-19 22:44:38 +0000271 bool Linked = true;
272 while (Linked) { // While we are linking in object files, loop.
273 Linked = false;
274
275 for (unsigned i = 0; i != Objects.size(); ++i) {
276 // Consider whether we need to link in this module... we only need to
277 // link it in if it defines some symbol which is so far undefined.
278 //
279 const std::set<std::string> &DefSymbols = DefinedSymbols[i];
280
281 bool ObjectRequired = false;
282 for (std::set<std::string>::iterator I = UndefinedSymbols.begin(),
283 E = UndefinedSymbols.end(); I != E; ++I)
284 if (DefSymbols.count(*I)) {
285 if (Verbose)
286 std::cerr << " Found object providing symbol '" << *I << "'...\n";
287 ObjectRequired = true;
288 break;
289 }
290
291 // We DO need to link this object into the program...
292 if (ObjectRequired) {
293 if (LinkModules(M, Objects[i], &ErrorMessage))
294 return true; // Couldn't link in the right object file...
295
296 // Since we have linked in this object, delete it from the list of
297 // objects to consider in this archive file.
298 std::swap(Objects[i], Objects.back());
299 std::swap(DefinedSymbols[i], DefinedSymbols.back());
300 Objects.pop_back();
301 DefinedSymbols.pop_back();
302 --i; // Do not skip an entry
303
304 // The undefined symbols set should have shrunk.
305 GetAllUndefinedSymbols(M, UndefinedSymbols);
306 Linked = true; // We have linked something in!
307 }
308 }
309 }
310
311 return false;
312}
313
314static int PrintAndReturn(const char *progname, const std::string &Message,
315 const std::string &Extra = "") {
316 std::cerr << progname << Extra << ": " << Message << "\n";
317 return 1;
318}
319
John Criswelldabaf7d2003-09-16 21:27:35 +0000320//
John Criswell621727c2003-09-17 15:20:51 +0000321//
322// Function: copy_env()
323//
324// Description:
325// This function takes an array of environment variables and makes a
326// copy of it. This copy can then be manipulated any way the caller likes
327// without affecting the process's real environment.
328//
329// Inputs:
330// envp - An array of C strings containing an environment.
331//
332// Outputs:
333// None.
334//
335// Return value:
336// NULL - An error occurred.
337// Otherwise, a pointer to a new array of C strings is returned. Every string
338// in the array is a duplicate of the one in the original array (i.e. we do
339// not copy the char *'s from one array to another).
340//
341static char **
John Criswell83ca6ec2003-09-17 19:04:22 +0000342copy_env (char ** const envp)
John Criswell621727c2003-09-17 15:20:51 +0000343{
344 // The new environment list
345 char ** newenv;
346
347 // The number of entries in the old environment list
348 int entries;
349
350 //
351 // Count the number of entries in the old list;
352 //
353 for (entries = 0; envp[entries] != NULL; entries++)
354 {
355 ;
356 }
357
358 //
359 // Add one more entry for the NULL pointer that ends the list.
360 //
361 ++entries;
362
363 //
364 // If there are no entries at all, just return NULL.
365 //
366 if (entries == 0)
367 {
368 return NULL;
369 }
370
371 //
372 // Allocate a new environment list.
373 //
374 if ((newenv = new (char *) [entries]) == NULL)
375 {
376 return NULL;
377 }
378
379 //
380 // Make a copy of the list. Don't forget the NULL that ends the list.
381 //
382 entries = 0;
383 while (envp[entries] != NULL)
384 {
385 newenv[entries] = strdup (envp[entries]);
386 ++entries;
387 }
388 newenv[entries] = NULL;
389
390 return newenv;
391}
392
393
394//
John Criswelldabaf7d2003-09-16 21:27:35 +0000395// Function: remove_env()
396//
397// Description:
398// Remove the specified environment variable from the environment array.
399//
400// Inputs:
401// name - The name of the variable to remove. It cannot be NULL.
402// envp - The array of environment variables. It cannot be NULL.
403//
404// Outputs:
405// envp - The pointer to the specified variable name is removed.
406//
407// Return value:
408// None.
409//
410// Notes:
411// This is mainly done because functions to remove items from the environment
412// are not available across all platforms. In particular, Solaris does not
413// seem to have an unsetenv() function or a setenv() function (or they are
414// undocumented if they do exist).
415//
416static void
John Criswell83ca6ec2003-09-17 19:04:22 +0000417remove_env (const char * name, char ** const envp)
John Criswelldabaf7d2003-09-16 21:27:35 +0000418{
419 // Pointer for scanning arrays
420 register char * p;
421
422 // Index for selecting elements of the environment array
423 register int index;
424
425 for (index=0; envp[index] != NULL; index++)
426 {
427 //
428 // Find the first equals sign in the array and make it an EOS character.
429 //
430 p = strchr (envp[index], '=');
431 if (p == NULL)
432 {
433 continue;
434 }
435 else
436 {
437 *p = '\0';
438 }
439
440 //
441 // Compare the two strings. If they are equal, zap this string.
442 // Otherwise, restore it.
443 //
444 if (!strcmp (name, envp[index]))
445 {
John Criswell621727c2003-09-17 15:20:51 +0000446 *envp[index] = '\0';
John Criswelldabaf7d2003-09-16 21:27:35 +0000447 }
448 else
449 {
450 *p = '=';
451 }
452 }
453
454 return;
455}
456
Chris Lattner10970eb2003-04-19 22:44:38 +0000457
John Criswell621727c2003-09-17 15:20:51 +0000458int main(int argc, char **argv, char ** envp) {
Chris Lattner5ff62e92002-07-22 02:10:13 +0000459 cl::ParseCommandLineOptions(argc, argv, " llvm linker for GCC\n");
Chris Lattnere7fca512002-01-24 19:12:12 +0000460
Chris Lattnere7fca512002-01-24 19:12:12 +0000461 std::string ErrorMessage;
Chris Lattner10970eb2003-04-19 22:44:38 +0000462 std::auto_ptr<Module> Composite(LoadObject(InputFilenames[0], ErrorMessage));
463 if (Composite.get() == 0)
464 return PrintAndReturn(argv[0], ErrorMessage);
Chris Lattnere7fca512002-01-24 19:12:12 +0000465
Brian Gaeke69a79602003-05-23 20:27:07 +0000466 // We always look first in the current directory when searching for libraries.
467 LibPaths.insert(LibPaths.begin(), ".");
468
Chris Lattnerd34a51d2003-04-21 19:53:24 +0000469 // If the user specied an extra search path in their environment, respect it.
470 if (char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH"))
471 LibPaths.push_back(SearchPath);
472
Chris Lattner10970eb2003-04-19 22:44:38 +0000473 for (unsigned i = 1; i < InputFilenames.size(); ++i) {
Brian Gaeke69a79602003-05-23 20:27:07 +0000474 // A user may specify an ar archive without -l, perhaps because it
475 // is not installed as a library. Detect that and link the library.
Chris Lattnere68e4d52003-05-29 15:13:15 +0000476 if (IsArchive(InputFilenames[i])) {
Brian Gaeke69a79602003-05-23 20:27:07 +0000477 if (Verbose) std::cerr << "Linking archive '" << InputFilenames[i]
478 << "'\n";
Chris Lattnere68e4d52003-05-29 15:13:15 +0000479 if (LinkLibrary(Composite.get(), InputFilenames[i], false, ErrorMessage))
Brian Gaeke69a79602003-05-23 20:27:07 +0000480 return PrintAndReturn(argv[0], ErrorMessage,
481 ": error linking in '" + InputFilenames[i] + "'");
482 continue;
483 }
484
Chris Lattner10970eb2003-04-19 22:44:38 +0000485 std::auto_ptr<Module> M(LoadObject(InputFilenames[i], ErrorMessage));
486 if (M.get() == 0)
487 return PrintAndReturn(argv[0], ErrorMessage);
Chris Lattnere7fca512002-01-24 19:12:12 +0000488
Chris Lattnerf3d4f172003-04-18 23:01:25 +0000489 if (Verbose) std::cerr << "Linking in '" << InputFilenames[i] << "'\n";
Chris Lattnere7fca512002-01-24 19:12:12 +0000490
Chris Lattner10970eb2003-04-19 22:44:38 +0000491 if (LinkModules(Composite.get(), M.get(), &ErrorMessage))
492 return PrintAndReturn(argv[0], ErrorMessage,
493 ": error linking in '" + InputFilenames[i] + "'");
494 }
495
Chris Lattnerc65b1042003-04-19 23:07:33 +0000496 // Remove any consecutive duplicates of the same library...
497 Libraries.erase(std::unique(Libraries.begin(), Libraries.end()),
498 Libraries.end());
499
Chris Lattner10970eb2003-04-19 22:44:38 +0000500 // Link in all of the libraries next...
501 for (unsigned i = 0; i != Libraries.size(); ++i) {
502 if (Verbose) std::cerr << "Linking in library: -l" << Libraries[i] << "\n";
Brian Gaeke69a79602003-05-23 20:27:07 +0000503 if (LinkLibrary(Composite.get(), Libraries[i], true, ErrorMessage))
Chris Lattner10970eb2003-04-19 22:44:38 +0000504 return PrintAndReturn(argv[0], ErrorMessage);
Chris Lattnere7fca512002-01-24 19:12:12 +0000505 }
506
Chris Lattnerf8b90ee2002-04-10 20:37:47 +0000507 // In addition to just linking the input from GCC, we also want to spiff it up
Chris Lattnerad202a02002-04-08 00:14:58 +0000508 // a little bit. Do this now.
509 //
510 PassManager Passes;
511
Chris Lattner9c3b55e2003-04-24 19:13:02 +0000512 // Add an appropriate TargetData instance for this module...
Chris Lattner80df4632003-08-15 04:56:09 +0000513 Passes.add(new TargetData("gccld", Composite.get()));
Chris Lattner9c3b55e2003-04-24 19:13:02 +0000514
Chris Lattnerad202a02002-04-08 00:14:58 +0000515 // Linking modules together can lead to duplicated global constants, only keep
516 // one copy of each constant...
517 //
518 Passes.add(createConstantMergePass());
519
Chris Lattner2b598372002-04-08 05:18:12 +0000520 // If the -s command line option was specified, strip the symbols out of the
521 // resulting program to make it smaller. -s is a GCC option that we are
522 // supporting.
523 //
524 if (Strip)
525 Passes.add(createSymbolStrippingPass());
526
Chris Lattnerf8b90ee2002-04-10 20:37:47 +0000527 // Often if the programmer does not specify proper prototypes for the
528 // functions they are calling, they end up calling a vararg version of the
529 // function that does not get a body filled in (the real function has typed
530 // arguments). This pass merges the two functions.
531 //
532 Passes.add(createFunctionResolvingPass());
533
Chris Lattnerdabaa462003-04-16 21:43:22 +0000534 if (!NoInternalize) {
535 // Now that composite has been compiled, scan through the module, looking
536 // for a main function. If main is defined, mark all other functions
537 // internal.
538 //
539 Passes.add(createInternalizePass());
540 }
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000541
Chris Lattnera34f4402003-06-18 16:29:02 +0000542 // Remove unused arguments from functions...
543 //
544 Passes.add(createDeadArgEliminationPass());
545
Chris Lattnerdccb6d02003-06-19 17:03:51 +0000546 // The FuncResolve pass may leave cruft around if functions were prototyped
547 // differently than they were defined. Remove this cruft.
548 //
549 Passes.add(createInstructionCombiningPass());
550
Chris Lattnerdc523532003-06-26 05:29:50 +0000551 // Delete basic blocks, which optimization passes may have killed...
552 //
553 Passes.add(createCFGSimplificationPass());
554
Chris Lattner293a33a2003-06-26 04:32:31 +0000555 // Now that we have optimized the program, discard unreachable functions...
556 //
557 Passes.add(createGlobalDCEPass());
558
Chris Lattnerad202a02002-04-08 00:14:58 +0000559 // Add the pass that writes bytecode to the output file...
Chris Lattner10970eb2003-04-19 22:44:38 +0000560 std::string RealBytecodeOutput = OutputFilename;
561 if (!LinkAsLibrary) RealBytecodeOutput += ".bc";
562 std::ofstream Out(RealBytecodeOutput.c_str());
563 if (!Out.good())
564 return PrintAndReturn(argv[0], "error opening '" + RealBytecodeOutput +
565 "' for writing!");
Chris Lattnerad202a02002-04-08 00:14:58 +0000566 Passes.add(new WriteBytecodePass(&Out)); // Write bytecode to file...
Chris Lattnere7fca512002-01-24 19:12:12 +0000567
Chris Lattner76d12292002-04-18 19:55:25 +0000568 // Make sure that the Out file gets unlink'd from the disk if we get a SIGINT
Chris Lattner10970eb2003-04-19 22:44:38 +0000569 RemoveFileOnSignal(RealBytecodeOutput);
Chris Lattner76d12292002-04-18 19:55:25 +0000570
Chris Lattnerad202a02002-04-08 00:14:58 +0000571 // Run our queue of passes all at once now, efficiently.
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000572 Passes.run(*Composite.get());
Chris Lattnere7fca512002-01-24 19:12:12 +0000573 Out.close();
574
Chris Lattner10970eb2003-04-19 22:44:38 +0000575 if (!LinkAsLibrary) {
John Criswelldabaf7d2003-09-16 21:27:35 +0000576 //
577 // If the user wants to generate a native executable, compile it from the
578 // bytecode file.
579 //
580 // Otherwise, create a script that will run the bytecode through the JIT.
581 //
582 if (Native)
583 {
John Criswelldabaf7d2003-09-16 21:27:35 +0000584 //
John Criswell621727c2003-09-17 15:20:51 +0000585 // Remove these environment variables from the environment of the
586 // programs that we will execute. It appears that GCC sets these
587 // environment variables so that the programs it uses can configure
588 // themselves identically.
John Criswelldabaf7d2003-09-16 21:27:35 +0000589 //
John Criswell621727c2003-09-17 15:20:51 +0000590 // However, when we invoke GCC below, we want it to use its normal
591 // configuration. Hence, we must sanitize it's environment.
592 //
593 char ** clean_env = copy_env (envp);
594 if (clean_env == NULL)
595 {
596 return PrintAndReturn (argv[0], "Failed to duplicate environment");
597 }
598 remove_env ("LIBRARY_PATH", clean_env);
599 remove_env ("COLLECT_GCC_OPTIONS", clean_env);
600 remove_env ("GCC_EXEC_PREFIX", clean_env);
601 remove_env ("COMPILER_PATH", clean_env);
602 remove_env ("COLLECT_GCC", clean_env);
John Criswelldabaf7d2003-09-16 21:27:35 +0000603
604 //
John Criswell83ca6ec2003-09-17 19:04:22 +0000605 // Determine the locations of the llc and gcc programs.
606 //
607 std::string llc=FindExecutable ("llc", argv[0]);
608 std::string gcc=FindExecutable ("gcc", argv[0]);
609 if (llc.empty())
610 {
611 return PrintAndReturn (argv[0], "Failed to find llc");
612 }
613
614 if (gcc.empty())
615 {
616 return PrintAndReturn (argv[0], "Failed to find gcc");
617 }
618
619 //
John Criswelldabaf7d2003-09-16 21:27:35 +0000620 // Run LLC to convert the bytecode file into assembly code.
621 //
John Criswell83ca6ec2003-09-17 19:04:22 +0000622 const char * cmd[8];
John Criswell621727c2003-09-17 15:20:51 +0000623 std::string AssemblyFile = OutputFilename + ".s";
624
John Criswell83ca6ec2003-09-17 19:04:22 +0000625 cmd[0] = llc.c_str();
626 cmd[1] = "-f";
627 cmd[2] = "-o";
628 cmd[3] = AssemblyFile.c_str();
629 cmd[4] = RealBytecodeOutput.c_str();
630 cmd[5] = NULL;
John Criswell621727c2003-09-17 15:20:51 +0000631 if ((ExecWait (cmd, clean_env)) == -1)
John Criswelldabaf7d2003-09-16 21:27:35 +0000632 {
633 return PrintAndReturn (argv[0], "Failed to compile bytecode");
634 }
635
636 //
637 // Run GCC to assemble and link the program into native code.
638 //
639 // Note:
640 // We can't just assemble and link the file with the system assembler
641 // and linker because we don't know where to put the _start symbol.
642 // GCC mysteriously knows how to do it.
643 //
John Criswell83ca6ec2003-09-17 19:04:22 +0000644 cmd[0] = gcc.c_str();
645 cmd[1] = "-o";
646 cmd[2] = OutputFilename.c_str();
647 cmd[3] = AssemblyFile.c_str();
648 cmd[4] = NULL;
John Criswell621727c2003-09-17 15:20:51 +0000649 if ((ExecWait (cmd, clean_env)) == -1)
John Criswelldabaf7d2003-09-16 21:27:35 +0000650 {
651 return PrintAndReturn (argv[0], "Failed to link native code file");
652 }
John Criswell621727c2003-09-17 15:20:51 +0000653
654 //
655 // The assembly file is no longer needed. Remove it, but do not exit
656 // if we fail to unlink it.
657 //
658 if (((access (AssemblyFile.c_str(), F_OK)) != -1) &&
659 ((unlink (AssemblyFile.c_str())) == -1))
660 {
661 std::cerr << "Warning: Failed to unlink " << AssemblyFile << "\n";
662 }
John Criswelldabaf7d2003-09-16 21:27:35 +0000663 }
664 else
665 {
666 // Output the script to start the program...
667 std::ofstream Out2(OutputFilename.c_str());
668 if (!Out2.good())
669 return PrintAndReturn(argv[0], "error opening '" + OutputFilename +
670 "' for writing!");
671 Out2 << "#!/bin/sh\nlli -q $0.bc $*\n";
672 Out2.close();
673 }
Chris Lattnere7fca512002-01-24 19:12:12 +0000674
Chris Lattner10970eb2003-04-19 22:44:38 +0000675 // Make the script executable...
John Criswelld35b5b52003-09-02 20:17:20 +0000676 MakeFileExecutable (OutputFilename);
Misha Brukmanc1fdca82003-08-20 20:38:15 +0000677
John Criswell22edc392003-09-02 21:11:22 +0000678 // Make the bytecode file readable and directly executable in LLEE as well
John Criswelld35b5b52003-09-02 20:17:20 +0000679 MakeFileExecutable (RealBytecodeOutput);
John Criswell22edc392003-09-02 21:11:22 +0000680 MakeFileReadable (RealBytecodeOutput);
Chris Lattner10970eb2003-04-19 22:44:38 +0000681 }
Chris Lattnere7fca512002-01-24 19:12:12 +0000682
683 return 0;
684}