annotate gen/linker.cpp @ 1299:847b767b2d0b

Factor out the code to find gcc, and add a command-line option to override the default executable name. This should help cross-compilation by allowing a cross-gcc to be specified from the configuration file instead of only through the CC environment variable.
author Frits van Bommel <fvbommel wxs.nl>
date Mon, 04 May 2009 13:32:16 +0200
parents 461a85f0db31
children 2bebd938548f
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
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 int runExectuable()
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 }