Mercurial > projects > ldc
annotate gen/linker.cpp @ 1650:40bd4a0d4870
Update to work with LLVM 2.7.
Removed use of dyn_cast, llvm no compiles
without exceptions and rtti by
default. We do need exceptions for the libconfig stuff, but rtti isn't
necessary (anymore).
Debug info needs to be rewritten, as in LLVM 2.7 the format has
completely changed. To have something to look at while rewriting, the
old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means
that you have to define this to compile at the moment.
Updated tango 0.99.9 patch to include updated EH runtime code, which is
needed for LLVM 2.7 as well.
author | Tomas Lindquist Olsen |
---|---|
date | Wed, 19 May 2010 12:42:32 +0200 |
parents | a60e7d1ce3ee |
children |
rev | line source |
---|---|
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
1 #include "gen/linker.h" |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
2 #include "gen/llvm.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
3 #include "llvm/Linker.h" |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
4 #include "llvm/System/Program.h" |
306
0baca2feb554
[svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents:
278
diff
changeset
|
5 #if _WIN32 |
0baca2feb554
[svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents:
278
diff
changeset
|
6 #include "llvm/Support/SystemUtils.h" |
0baca2feb554
[svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents:
278
diff
changeset
|
7 #endif |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
8 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
9 #include "root.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
10 #include "mars.h" |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
11 #include "module.h" |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
12 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
13 #define NO_COUT_LOGGER |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
14 #include "gen/logger.h" |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
15 #include "gen/cl_options.h" |
1170
e40c65bd8c5d
Allow specific optimization passes to be requested from the command line.
Frits van Bommel <fvbommel wxs.nl>
parents:
1026
diff
changeset
|
16 #include "gen/optimizer.h" |
1299
847b767b2d0b
Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
1171
diff
changeset
|
17 #include "gen/programs.h" |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
18 |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
19 ////////////////////////////////////////////////////////////////////////////// |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
20 |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
21 // Is this useful? |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
22 llvm::cl::opt<bool> quiet("quiet", |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
23 llvm::cl::desc("Suppress output of link command (unless -v is also passed)"), |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
24 llvm::cl::Hidden, |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
25 llvm::cl::ZeroOrMore, |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
26 llvm::cl::init(true)); |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
27 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
28 ////////////////////////////////////////////////////////////////////////////// |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
29 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
30 typedef std::vector<llvm::Module*> Module_vector; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
31 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
32 void linkModules(llvm::Module* dst, const Module_vector& MV) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
33 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
34 if (MV.empty()) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
35 return; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
36 |
663
6aaa3d3c1183
First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents:
637
diff
changeset
|
37 llvm::Linker linker("ldc", dst); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
38 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
39 std::string err; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
40 for (Module_vector::const_iterator i=MV.begin(); i!=MV.end(); ++i) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
41 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
42 if (!linker.LinkInModule(*i, &err)) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
43 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
44 error("%s", err.c_str()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
45 fatal(); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
46 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
47 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
48 } |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
49 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
50 ////////////////////////////////////////////////////////////////////////////// |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
51 |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
52 static llvm::sys::Path gExePath; |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
53 |
306
0baca2feb554
[svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents:
278
diff
changeset
|
54 int linkExecutable(const char* argv0) |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
55 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
56 Logger::println("*** Linking executable ***"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
57 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
58 // error string |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
59 std::string errstr; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
60 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
61 // find the llvm-ld program |
306
0baca2feb554
[svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents:
278
diff
changeset
|
62 llvm::sys::Path ldpath = llvm::sys::Program::FindProgramByName("llvm-ld"); |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
63 if (ldpath.isEmpty()) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
64 { |
306
0baca2feb554
[svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents:
278
diff
changeset
|
65 ldpath.set("llvm-ld"); |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
66 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
67 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
68 // build arguments |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
69 std::vector<const char*> args; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
70 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
71 // first the program name ?? |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
72 args.push_back("llvm-ld"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
73 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
74 // output filename |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
75 std::string exestr; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
76 if (global.params.exefile) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
77 { // explicit |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
78 exestr = global.params.exefile; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
79 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
80 else |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
81 { // inferred |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
82 // try root module name |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
83 if (Module::rootModule) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
84 exestr = Module::rootModule->toChars(); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
85 else |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
86 exestr = "a.out"; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
87 } |
863
6c850977a941
modified gen/linker.cpp to only append .exe suffix on windows if not already present
elrood
parents:
701
diff
changeset
|
88 if (global.params.os == OSWindows && !(exestr.substr(exestr.length()-4) == ".exe")) |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
89 exestr.append(".exe"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
90 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
91 std::string outopt = "-o=" + exestr; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
92 args.push_back(outopt.c_str()); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
93 |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
94 // set the global gExePath |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
95 gExePath.set(exestr); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
96 assert(gExePath.isValid()); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
97 |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
98 // create path to exe |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
99 llvm::sys::Path exedir(gExePath); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
100 exedir.set(gExePath.getDirname()); |
306
0baca2feb554
[svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents:
278
diff
changeset
|
101 if (!exedir.exists()) |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
102 { |
1586
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
103 exedir.createDirectoryOnDisk(true, &errstr); |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
104 if (!errstr.empty()) |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
105 { |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
106 error("failed to create path to linking output: %s\n%s", exedir.c_str(), errstr.c_str()); |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
107 fatal(); |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
108 } |
1650 | 109 } |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
110 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
111 // strip debug info |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
112 if (!global.params.symdebug) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
113 args.push_back("-strip-debug"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
114 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
115 // optimization level |
1170
e40c65bd8c5d
Allow specific optimization passes to be requested from the command line.
Frits van Bommel <fvbommel wxs.nl>
parents:
1026
diff
changeset
|
116 if (!optimize()) |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
117 args.push_back("-disable-opt"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
118 else |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
119 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
120 const char* s = 0; |
1170
e40c65bd8c5d
Allow specific optimization passes to be requested from the command line.
Frits van Bommel <fvbommel wxs.nl>
parents:
1026
diff
changeset
|
121 switch(optLevel()) |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
122 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
123 case 0: |
393
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
124 args.push_back("-disable-opt"); |
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
125 break; |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
126 case 1: |
1171
461a85f0db31
Change meaning of optimization levels: -O0 now means 'no optimization' like with
Frits van Bommel <fvbommel wxs.nl>
parents:
1170
diff
changeset
|
127 args.push_back("-globaldce"); |
393
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
128 args.push_back("-disable-opt"); |
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
129 args.push_back("-globaldce"); |
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
130 args.push_back("-mem2reg"); |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
131 case 2: |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
132 case 3: |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
133 case 4: |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
134 case 5: |
393
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
135 // use default optimization |
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
136 break; |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
137 default: |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
138 assert(0); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
139 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
140 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
141 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
142 // inlining |
1170
e40c65bd8c5d
Allow specific optimization passes to be requested from the command line.
Frits van Bommel <fvbommel wxs.nl>
parents:
1026
diff
changeset
|
143 if (!(global.params.useInline || doInline())) |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
144 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
145 args.push_back("-disable-inlining"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
146 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
147 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
148 // additional linker switches |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
149 for (int i = 0; i < global.params.linkswitches->dim; i++) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
150 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
151 char *p = (char *)global.params.linkswitches->data[i]; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
152 args.push_back(p); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
153 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
154 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
155 // native please |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
156 args.push_back("-native"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
157 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
158 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
159 // user libs |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
160 for (int i = 0; i < global.params.libfiles->dim; i++) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
161 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
162 char *p = (char *)global.params.libfiles->data[i]; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
163 args.push_back(p); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
164 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
165 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
166 // default libs |
637
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
167 switch(global.params.os) { |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
168 case OSLinux: |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
169 case OSMacOSX: |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
170 args.push_back("-ldl"); |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
171 case OSFreeBSD: |
376
6788e98ec1cd
Do only link to libpthread, libm and libdl on Linux.
Christian Kamm <kamm incasoftware de>
parents:
325
diff
changeset
|
172 args.push_back("-lpthread"); |
6788e98ec1cd
Do only link to libpthread, libm and libdl on Linux.
Christian Kamm <kamm incasoftware de>
parents:
325
diff
changeset
|
173 args.push_back("-lm"); |
637
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
174 break; |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
175 |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
176 case OSWindows: |
393
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
177 // FIXME: I'd assume kernel32 etc |
637
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
567
diff
changeset
|
178 break; |
393
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
376
diff
changeset
|
179 } |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
180 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
181 // object files |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
182 for (int i = 0; i < global.params.objfiles->dim; i++) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
183 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
184 char *p = (char *)global.params.objfiles->data[i]; |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
185 args.push_back(p); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
186 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
187 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
188 // print link command? |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
189 if (!quiet || global.params.verbose) |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
190 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
191 // Print it |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
192 for (int i = 0; i < args.size(); i++) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
193 printf("%s ", args[i]); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
194 printf("\n"); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
195 fflush(stdout); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
196 } |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
197 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
198 // terminate args list |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
199 args.push_back(NULL); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
200 |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
201 // try to call linker!!! |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
202 if (int status = llvm::sys::Program::ExecuteAndWait(ldpath, &args[0], NULL, NULL, 0,0, &errstr)) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
203 { |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
204 error("linking failed:\nstatus: %d", status); |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
205 if (!errstr.empty()) |
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
206 error("message: %s", errstr.c_str()); |
1586
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
207 return status; |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
208 } |
1586
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
209 |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
210 return 0; |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
244
diff
changeset
|
211 } |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
212 |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
213 ////////////////////////////////////////////////////////////////////////////// |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
214 |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
215 int linkObjToExecutable(const char* argv0) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
216 { |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
217 Logger::println("*** Linking executable ***"); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
218 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
219 // error string |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
220 std::string errstr; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
221 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
222 // find gcc for linking |
1299
847b767b2d0b
Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
1171
diff
changeset
|
223 llvm::sys::Path gcc = getGcc(); |
847b767b2d0b
Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
1171
diff
changeset
|
224 // get a string version for argv[0] |
1650 | 225 const char* gccStr = gcc.c_str(); |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
226 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
227 // build arguments |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
228 std::vector<const char*> args; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
229 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
230 // first the program name ?? |
1650 | 231 args.push_back(gccStr); |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
232 |
681
ca4a816f2440
Another link order fix.
Christian Kamm <kamm incasoftware de>
parents:
677
diff
changeset
|
233 // object files |
ca4a816f2440
Another link order fix.
Christian Kamm <kamm incasoftware de>
parents:
677
diff
changeset
|
234 for (int i = 0; i < global.params.objfiles->dim; i++) |
ca4a816f2440
Another link order fix.
Christian Kamm <kamm incasoftware de>
parents:
677
diff
changeset
|
235 { |
ca4a816f2440
Another link order fix.
Christian Kamm <kamm incasoftware de>
parents:
677
diff
changeset
|
236 char *p = (char *)global.params.objfiles->data[i]; |
ca4a816f2440
Another link order fix.
Christian Kamm <kamm incasoftware de>
parents:
677
diff
changeset
|
237 args.push_back(p); |
ca4a816f2440
Another link order fix.
Christian Kamm <kamm incasoftware de>
parents:
677
diff
changeset
|
238 } |
ca4a816f2440
Another link order fix.
Christian Kamm <kamm incasoftware de>
parents:
677
diff
changeset
|
239 |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
240 // output filename |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
241 std::string exestr; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
242 if (global.params.exefile) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
243 { // explicit |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
244 exestr = global.params.exefile; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
245 } |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
246 else |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
247 { // inferred |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
248 // try root module name |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
249 if (Module::rootModule) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
250 exestr = Module::rootModule->toChars(); |
701
855e0ef78fa2
Guess exe name from first object name if none specified.
Christian Kamm <kamm incasoftware de>
parents:
681
diff
changeset
|
251 else if (global.params.objfiles->dim) |
855e0ef78fa2
Guess exe name from first object name if none specified.
Christian Kamm <kamm incasoftware de>
parents:
681
diff
changeset
|
252 exestr = FileName::removeExt((char*)global.params.objfiles->data[0]); |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
253 else |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
254 exestr = "a.out"; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
255 } |
863
6c850977a941
modified gen/linker.cpp to only append .exe suffix on windows if not already present
elrood
parents:
701
diff
changeset
|
256 if (global.params.os == OSWindows && !(exestr.rfind(".exe") == exestr.length()-4)) |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
257 exestr.append(".exe"); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
258 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
259 args.push_back("-o"); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
260 args.push_back(exestr.c_str()); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
261 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
262 // set the global gExePath |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
263 gExePath.set(exestr); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
264 assert(gExePath.isValid()); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
265 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
266 // create path to exe |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
267 llvm::sys::Path exedir(gExePath); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
268 exedir.set(gExePath.getDirname()); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
269 if (!exedir.exists()) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
270 { |
1586
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
271 exedir.createDirectoryOnDisk(true, &errstr); |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
272 if (!errstr.empty()) |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
273 { |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
274 error("failed to create path to linking output: %s\n%s", exedir.c_str(), errstr.c_str()); |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
275 fatal(); |
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
276 } |
1650 | 277 } |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
278 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
279 // additional linker switches |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
280 for (int i = 0; i < global.params.linkswitches->dim; i++) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
281 { |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
282 char *p = (char *)global.params.linkswitches->data[i]; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
283 args.push_back(p); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
284 } |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
285 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
286 // user libs |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
287 for (int i = 0; i < global.params.libfiles->dim; i++) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
288 { |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
289 char *p = (char *)global.params.libfiles->data[i]; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
290 args.push_back(p); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
291 } |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
292 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
293 // default libs |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
294 switch(global.params.os) { |
1650 | 295 case OSLinux: |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
296 case OSMacOSX: |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
297 args.push_back("-ldl"); |
900
177afbf5297b
Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
298 // fallthrough |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
299 case OSFreeBSD: |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
300 args.push_back("-lpthread"); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
301 args.push_back("-lm"); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
302 break; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
303 |
900
177afbf5297b
Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
304 case OSSolaris: |
177afbf5297b
Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
305 args.push_back("-lm"); |
177afbf5297b
Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
306 args.push_back("-lumem"); |
177afbf5297b
Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
307 // solaris TODO |
177afbf5297b
Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
308 break; |
177afbf5297b
Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
309 |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
310 case OSWindows: |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
311 // FIXME: I'd assume kernel32 etc |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
312 break; |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
313 } |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
314 |
902
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
900
diff
changeset
|
315 //FIXME: enforce 64 bit |
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
900
diff
changeset
|
316 if (global.params.is64bit) |
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
900
diff
changeset
|
317 args.push_back("-m64"); |
1026
f756c47f310a
Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents:
994
diff
changeset
|
318 else |
f756c47f310a
Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents:
994
diff
changeset
|
319 // Assume 32-bit? |
f756c47f310a
Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents:
994
diff
changeset
|
320 args.push_back("-m32"); |
902
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
900
diff
changeset
|
321 |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
322 // print link command? |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
323 if (!quiet || global.params.verbose) |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
324 { |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
325 // Print it |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
326 for (int i = 0; i < args.size(); i++) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
327 printf("%s ", args[i]); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
328 printf("\n"); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
329 fflush(stdout); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
330 } |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
331 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
332 Logger::println("Linking with: "); |
1650 | 333 std::vector<const char*>::const_iterator I = args.begin(), E = args.end(); |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1313
diff
changeset
|
334 Stream logstr = Logger::cout(); |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
335 for (; I != E; ++I) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
336 if (*I) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
337 logstr << "'" << *I << "'" << " "; |
1650 | 338 logstr << "\n"; // FIXME where's flush ? |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
339 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
340 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
341 // terminate args list |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
342 args.push_back(NULL); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
343 |
1586
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
344 // try to call linker |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
345 if (int status = llvm::sys::Program::ExecuteAndWait(gcc, &args[0], NULL, NULL, 0,0, &errstr)) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
346 { |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
347 error("linking failed:\nstatus: %d", status); |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
348 if (!errstr.empty()) |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
349 error("message: %s", errstr.c_str()); |
1586
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
350 return status; |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
351 } |
1650 | 352 |
1586
7f728c52e63c
Fix several 'reaches end of function' warnings by making fatal noreturn.
Christian Kamm <kamm incasoftware de>
parents:
1502
diff
changeset
|
353 return 0; |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
354 } |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
355 |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
356 ////////////////////////////////////////////////////////////////////////////// |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
357 |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
358 void deleteExecutable() |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
359 { |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
360 if (!gExePath.isEmpty()) |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
361 { |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
362 assert(gExePath.isValid()); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
363 assert(!gExePath.isDirectory()); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
364 gExePath.eraseFromDisk(false); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
365 } |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
366 } |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
367 |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
368 ////////////////////////////////////////////////////////////////////////////// |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
369 |
1313
2bebd938548f
Fix typo in function name
Frits van Bommel <fvbommel wxs.nl>
parents:
1299
diff
changeset
|
370 int runExecutable() |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
371 { |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
372 assert(!gExePath.isEmpty()); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
373 assert(gExePath.isValid()); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
374 |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
375 // build arguments |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
376 std::vector<const char*> args; |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
377 // args[0] should be the name of the executable |
1650 | 378 args.push_back(gExePath.c_str()); |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
379 // Skip first argument to -run; it's a D source file. |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
380 for (size_t i = 1, length = opts::runargs.size(); i < length; i++) |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
381 { |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
902
diff
changeset
|
382 args.push_back(opts::runargs[i].c_str()); |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
383 } |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
384 // terminate args list |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
385 args.push_back(NULL); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
386 |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
387 // try to call linker!!! |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
388 std::string errstr; |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
389 int status = llvm::sys::Program::ExecuteAndWait(gExePath, &args[0], NULL, NULL, 0,0, &errstr); |
1600
a60e7d1ce3ee
Folded in a patch by Troy Straszheim to better report errors with -run.
Robert Clipsham <robert@octarineparrot.com>
parents:
1586
diff
changeset
|
390 if (status < 0) |
a60e7d1ce3ee
Folded in a patch by Troy Straszheim to better report errors with -run.
Robert Clipsham <robert@octarineparrot.com>
parents:
1586
diff
changeset
|
391 { |
a60e7d1ce3ee
Folded in a patch by Troy Straszheim to better report errors with -run.
Robert Clipsham <robert@octarineparrot.com>
parents:
1586
diff
changeset
|
392 error("program received signal %d (%s)", -status, strsignal(-status)); |
a60e7d1ce3ee
Folded in a patch by Troy Straszheim to better report errors with -run.
Robert Clipsham <robert@octarineparrot.com>
parents:
1586
diff
changeset
|
393 return -status; |
a60e7d1ce3ee
Folded in a patch by Troy Straszheim to better report errors with -run.
Robert Clipsham <robert@octarineparrot.com>
parents:
1586
diff
changeset
|
394 } |
a60e7d1ce3ee
Folded in a patch by Troy Straszheim to better report errors with -run.
Robert Clipsham <robert@octarineparrot.com>
parents:
1586
diff
changeset
|
395 |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
396 if (!errstr.empty()) |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
397 { |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
398 error("failed to execute program"); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
399 if (!errstr.empty()) |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
400 error("error message: %s", errstr.c_str()); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
401 fatal(); |
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
402 } |
278
30941d8ee320
[svn r299] forgot to return status in runExecutable
lindquist
parents:
277
diff
changeset
|
403 return status; |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
404 } |