annotate gen/linker.cpp @ 1083:c1e9f612e2e2

Fix for dual operand form of fistp, also make reg ST(0) explicit and fix lindquists previous code that allowed dual operand form of fstp but dissallowed the single operand form accidently
author Kelly Wilson <wilsonk cpsc.ucalgary.ca>
date Tue, 10 Mar 2009 06:23:26 -0600
parents f756c47f310a
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 }