annotate gen/linker.cpp @ 1404:11b122f92136

Now that templates instantiations are no longer emitted for all modules that even blink at them they seem to break due to being linkonce (if compiled with any optimization level > 0), so let's give them weak linkage instead. The difference is that unreferenced linkonce symbols can be deleted, while weak symbols need to be preserved.
author Frits van Bommel <fvbommel wxs.nl>
date Thu, 21 May 2009 15:23:28 +0200
parents 2bebd938548f
children 2292878925f4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 {
306
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
103 exedir.createDirectoryOnDisk(true, &errstr);
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
104 if (!errstr.empty())
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
105 {
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
106 error("failed to create path to linking output: %s\n%s", exedir.c_str(), errstr.c_str());
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
107 fatal();
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
108 }
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
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());
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
207 fatal();
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 }
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
209 }
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
210
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
211 //////////////////////////////////////////////////////////////////////////////
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
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
213 int linkObjToExecutable(const char* argv0)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
214 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
215 Logger::println("*** Linking executable ***");
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 // error string
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
218 std::string errstr;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
219
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
220 // 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
221 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
222 // get a string version for argv[0]
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 std::string gccStr = gcc.toString();
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
224
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
225 // build arguments
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
226 std::vector<const char*> args;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
227
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
228 // first the program name ??
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
229 args.push_back(gccStr.c_str());
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
230
681
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
231 // object files
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
232 for (int i = 0; i < global.params.objfiles->dim; i++)
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
233 {
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
234 char *p = (char *)global.params.objfiles->data[i];
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
235 args.push_back(p);
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
236 }
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
237
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
238 // output filename
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
239 std::string exestr;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
240 if (global.params.exefile)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
241 { // explicit
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
242 exestr = global.params.exefile;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
243 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
244 else
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
245 { // inferred
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
246 // try root module name
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
247 if (Module::rootModule)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
248 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
249 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
250 exestr = FileName::removeExt((char*)global.params.objfiles->data[0]);
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
251 else
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
252 exestr = "a.out";
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
253 }
863
6c850977a941 modified gen/linker.cpp to only append .exe suffix on windows if not already present
elrood
parents: 701
diff changeset
254 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
255 exestr.append(".exe");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
256
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
257 args.push_back("-o");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
258 args.push_back(exestr.c_str());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
259
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
260 // set the global gExePath
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
261 gExePath.set(exestr);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
262 assert(gExePath.isValid());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
263
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
264 // create path to exe
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
265 llvm::sys::Path exedir(gExePath);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
266 exedir.set(gExePath.getDirname());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
267 if (!exedir.exists())
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
268 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
269 exedir.createDirectoryOnDisk(true, &errstr);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
270 if (!errstr.empty())
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
271 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
272 error("failed to create path to linking output: %s\n%s", exedir.c_str(), errstr.c_str());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
273 fatal();
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
274 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
275 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
276
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
277 // additional linker switches
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
278 for (int i = 0; i < global.params.linkswitches->dim; i++)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
279 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
280 char *p = (char *)global.params.linkswitches->data[i];
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
281 args.push_back(p);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
282 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
283
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
284 // user libs
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
285 for (int i = 0; i < global.params.libfiles->dim; i++)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
286 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
287 char *p = (char *)global.params.libfiles->data[i];
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
288 args.push_back(p);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
289 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
290
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
291 // default libs
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
292 switch(global.params.os) {
900
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
293 case OSLinux:
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
294 case OSMacOSX:
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
295 args.push_back("-ldl");
900
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
296 // fallthrough
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
297 case OSFreeBSD:
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
298 args.push_back("-lpthread");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
299 args.push_back("-lm");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
300 break;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
301
900
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
302 case OSSolaris:
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
303 args.push_back("-lm");
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
304 args.push_back("-lumem");
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
305 // solaris TODO
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
306 break;
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
307
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
308 case OSWindows:
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
309 // FIXME: I'd assume kernel32 etc
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
310 break;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
311 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
312
902
893d72ab95d0 Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
313 //FIXME: enforce 64 bit
893d72ab95d0 Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
314 if (global.params.is64bit)
893d72ab95d0 Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
315 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
316 else
f756c47f310a Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents: 994
diff changeset
317 // Assume 32-bit?
f756c47f310a Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents: 994
diff changeset
318 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
319
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
320 // print link command?
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
321 if (!quiet || global.params.verbose)
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
322 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
323 // Print it
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
324 for (int i = 0; i < args.size(); i++)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
325 printf("%s ", args[i]);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
326 printf("\n");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
327 fflush(stdout);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
328 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
329
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
330 Logger::println("Linking with: ");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
331 std::vector<const char*>::const_iterator I = args.begin(), E = args.end();
994
18ad5601dff7 Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents: 986
diff changeset
332 llvm::OStream logstr = Logger::cout();
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
333 for (; I != E; ++I)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
334 if (*I)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
335 logstr << "'" << *I << "'" << " ";
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
336 logstr << "\n" << std::flush;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
337
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
338
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
339 // terminate args list
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
340 args.push_back(NULL);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
341
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
342 // try to call linker!!!
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
343 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
344 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
345 error("linking failed:\nstatus: %d", status);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
346 if (!errstr.empty())
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
347 error("message: %s", errstr.c_str());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
348 fatal();
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
349 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
350 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
351
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
352 //////////////////////////////////////////////////////////////////////////////
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
353
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
354 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
355 {
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
356 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
357 {
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 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
359 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
360 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
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 }
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
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 //////////////////////////////////////////////////////////////////////////////
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
1313
2bebd938548f Fix typo in function name
Frits van Bommel <fvbommel wxs.nl>
parents: 1299
diff changeset
366 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
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 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
369 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
370
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 // 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
372 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
373 // args[0] should be the name of the executable
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
374 args.push_back(gExePath.toString().c_str());
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
375 // 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
376 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
377 {
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
378 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
379 }
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
380 // 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
381 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
382
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 // 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
384 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
385 int status = llvm::sys::Program::ExecuteAndWait(gExePath, &args[0], NULL, NULL, 0,0, &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
386 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
387 {
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 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
389 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
390 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
391 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
392 }
278
30941d8ee320 [svn r299] forgot to return status in runExecutable
lindquist
parents: 277
diff changeset
393 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
394 }