annotate gen/linker.cpp @ 1026:f756c47f310a

Pass -m32/-m64 on to gcc when assembling and linking
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 01 Mar 2009 22:59:03 +0100
parents 18ad5601dff7
children e40c65bd8c5d
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"
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
16
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
17 //////////////////////////////////////////////////////////////////////////////
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 // Is this useful?
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
20 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
21 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
22 llvm::cl::Hidden,
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
23 llvm::cl::ZeroOrMore,
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
24 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
25
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
26 //////////////////////////////////////////////////////////////////////////////
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
27
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
28 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
29
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
30 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
31 {
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
32 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
33 return;
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
34
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 637
diff changeset
35 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
36
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
37 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
38 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
39 {
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
40 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
41 {
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
42 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
43 fatal();
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
44 }
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
45 }
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff changeset
46 }
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
47
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
48 //////////////////////////////////////////////////////////////////////////////
21f85bac0b1a [svn 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
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
50 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
51
306
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
52 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
53 {
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
54 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
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 // 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
57 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
58
21f85bac0b1a [svn 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 // 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
60 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
61 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
62 {
306
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
63 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
64 }
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
65
21f85bac0b1a [svn 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 // 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
67 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
68
21f85bac0b1a [svn 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 // 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
70 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
71
21f85bac0b1a [svn 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 // 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
73 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
74 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
75 { // 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
76 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
77 }
21f85bac0b1a [svn 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 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
79 { // 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
80 // 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
81 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
82 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
83 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
84 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
85 }
863
6c850977a941 modified gen/linker.cpp to only append .exe suffix on windows if not already present
elrood
parents: 701
diff changeset
86 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
87 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
88
21f85bac0b1a [svn 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 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
90 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
91
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
92 // 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
93 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
94 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
95
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
96 // 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
97 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
98 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
99 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
100 {
306
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
101 exedir.createDirectoryOnDisk(true, &errstr);
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
102 if (!errstr.empty())
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
103 {
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
104 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
105 fatal();
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
106 }
0baca2feb554 [svn r327] Fixed some more MinGW32 issues. It's now very close to working.
lindquist
parents: 278
diff changeset
107 }
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
108
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
109 // 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
110 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
111 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
112
21f85bac0b1a [svn 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 // optimization level
21f85bac0b1a [svn 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 if (!global.params.optimize)
21f85bac0b1a [svn 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 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
116 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
117 {
21f85bac0b1a [svn 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 const char* s = 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
119 switch(global.params.optimizeLevel)
21f85bac0b1a [svn 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 {
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
121 case 0:
393
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
122 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
123 args.push_back("-globaldce");
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
124 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
125 case 1:
393
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
126 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
127 args.push_back("-globaldce");
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
128 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
129 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
130 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
131 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
132 case 5:
393
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
133 // use default optimization
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
134 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
135 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
136 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
137 }
21f85bac0b1a [svn 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 }
21f85bac0b1a [svn 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 // 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
141 if (!(global.params.useInline || global.params.llvmInline))
21f85bac0b1a [svn 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 {
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
143 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
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
21f85bac0b1a [svn 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 // 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
147 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
148 {
21f85bac0b1a [svn 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 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
150 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
151 }
21f85bac0b1a [svn 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
21f85bac0b1a [svn 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 // 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
154 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
155
21f85bac0b1a [svn 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
21f85bac0b1a [svn 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 // 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
158 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
159 {
21f85bac0b1a [svn 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 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
161 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
162 }
21f85bac0b1a [svn 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
21f85bac0b1a [svn 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 // 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
165 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
166 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
167 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
168 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
169 case OSFreeBSD:
376
6788e98ec1cd Do only link to libpthread, libm and libdl on Linux.
Christian Kamm <kamm incasoftware de>
parents: 325
diff changeset
170 args.push_back("-lpthread");
6788e98ec1cd Do only link to libpthread, libm and libdl on Linux.
Christian Kamm <kamm incasoftware de>
parents: 325
diff changeset
171 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
172 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
173
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 case OSWindows:
393
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
175 // 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
176 break;
393
a3f3c2770a0d Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 376
diff changeset
177 }
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
178
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
179 // 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
180 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
181 {
21f85bac0b1a [svn 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 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
183 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
184 }
21f85bac0b1a [svn 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
21f85bac0b1a [svn 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 // print link command?
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
187 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
188 {
21f85bac0b1a [svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents: 244
diff changeset
189 // 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
190 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
191 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
192 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
193 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
194 }
21f85bac0b1a [svn 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
21f85bac0b1a [svn 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 // 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
197 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
198
21f85bac0b1a [svn 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 // 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
200 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
201 {
21f85bac0b1a [svn 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 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
203 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
204 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
205 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
206 }
21f85bac0b1a [svn 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 }
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
208
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
209 //////////////////////////////////////////////////////////////////////////////
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
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
211 int linkObjToExecutable(const char* argv0)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
212 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
213 Logger::println("*** Linking executable ***");
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 // error string
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
216 std::string errstr;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
217
890
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
218 const char *cc;
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
219 #if !_WIN32
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
220 cc = getenv("CC");
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
221 if (!cc)
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
222 #endif
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
223 cc = "gcc";
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
224
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
225 // find gcc for linking
890
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
226 llvm::sys::Path gcc = llvm::sys::Program::FindProgramByName(cc);
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
227 if (gcc.isEmpty())
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
228 {
890
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
229 gcc.set(cc);
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
230 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
231
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
232 // build arguments
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
233 std::vector<const char*> args;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
234
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
235 // first the program name ??
890
5a03f3f74615 Apply afb's patch from #168 to use $CC instead of "gcc" for toobj and linker.
Christian Kamm <kamm incasoftware de>
parents: 863
diff changeset
236 args.push_back(cc);
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
237
681
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
238 // object files
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
239 for (int i = 0; i < global.params.objfiles->dim; i++)
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
240 {
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
241 char *p = (char *)global.params.objfiles->data[i];
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
242 args.push_back(p);
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
243 }
ca4a816f2440 Another link order fix.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
244
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
245 // output filename
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
246 std::string exestr;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
247 if (global.params.exefile)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
248 { // explicit
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
249 exestr = global.params.exefile;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
250 }
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 { // inferred
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
253 // try root module name
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
254 if (Module::rootModule)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
255 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
256 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
257 exestr = FileName::removeExt((char*)global.params.objfiles->data[0]);
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
258 else
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
259 exestr = "a.out";
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
260 }
863
6c850977a941 modified gen/linker.cpp to only append .exe suffix on windows if not already present
elrood
parents: 701
diff changeset
261 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
262 exestr.append(".exe");
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 args.push_back("-o");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
265 args.push_back(exestr.c_str());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
266
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
267 // set the global gExePath
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
268 gExePath.set(exestr);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
269 assert(gExePath.isValid());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
270
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
271 // create path to exe
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
272 llvm::sys::Path exedir(gExePath);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
273 exedir.set(gExePath.getDirname());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
274 if (!exedir.exists())
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 exedir.createDirectoryOnDisk(true, &errstr);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
277 if (!errstr.empty())
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
278 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
279 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
280 fatal();
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
281 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
282 }
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 // additional linker switches
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
285 for (int i = 0; i < global.params.linkswitches->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.linkswitches->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 // user libs
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
292 for (int i = 0; i < global.params.libfiles->dim; i++)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
293 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
294 char *p = (char *)global.params.libfiles->data[i];
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
295 args.push_back(p);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
296 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
297
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
298 // default libs
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
299 switch(global.params.os) {
900
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
300 case OSLinux:
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
301 case OSMacOSX:
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
302 args.push_back("-ldl");
900
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
303 // fallthrough
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
304 case OSFreeBSD:
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
305 args.push_back("-lpthread");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
306 args.push_back("-lm");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
307 break;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
308
900
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
309 case OSSolaris:
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
310 args.push_back("-lm");
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
311 args.push_back("-lumem");
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
312 // solaris TODO
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
313 break;
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 890
diff changeset
314
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
315 case OSWindows:
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
316 // FIXME: I'd assume kernel32 etc
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
317 break;
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
318 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
319
902
893d72ab95d0 Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
320 //FIXME: enforce 64 bit
893d72ab95d0 Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
321 if (global.params.is64bit)
893d72ab95d0 Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
322 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
323 else
f756c47f310a Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents: 994
diff changeset
324 // Assume 32-bit?
f756c47f310a Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents: 994
diff changeset
325 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
326
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
327 // print link command?
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
328 if (!quiet || global.params.verbose)
677
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 // Print it
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
331 for (int i = 0; i < args.size(); i++)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
332 printf("%s ", args[i]);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
333 printf("\n");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
334 fflush(stdout);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
335 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
336
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
337 Logger::println("Linking with: ");
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
338 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
339 llvm::OStream logstr = Logger::cout();
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
340 for (; I != E; ++I)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
341 if (*I)
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
342 logstr << "'" << *I << "'" << " ";
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
343 logstr << "\n" << std::flush;
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
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
346 // terminate args list
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
347 args.push_back(NULL);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
348
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
349 // try to call linker!!!
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
350 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
351 {
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
352 error("linking failed:\nstatus: %d", status);
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
353 if (!errstr.empty())
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
354 error("message: %s", errstr.c_str());
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
355 fatal();
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
356 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
357 }
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
358
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
359 //////////////////////////////////////////////////////////////////////////////
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
360
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
361 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
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 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
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 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
366 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
367 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
368 }
90a8c798b0db [svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents: 276
diff changeset
369 }
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 //////////////////////////////////////////////////////////////////////////////
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
90a8c798b0db [svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents: 276
diff changeset
373 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
374 {
90a8c798b0db [svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents: 276
diff changeset
375 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
376 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
377
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
378 // 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
379 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
380 // 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
381 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
382 // 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
383 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
384 {
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 902
diff changeset
385 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
386 }
90a8c798b0db [svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents: 276
diff changeset
387 // 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
388 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
389
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 // 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
391 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
392 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
393 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
394 {
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
395 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
396 if (!errstr.empty())
90a8c798b0db [svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents: 276
diff changeset
397 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
398 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
399 }
278
30941d8ee320 [svn r299] forgot to return status in runExecutable
lindquist
parents: 277
diff changeset
400 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
401 }