blob: 6d468ab85eb91cd94a8f2c575b82644b97bca31c [file] [log] [blame]
Nick Lewyckye3365aa2010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000011#include "InputInfo.h"
12#include "SanitizerArgs.h"
13#include "ToolChains.h"
14#include "clang/Basic/ObjCRuntime.h"
Kevin Enderby02341792013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbar1d460332009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar88137642009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Douglas Gregor55d3f7a2009-10-29 00:41:01 +000025#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar5b750fe2009-09-09 22:32:34 +000026#include "llvm/ADT/Twine.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000027#include "llvm/Option/Arg.h"
28#include "llvm/Option/ArgList.h"
29#include "llvm/Option/Option.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Daniel Dunbar02633b52009-03-26 16:23:12 +000032#include "llvm/Support/Format.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000033#include "llvm/Support/Host.h"
Rafael Espindola8db7ec02013-06-25 14:29:51 +000034#include "llvm/Support/Program.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000035#include "llvm/Support/Process.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000036#include "llvm/Support/raw_ostream.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000037#include <sys/stat.h>
Daniel Dunbar871adcf2009-03-18 07:06:02 +000038
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000039using namespace clang::driver;
40using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000041using namespace clang;
Reid Klecknerb1e25a12013-06-14 17:17:23 +000042using namespace llvm::opt;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000043
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000044/// CheckPreprocessingOptions - Perform some validation of preprocessing
45/// arguments that is shared with gcc.
46static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
47 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +000048 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner5f9e2722011-07-23 10:55:15 +000049 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000050 << A->getAsString(Args) << "-E";
51}
52
Daniel Dunbare2fd6642009-09-10 01:21:12 +000053/// CheckCodeGenerationOptions - Perform some validation of code generation
54/// arguments that is shared with gcc.
55static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
56 // In gcc, only ARM checks this, but it seems reasonable to check universally.
57 if (Args.hasArg(options::OPT_static))
58 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
59 options::OPT_mdynamic_no_pic))
Chris Lattner5f9e2722011-07-23 10:55:15 +000060 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbare2fd6642009-09-10 01:21:12 +000061 << A->getAsString(Args) << "-static";
62}
63
Chris Lattner3edbeb72010-03-29 17:55:58 +000064// Quote target names for inclusion in GNU Make dependency files.
65// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner5f9e2722011-07-23 10:55:15 +000066static void QuoteTarget(StringRef Target,
67 SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +000068 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
69 switch (Target[i]) {
70 case ' ':
71 case '\t':
72 // Escape the preceding backslashes
73 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
74 Res.push_back('\\');
75
76 // Escape the space/tab
77 Res.push_back('\\');
78 break;
79 case '$':
80 Res.push_back('$');
81 break;
82 case '#':
83 Res.push_back('\\');
84 break;
85 default:
86 break;
87 }
88
89 Res.push_back(Target[i]);
90 }
91}
92
Bill Wendling3d717152012-03-12 22:10:06 +000093static void addDirectoryList(const ArgList &Args,
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000094 ArgStringList &CmdArgs,
95 const char *ArgName,
Bill Wendling3d717152012-03-12 22:10:06 +000096 const char *EnvVar) {
97 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +000098 bool CombinedArg = false;
99
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000100 if (!DirList)
101 return; // Nothing to do.
102
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000103 StringRef Name(ArgName);
104 if (Name.equals("-I") || Name.equals("-L"))
105 CombinedArg = true;
106
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000107 StringRef Dirs(DirList);
108 if (Dirs.empty()) // Empty string should not add '.'.
109 return;
110
111 StringRef::size_type Delim;
Rafael Espindola8db7ec02013-06-25 14:29:51 +0000112 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000113 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000114 if (CombinedArg) {
115 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
116 } else {
117 CmdArgs.push_back(ArgName);
118 CmdArgs.push_back(".");
119 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000120 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000121 if (CombinedArg) {
122 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
123 } else {
124 CmdArgs.push_back(ArgName);
125 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
126 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000127 }
Nico Weber09c5c392012-03-19 15:00:03 +0000128 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000129 }
130
131 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000132 if (CombinedArg) {
133 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
134 } else {
135 CmdArgs.push_back(ArgName);
136 CmdArgs.push_back(".");
137 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000138 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000139 if (CombinedArg) {
140 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
141 } else {
142 CmdArgs.push_back(ArgName);
143 CmdArgs.push_back(Args.MakeArgString(Dirs));
144 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000145 }
146}
147
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000148static void AddLinkerInputs(const ToolChain &TC,
149 const InputInfoList &Inputs, const ArgList &Args,
150 ArgStringList &CmdArgs) {
151 const Driver &D = TC.getDriver();
152
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000153 // Add extra linker input arguments which are not treated as inputs
154 // (constructed via -Xarch_).
155 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
156
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000157 for (InputInfoList::const_iterator
158 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
159 const InputInfo &II = *it;
160
161 if (!TC.HasNativeLLVMSupport()) {
162 // Don't try to pass LLVM inputs unless we have native support.
163 if (II.getType() == types::TY_LLVM_IR ||
164 II.getType() == types::TY_LTO_IR ||
165 II.getType() == types::TY_LLVM_BC ||
166 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000167 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000168 << TC.getTripleString();
169 }
170
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000171 // Add filenames immediately.
172 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000173 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000174 continue;
175 }
176
177 // Otherwise, this is a linker input argument.
178 const Arg &A = II.getInputArg();
179
180 // Handle reserved library options.
181 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000182 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Sen7433fed2010-09-17 18:39:08 +0000183 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
184 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000185 } else
186 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000187 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000188
189 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendling3d717152012-03-12 22:10:06 +0000190 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000191}
192
John McCallf85e1932011-06-15 23:02:42 +0000193/// \brief Determine whether Objective-C automated reference counting is
194/// enabled.
195static bool isObjCAutoRefCount(const ArgList &Args) {
196 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
197}
198
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000199/// \brief Determine whether we are linking the ObjC runtime.
200static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000201 if (isObjCAutoRefCount(Args)) {
202 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000203 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000204 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000205 return Args.hasArg(options::OPT_fobjc_link_runtime);
206}
207
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000208static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000209 ArgStringList &CmdArgs,
210 llvm::Triple Triple) {
211 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
212 Args.hasArg(options::OPT_fprofile_generate) ||
213 Args.hasArg(options::OPT_fcreate_profile) ||
214 Args.hasArg(options::OPT_coverage)))
215 return;
216
217 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
218 // the link line. We cannot do the same thing because unlike gcov there is a
219 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
220 // not supported by old linkers.
Benjamin Kramerf2db04c2011-11-07 16:02:25 +0000221 std::string ProfileRT =
222 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000223
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000224 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000225}
226
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000227static bool forwardToGCC(const Option &O) {
Reid Kleckner4cd90df2013-06-19 15:09:06 +0000228 // Don't forward inputs from the original command line. They are added from
229 // InputInfoList.
Richard Smithe40bc4b2013-06-20 01:33:59 +0000230 return O.getKind() != Option::InputClass &&
Reid Kleckner4cd90df2013-06-19 15:09:06 +0000231 !O.hasFlag(options::NoForward) &&
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000232 !O.hasFlag(options::DriverOption) &&
233 !O.hasFlag(options::LinkerInput);
234}
235
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000236void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier9d718632013-01-24 19:14:47 +0000237 const JobAction &JA,
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000238 const Driver &D,
Douglas Gregordf91ef32009-04-18 00:34:01 +0000239 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000240 ArgStringList &CmdArgs,
241 const InputInfo &Output,
242 const InputInfoList &Inputs) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000243 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000244
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000245 CheckPreprocessingOptions(D, Args);
246
247 Args.AddLastArg(CmdArgs, options::OPT_C);
248 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000249
250 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000251 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000252 (A = Args.getLastArg(options::OPT_MD)) ||
253 (A = Args.getLastArg(options::OPT_MMD))) {
254 // Determine the output location.
255 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000256 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000257 DepFile = MF->getValue();
Chad Rosier9d718632013-01-24 19:14:47 +0000258 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000259 } else if (Output.getType() == types::TY_Dependencies) {
260 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000261 } else if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000263 DepFile = "-";
264 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +0000265 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000266 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000267 }
268 CmdArgs.push_back("-dependency-file");
269 CmdArgs.push_back(DepFile);
270
Chris Lattner3edbeb72010-03-29 17:55:58 +0000271 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000272 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
273 const char *DepTarget;
274
275 // If user provided -o, that is the dependency target, except
276 // when we are only generating a dependency file.
277 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
278 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000279 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000280 } else {
281 // Otherwise derive from the base input.
282 //
283 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000284 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000285 llvm::sys::path::replace_extension(P, "o");
286 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000287 }
288
289 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000290 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000291 QuoteTarget(DepTarget, Quoted);
292 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000293 }
294
Daniel Dunbarb827a052009-11-19 03:26:40 +0000295 if (A->getOption().matches(options::OPT_M) ||
296 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000297 CmdArgs.push_back("-sys-header-deps");
298 }
299
Peter Collingbournebb527862011-07-12 19:35:15 +0000300 if (Args.hasArg(options::OPT_MG)) {
301 if (!A || A->getOption().matches(options::OPT_MD) ||
302 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000303 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000304 CmdArgs.push_back("-MG");
305 }
306
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000307 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000308
309 // Convert all -MQ <target> args to -MT <quoted target>
310 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
311 options::OPT_MQ),
312 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000313 const Arg *A = *it;
314 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000315
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000316 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000317 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000318 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000319 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000320 CmdArgs.push_back(Args.MakeArgString(Quoted));
321
322 // -MT flag - no change
323 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000324 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000325 }
326 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000327
Douglas Gregordf91ef32009-04-18 00:34:01 +0000328 // Add -i* options, and automatically translate to
329 // -include-pch/-include-pth for transparent PCH support. It's
330 // wonky, but we include looking for .gch so we can support seamless
331 // replacement into a build system already set up to be generating
332 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000333 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000334 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
335 ie = Args.filtered_end(); it != ie; ++it) {
336 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000337
338 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000339 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
340 RenderedImplicitInclude = true;
341
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000342 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000343 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000344
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000345 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000346 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000347 SmallString<128> P(A->getValue());
348 // We want the files to have a name like foo.h.pch. Add a dummy extension
349 // so that replace_extension does the right thing.
350 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000351 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000352 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000353 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000354 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000355 }
356
Douglas Gregordf91ef32009-04-18 00:34:01 +0000357 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000358 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000359 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000360 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000361 }
362
Douglas Gregordf91ef32009-04-18 00:34:01 +0000363 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000364 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000365 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000366 FoundPCH = UsePCH;
367 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000368 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000369 }
370
371 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000372 if (IsFirstImplicitInclude) {
373 A->claim();
374 if (UsePCH)
375 CmdArgs.push_back("-include-pch");
376 else
377 CmdArgs.push_back("-include-pth");
378 CmdArgs.push_back(Args.MakeArgString(P.str()));
379 continue;
380 } else {
381 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000382 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000383 << P.str() << A->getAsString(Args);
384 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000385 }
386 }
387
388 // Not translated, render as usual.
389 A->claim();
390 A->render(Args, CmdArgs);
391 }
392
393 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000394 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
395 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000396
397 // Add -Wp, and -Xassembler if using the preprocessor.
398
399 // FIXME: There is a very unfortunate problem here, some troubled
400 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
401 // really support that we would have to parse and then translate
402 // those options. :(
403 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
404 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000405
406 // -I- is a deprecated GCC feature, reject it.
407 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000408 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000409
410 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
411 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000412 StringRef sysroot = C.getSysRoot();
413 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000414 if (!Args.hasArg(options::OPT_isysroot)) {
415 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000416 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000417 }
418 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000419
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000420 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000421 // FIXME: We should probably sink the logic for handling these from the
422 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000423 // CPATH - included following the user specified includes (but prior to
424 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000425 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000426 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000428 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000430 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000432 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000434
Chandler Carruth88491fc2011-11-04 07:12:53 +0000435 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000436 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000437 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000438
439 // Add system include arguments.
440 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000441}
442
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000443/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000444/// CPU.
445//
446// FIXME: This is redundant with -mcpu, why does LLVM use this.
447// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000448static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000449 return llvm::StringSwitch<const char *>(CPU)
Tim Northover4889a1f2013-06-13 15:02:46 +0000450 .Case("strongarm", "v4")
Chad Rosierae1aee62011-10-07 17:48:56 +0000451 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
452 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
453 .Cases("arm920", "arm920t", "arm922t", "v4t")
454 .Cases("arm940t", "ep9312","v4t")
455 .Cases("arm10tdmi", "arm1020t", "v5")
456 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
457 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
458 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
459 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
460 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
461 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonfc553452013-03-04 22:37:46 +0000462 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
463 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetab137512012-12-21 17:57:47 +0000464 .Case("cortex-r5", "v7r")
Bob Wilson57f6d192012-03-21 17:19:12 +0000465 .Case("cortex-m0", "v6m")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000466 .Case("cortex-m3", "v7m")
467 .Case("cortex-m4", "v7em")
Bob Wilson336bfa32012-09-29 23:52:50 +0000468 .Case("cortex-a9-mp", "v7f")
469 .Case("swift", "v7s")
Chad Rosierae1aee62011-10-07 17:48:56 +0000470 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000471}
472
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000473/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
474//
475// FIXME: tblgen this.
476static std::string getARMTargetCPU(const ArgList &Args,
477 const llvm::Triple &Triple) {
478 // FIXME: Warn on inconsistent use of -mcpu and -march.
479
480 // If we have -mcpu=, use that.
481 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000482 StringRef MCPU = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000483 // Handle -mcpu=native.
484 if (MCPU == "native")
485 return llvm::sys::getHostCPUName();
486 else
487 return MCPU;
488 }
489
490 StringRef MArch;
491 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
492 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smith1d489cf2012-11-01 04:30:05 +0000493 MArch = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000494 } else {
495 // Otherwise, use the Arch from the triple.
496 MArch = Triple.getArchName();
497 }
498
499 // Handle -march=native.
500 std::string NativeMArch;
501 if (MArch == "native") {
502 std::string CPU = llvm::sys::getHostCPUName();
503 if (CPU != "generic") {
504 // Translate the native cpu into the architecture. The switch below will
505 // then chose the minimum cpu for that arch.
506 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
507 MArch = NativeMArch;
508 }
509 }
510
511 return llvm::StringSwitch<const char *>(MArch)
512 .Cases("armv2", "armv2a","arm2")
513 .Case("armv3", "arm6")
514 .Case("armv3m", "arm7m")
Tim Northover4889a1f2013-06-13 15:02:46 +0000515 .Case("armv4", "strongarm")
516 .Case("armv4t", "arm7tdmi")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000517 .Cases("armv5", "armv5t", "arm10tdmi")
518 .Cases("armv5e", "armv5te", "arm1022e")
519 .Case("armv5tej", "arm926ej-s")
520 .Cases("armv6", "armv6k", "arm1136jf-s")
521 .Case("armv6j", "arm1136j-s")
522 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
523 .Case("armv6t2", "arm1156t2-s")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000524 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000525 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000526 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilson336bfa32012-09-29 23:52:50 +0000527 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
528 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000529 .Cases("armv7r", "armv7-r", "cortex-r4")
530 .Cases("armv7m", "armv7-m", "cortex-m3")
531 .Case("ep9312", "ep9312")
532 .Case("iwmmxt", "iwmmxt")
533 .Case("xscale", "xscale")
Tim Northover4889a1f2013-06-13 15:02:46 +0000534 // If all else failed, return the most base CPU with thumb interworking
535 // supported by LLVM.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000536 .Default("arm7tdmi");
537}
538
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000539// FIXME: Move to target hook.
540static bool isSignedCharDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return true;
544
Tim Northoverc264e162013-01-31 12:13:10 +0000545 case llvm::Triple::aarch64:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000546 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000547 case llvm::Triple::ppc:
548 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000549 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000550 return true;
551 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000552
553 case llvm::Triple::systemz:
554 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000555 }
556}
557
Chad Rosier99317272012-04-04 20:51:35 +0000558// Handle -mfpu=.
559//
560// FIXME: Centralize feature selection, defaulting shouldn't be also in the
561// frontend target.
562static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
563 ArgStringList &CmdArgs) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000564 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000565
566 // Set the target features based on the FPU.
567 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
568 // Disable any default FPU support.
569 CmdArgs.push_back("-target-feature");
570 CmdArgs.push_back("-vfp2");
571 CmdArgs.push_back("-target-feature");
572 CmdArgs.push_back("-vfp3");
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("-neon");
575 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+vfp3");
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("+d16");
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("-neon");
582 } else if (FPU == "vfp") {
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("+vfp2");
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("-neon");
587 } else if (FPU == "vfp3" || FPU == "vfpv3") {
588 CmdArgs.push_back("-target-feature");
589 CmdArgs.push_back("+vfp3");
590 CmdArgs.push_back("-target-feature");
591 CmdArgs.push_back("-neon");
592 } else if (FPU == "neon") {
593 CmdArgs.push_back("-target-feature");
594 CmdArgs.push_back("+neon");
595 } else
596 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
597}
598
Chad Rosier7a938fa2012-04-04 20:39:32 +0000599// Handle -mfpmath=.
600static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000601 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000602 StringRef FPMath = A->getValue();
Chad Rosier7a938fa2012-04-04 20:39:32 +0000603
604 // Set the target features based on the FPMath.
605 if (FPMath == "neon") {
606 CmdArgs.push_back("-target-feature");
607 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000608
Bob Wilsonfc553452013-03-04 22:37:46 +0000609 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
610 CPU != "cortex-a8" && CPU != "cortex-a9" &&
611 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000612 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
613
Chad Rosier7a938fa2012-04-04 20:39:32 +0000614 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
615 FPMath == "vfp4") {
616 CmdArgs.push_back("-target-feature");
617 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000618
619 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000620 } else
621 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
622}
623
Anton Korobeynikove2571792012-04-09 13:38:30 +0000624// Select the float ABI as determined by -msoft-float, -mhard-float, and
625// -mfloat-abi=.
626static StringRef getARMFloatABI(const Driver &D,
627 const ArgList &Args,
628 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000629 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000630 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
631 options::OPT_mhard_float,
632 options::OPT_mfloat_abi_EQ)) {
633 if (A->getOption().matches(options::OPT_msoft_float))
634 FloatABI = "soft";
635 else if (A->getOption().matches(options::OPT_mhard_float))
636 FloatABI = "hard";
637 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000638 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000639 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000640 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000641 << A->getAsString(Args);
642 FloatABI = "soft";
643 }
644 }
645 }
646
647 // If unspecified, choose the default based on the platform.
648 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000649 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000650 case llvm::Triple::Darwin:
651 case llvm::Triple::MacOSX:
652 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000653 // Darwin defaults to "softfp" for v6 and v7.
654 //
655 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000656 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000657 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000658 if (StringRef(ArchName).startswith("v6") ||
659 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000660 FloatABI = "softfp";
661 else
662 FloatABI = "soft";
663 break;
664 }
665
Rafael Espindola27fa2362012-12-13 04:17:14 +0000666 case llvm::Triple::FreeBSD:
667 // FreeBSD defaults to soft float
668 FloatABI = "soft";
669 break;
670
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000671 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000672 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000673 case llvm::Triple::GNUEABIHF:
674 FloatABI = "hard";
675 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000676 case llvm::Triple::GNUEABI:
677 FloatABI = "softfp";
678 break;
679 case llvm::Triple::EABI:
680 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
681 FloatABI = "softfp";
682 break;
Logan Chien94a71422012-09-02 09:30:11 +0000683 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000684 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000685 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000686 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000687 FloatABI = "softfp";
688 else
689 FloatABI = "soft";
690 break;
691 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000692 default:
693 // Assume "soft", but warn the user we are guessing.
694 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000695 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000696 break;
697 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000698 }
699 }
700
Anton Korobeynikove2571792012-04-09 13:38:30 +0000701 return FloatABI;
702}
703
704
705void Clang::AddARMTargetArgs(const ArgList &Args,
706 ArgStringList &CmdArgs,
707 bool KernelOrKext) const {
708 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000709 // Get the effective triple, which takes into account the deployment target.
710 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
711 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000712 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000713
714 // Select the ABI to use.
715 //
716 // FIXME: Support -meabi.
717 const char *ABIName = 0;
718 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000719 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000720 } else if (Triple.isOSDarwin()) {
721 // The backend is hardwired to assume AAPCS for M-class processors, ensure
722 // the frontend matches that.
723 if (StringRef(CPUName).startswith("cortex-m")) {
724 ABIName = "aapcs";
725 } else {
726 ABIName = "apcs-gnu";
727 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000728 } else {
729 // Select the default based on the platform.
730 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000731 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000732 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000733 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000734 ABIName = "aapcs-linux";
735 break;
736 case llvm::Triple::EABI:
737 ABIName = "aapcs";
738 break;
739 default:
740 ABIName = "apcs-gnu";
741 }
742 }
743 CmdArgs.push_back("-target-abi");
744 CmdArgs.push_back(ABIName);
745
746 // Set the CPU based on -march= and -mcpu=.
747 CmdArgs.push_back("-target-cpu");
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000748 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikove2571792012-04-09 13:38:30 +0000749
750 // Determine floating point ABI from the options & target defaults.
751 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000752 if (FloatABI == "soft") {
753 // Floating point operations and argument passing are soft.
754 //
755 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000756 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000757 CmdArgs.push_back("-mfloat-abi");
758 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000759 } else if (FloatABI == "softfp") {
760 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000761 CmdArgs.push_back("-mfloat-abi");
762 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000763 } else {
764 // Floating point operations and argument passing are hard.
765 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000766 CmdArgs.push_back("-mfloat-abi");
767 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000768 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000769
770 // Set appropriate target features for floating point mode.
771 //
772 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
773 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
774 // stripped out by the ARM target.
775
776 // Use software floating point operations?
777 if (FloatABI == "soft") {
778 CmdArgs.push_back("-target-feature");
779 CmdArgs.push_back("+soft-float");
780 }
781
782 // Use software floating point argument passing?
783 if (FloatABI != "hard") {
784 CmdArgs.push_back("-target-feature");
785 CmdArgs.push_back("+soft-float-abi");
786 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000787
788 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000789 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000790 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000791
Chad Rosier7a938fa2012-04-04 20:39:32 +0000792 // Honor -mfpmath=.
793 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000794 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000795
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000796 // Setting -msoft-float effectively disables NEON because of the GCC
797 // implementation, although the same isn't true of VFP or VFP3.
798 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000799 CmdArgs.push_back("-target-feature");
800 CmdArgs.push_back("-neon");
801 }
802
803 // Kernel code has more strict alignment requirements.
804 if (KernelOrKext) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000805 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
806 CmdArgs.push_back("-backend-option");
807 CmdArgs.push_back("-arm-long-calls");
808 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000809
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000810 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000811 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000812
813 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000814 CmdArgs.push_back("-backend-option");
815 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000816 }
Chad Rosier1b906052011-08-26 00:26:29 +0000817
818 // Setting -mno-global-merge disables the codegen global merge pass. Setting
819 // -mglobal-merge has no effect as the pass is enabled by default.
820 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
821 options::OPT_mno_global_merge)) {
822 if (A->getOption().matches(options::OPT_mno_global_merge))
823 CmdArgs.push_back("-mno-global-merge");
824 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000825
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000826 if (!Args.hasFlag(options::OPT_mimplicit_float,
827 options::OPT_mno_implicit_float,
828 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000829 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000830}
831
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000832// Translate MIPS CPU name alias option to CPU name.
833static StringRef getMipsCPUFromAlias(const Arg &A) {
834 if (A.getOption().matches(options::OPT_mips32))
835 return "mips32";
836 if (A.getOption().matches(options::OPT_mips32r2))
837 return "mips32r2";
838 if (A.getOption().matches(options::OPT_mips64))
839 return "mips64";
840 if (A.getOption().matches(options::OPT_mips64r2))
841 return "mips64r2";
842 llvm_unreachable("Unexpected option");
843 return "";
844}
845
Simon Atanasyana2768be2012-04-07 22:09:23 +0000846// Get CPU and ABI names. They are not independent
847// so we have to calculate them together.
848static void getMipsCPUAndABI(const ArgList &Args,
849 const ToolChain &TC,
850 StringRef &CPUName,
851 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000852 const char *DefMips32CPU = "mips32";
853 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000854
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000855 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000856 options::OPT_mcpu_EQ,
857 options::OPT_mips_CPUs_Group)) {
858 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
859 CPUName = getMipsCPUFromAlias(*A);
860 else
Richard Smith1d489cf2012-11-01 04:30:05 +0000861 CPUName = A->getValue();
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000862 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000863
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000864 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000865 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000866 // Convert a GNU style Mips ABI name to the name
867 // accepted by LLVM Mips backend.
868 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
869 .Case("32", "o32")
870 .Case("64", "n64")
871 .Default(ABIName);
872 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000873
874 // Setup default CPU and ABI names.
875 if (CPUName.empty() && ABIName.empty()) {
876 switch (TC.getTriple().getArch()) {
877 default:
878 llvm_unreachable("Unexpected triple arch name");
879 case llvm::Triple::mips:
880 case llvm::Triple::mipsel:
881 CPUName = DefMips32CPU;
882 break;
883 case llvm::Triple::mips64:
884 case llvm::Triple::mips64el:
885 CPUName = DefMips64CPU;
886 break;
887 }
888 }
889
890 if (!ABIName.empty()) {
891 // Deduce CPU name from ABI name.
892 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyane9616a42013-02-27 14:55:49 +0000893 .Cases("32", "o32", "eabi", DefMips32CPU)
894 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000895 .Default("");
896 }
897 else if (!CPUName.empty()) {
898 // Deduce ABI name from CPU name.
899 ABIName = llvm::StringSwitch<const char *>(CPUName)
900 .Cases("mips32", "mips32r2", "o32")
901 .Cases("mips64", "mips64r2", "n64")
902 .Default("");
903 }
904
905 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000906}
907
Simon Atanasyane9616a42013-02-27 14:55:49 +0000908// Convert ABI name to the GNU tools acceptable variant.
909static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
910 return llvm::StringSwitch<llvm::StringRef>(ABI)
911 .Case("o32", "32")
912 .Case("n64", "64")
913 .Default(ABI);
914}
915
Simon Atanasyan5e627792012-06-02 15:06:29 +0000916// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
917// and -mfloat-abi=.
918static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000919 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000920 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000921 options::OPT_mhard_float,
922 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000923 if (A->getOption().matches(options::OPT_msoft_float))
924 FloatABI = "soft";
925 else if (A->getOption().matches(options::OPT_mhard_float))
926 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000927 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000928 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +0000929 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000930 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000931 FloatABI = "hard";
932 }
933 }
Eric Christophered734732010-03-02 02:41:08 +0000934 }
935
936 // If unspecified, choose the default based on the platform.
937 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000938 // Assume "hard", because it's a default value used by gcc.
939 // When we start to recognize specific target MIPS processors,
940 // we will be able to select the default more correctly.
941 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000942 }
943
Simon Atanasyan5e627792012-06-02 15:06:29 +0000944 return FloatABI;
945}
946
Simon Atanasyandc536f52012-07-05 18:51:43 +0000947static void AddTargetFeature(const ArgList &Args,
948 ArgStringList &CmdArgs,
949 OptSpecifier OnOpt,
950 OptSpecifier OffOpt,
951 StringRef FeatureName) {
952 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
953 CmdArgs.push_back("-target-feature");
954 if (A->getOption().matches(OnOpt))
955 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
956 else
957 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
958 }
959}
960
Simon Atanasyan5e627792012-06-02 15:06:29 +0000961void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +0000962 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000963 const Driver &D = getToolChain().getDriver();
964 StringRef CPUName;
965 StringRef ABIName;
966 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
967
968 CmdArgs.push_back("-target-cpu");
969 CmdArgs.push_back(CPUName.data());
970
971 CmdArgs.push_back("-target-abi");
972 CmdArgs.push_back(ABIName.data());
973
974 StringRef FloatABI = getMipsFloatABI(D, Args);
975
Simon Atanasyane1d792f2013-01-10 12:36:19 +0000976 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
977
978 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +0000979 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000980 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000981 CmdArgs.push_back("-mfloat-abi");
982 CmdArgs.push_back("soft");
983
984 // FIXME: Note, this is a hack. We need to pass the selected float
985 // mode to the MipsTargetInfoBase to define appropriate macros there.
986 // Now it is the only method.
987 CmdArgs.push_back("-target-feature");
988 CmdArgs.push_back("+soft-float");
Simon Atanasyane1d792f2013-01-10 12:36:19 +0000989
990 if (FloatABI == "hard" && IsMips16) {
991 CmdArgs.push_back("-mllvm");
992 CmdArgs.push_back("-mips16-hard-float");
993 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000994 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000995 else {
996 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +0000997 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001000 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001001
Simon Atanasyan7c06cba2013-04-14 14:07:36 +00001002 AddTargetFeature(Args, CmdArgs,
1003 options::OPT_msingle_float, options::OPT_mdouble_float,
1004 "single-float");
Simon Atanasyandc536f52012-07-05 18:51:43 +00001005 AddTargetFeature(Args, CmdArgs,
1006 options::OPT_mips16, options::OPT_mno_mips16,
1007 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +00001008 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan321ae792013-04-14 14:07:51 +00001009 options::OPT_mmicromips, options::OPT_mno_micromips,
1010 "micromips");
1011 AddTargetFeature(Args, CmdArgs,
Simon Atanasyand797a852012-07-05 19:23:00 +00001012 options::OPT_mdsp, options::OPT_mno_dsp,
1013 "dsp");
1014 AddTargetFeature(Args, CmdArgs,
1015 options::OPT_mdspr2, options::OPT_mno_dspr2,
1016 "dspr2");
Simon Atanasyan9804b762012-08-27 20:55:56 +00001017
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001018 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1019 if (A->getOption().matches(options::OPT_mxgot)) {
1020 CmdArgs.push_back("-mllvm");
1021 CmdArgs.push_back("-mxgot");
1022 }
1023 }
1024
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001025 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1026 options::OPT_mno_ldc1_sdc1)) {
1027 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1028 CmdArgs.push_back("-mllvm");
1029 CmdArgs.push_back("-mno-ldc1-sdc1");
1030 }
1031 }
1032
Simon Atanasyan9804b762012-08-27 20:55:56 +00001033 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001034 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001035 CmdArgs.push_back("-mllvm");
1036 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1037 A->claim();
1038 }
Eric Christophered734732010-03-02 02:41:08 +00001039}
1040
Hal Finkel02a84272012-06-11 22:35:19 +00001041/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1042static std::string getPPCTargetCPU(const ArgList &Args) {
1043 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001044 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001045
1046 if (CPUName == "native") {
1047 std::string CPU = llvm::sys::getHostCPUName();
1048 if (!CPU.empty() && CPU != "generic")
1049 return CPU;
1050 else
1051 return "";
1052 }
1053
1054 return llvm::StringSwitch<const char *>(CPUName)
1055 .Case("common", "generic")
1056 .Case("440", "440")
1057 .Case("440fp", "440")
1058 .Case("450", "450")
1059 .Case("601", "601")
1060 .Case("602", "602")
1061 .Case("603", "603")
1062 .Case("603e", "603e")
1063 .Case("603ev", "603ev")
1064 .Case("604", "604")
1065 .Case("604e", "604e")
1066 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001067 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001068 .Case("G3", "g3")
1069 .Case("7400", "7400")
1070 .Case("G4", "g4")
1071 .Case("7450", "7450")
1072 .Case("G4+", "g4+")
1073 .Case("750", "750")
1074 .Case("970", "970")
1075 .Case("G5", "g5")
1076 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001077 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001078 .Case("e500mc", "e500mc")
1079 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001080 .Case("power3", "pwr3")
1081 .Case("power4", "pwr4")
1082 .Case("power5", "pwr5")
1083 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001084 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001085 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001086 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001087 .Case("pwr3", "pwr3")
1088 .Case("pwr4", "pwr4")
1089 .Case("pwr5", "pwr5")
1090 .Case("pwr5x", "pwr5x")
1091 .Case("pwr6", "pwr6")
1092 .Case("pwr6x", "pwr6x")
1093 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001094 .Case("powerpc", "ppc")
1095 .Case("powerpc64", "ppc64")
1096 .Default("");
1097 }
1098
1099 return "";
1100}
1101
1102void Clang::AddPPCTargetArgs(const ArgList &Args,
1103 ArgStringList &CmdArgs) const {
1104 std::string TargetCPUName = getPPCTargetCPU(Args);
1105
1106 // LLVM may default to generating code for the native CPU,
1107 // but, like gcc, we default to a more generic option for
1108 // each architecture. (except on Darwin)
1109 llvm::Triple Triple = getToolChain().getTriple();
1110 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1111 if (Triple.getArch() == llvm::Triple::ppc64)
1112 TargetCPUName = "ppc64";
1113 else
1114 TargetCPUName = "ppc";
1115 }
1116
1117 if (!TargetCPUName.empty()) {
1118 CmdArgs.push_back("-target-cpu");
1119 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1120 }
Bill Schmidt199402b2013-02-01 02:14:03 +00001121
1122 // Allow override of the Altivec feature.
Hal Finkelf4320ab2013-03-28 08:38:53 +00001123 AddTargetFeature(Args, CmdArgs,
1124 options::OPT_faltivec, options::OPT_fno_altivec,
1125 "altivec");
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001126
Hal Finkelfe6b2712013-03-30 13:47:44 +00001127 AddTargetFeature(Args, CmdArgs,
1128 options::OPT_mfprnd, options::OPT_mno_fprnd,
1129 "fprnd");
1130
Hal Finkelf4320ab2013-03-28 08:38:53 +00001131 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1132 AddTargetFeature(Args, CmdArgs,
1133 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1134 "mfocrf");
1135
Hal Finkel829d1872013-03-28 13:51:36 +00001136 AddTargetFeature(Args, CmdArgs,
1137 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1138 "popcntd");
1139
Hal Finkelf4320ab2013-03-28 08:38:53 +00001140 // It is really only possible to turn qpx off because turning qpx on is tied
1141 // to using the a2q CPU.
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001142 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1143 CmdArgs.push_back("-target-feature");
1144 CmdArgs.push_back("-qpx");
1145 }
Hal Finkel02a84272012-06-11 22:35:19 +00001146}
1147
Tom Stellarde25d2f62013-04-01 20:56:53 +00001148/// Get the (LLVM) name of the R600 gpu we are targeting.
1149static std::string getR600TargetGPU(const ArgList &Args) {
1150 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1151 std::string GPUName = A->getValue();
1152 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001153 .Cases("rv630", "rv635", "r600")
1154 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001155 .Case("rv740", "rv770")
1156 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001157 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001158 .Case("hemlock", "cypress")
1159 .Case("aruba", "cayman")
1160 .Default(GPUName.c_str());
1161 }
1162 return "";
1163}
1164
1165void Clang::AddR600TargetArgs(const ArgList &Args,
1166 ArgStringList &CmdArgs) const {
1167 std::string TargetGPUName = getR600TargetGPU(Args);
1168 CmdArgs.push_back("-target-cpu");
1169 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1170}
1171
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001172void Clang::AddSparcTargetArgs(const ArgList &Args,
1173 ArgStringList &CmdArgs) const {
1174 const Driver &D = getToolChain().getDriver();
1175
1176 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001177 CmdArgs.push_back("-target-cpu");
Richard Smith1d489cf2012-11-01 04:30:05 +00001178 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001179 }
1180
1181 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001182 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001183 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1184 options::OPT_mhard_float)) {
1185 if (A->getOption().matches(options::OPT_msoft_float))
1186 FloatABI = "soft";
1187 else if (A->getOption().matches(options::OPT_mhard_float))
1188 FloatABI = "hard";
1189 }
1190
1191 // If unspecified, choose the default based on the platform.
1192 if (FloatABI.empty()) {
1193 switch (getToolChain().getTriple().getOS()) {
1194 default:
1195 // Assume "soft", but warn the user we are guessing.
1196 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +00001197 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001198 break;
1199 }
1200 }
1201
1202 if (FloatABI == "soft") {
1203 // Floating point operations and argument passing are soft.
1204 //
1205 // FIXME: This changes CPP defines, we need -target-soft-float.
1206 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001207 CmdArgs.push_back("-target-feature");
1208 CmdArgs.push_back("+soft-float");
1209 } else {
1210 assert(FloatABI == "hard" && "Invalid float abi!");
1211 CmdArgs.push_back("-mhard-float");
1212 }
1213}
1214
Chandler Carruth700d4e42013-01-13 11:46:33 +00001215static const char *getX86TargetCPU(const ArgList &Args,
1216 const llvm::Triple &Triple) {
1217 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1218 if (StringRef(A->getValue()) != "native")
1219 return A->getValue();
1220
1221 // FIXME: Reject attempts to use -march=native unless the target matches
1222 // the host.
1223 //
1224 // FIXME: We should also incorporate the detected target features for use
1225 // with -native.
1226 std::string CPU = llvm::sys::getHostCPUName();
1227 if (!CPU.empty() && CPU != "generic")
1228 return Args.MakeArgString(CPU);
1229 }
1230
1231 // Select the default CPU if none was given (or detection failed).
1232
1233 if (Triple.getArch() != llvm::Triple::x86_64 &&
1234 Triple.getArch() != llvm::Triple::x86)
1235 return 0; // This routine is only handling x86 targets.
1236
1237 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1238
1239 // FIXME: Need target hooks.
1240 if (Triple.isOSDarwin())
1241 return Is64Bit ? "core2" : "yonah";
1242
1243 // Everything else goes to x86-64 in 64-bit mode.
1244 if (Is64Bit)
1245 return "x86-64";
1246
1247 if (Triple.getOSName().startswith("haiku"))
1248 return "i586";
1249 if (Triple.getOSName().startswith("openbsd"))
1250 return "i486";
1251 if (Triple.getOSName().startswith("bitrig"))
1252 return "i686";
1253 if (Triple.getOSName().startswith("freebsd"))
1254 return "i486";
1255 if (Triple.getOSName().startswith("netbsd"))
1256 return "i486";
1257 // All x86 devices running Android have core2 as their common
1258 // denominator. This makes a better choice than pentium4.
1259 if (Triple.getEnvironment() == llvm::Triple::Android)
1260 return "core2";
1261
1262 // Fallback to p4.
1263 return "pentium4";
1264}
1265
Daniel Dunbar6acda162009-09-09 22:33:08 +00001266void Clang::AddX86TargetArgs(const ArgList &Args,
1267 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001268 if (!Args.hasFlag(options::OPT_mred_zone,
1269 options::OPT_mno_red_zone,
1270 true) ||
1271 Args.hasArg(options::OPT_mkernel) ||
1272 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001273 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001274
Bob Wilsonf0c54562013-02-10 16:01:41 +00001275 // Default to avoid implicit floating-point for kernel/kext code, but allow
1276 // that to be overridden with -mno-soft-float.
1277 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1278 Args.hasArg(options::OPT_fapple_kext));
1279 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1280 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001281 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001282 options::OPT_mno_implicit_float)) {
1283 const Option &O = A->getOption();
1284 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1285 O.matches(options::OPT_msoft_float));
1286 }
1287 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001288 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001289
Chandler Carruth700d4e42013-01-13 11:46:33 +00001290 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbar38b48af2009-12-18 06:30:12 +00001291 CmdArgs.push_back("-target-cpu");
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001292 CmdArgs.push_back(CPUName);
1293 }
1294
Eli Friedmand18eeca2011-07-02 00:34:19 +00001295 // The required algorithm here is slightly strange: the options are applied
1296 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1297 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1298 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1299 // former correctly, but not the latter; handle directly-overridden
1300 // attributes here.
1301 llvm::StringMap<unsigned> PrevFeature;
1302 std::vector<const char*> Features;
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001303 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1304 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001305 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001306 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001307
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001308 // Skip over "-m".
Michael J. Spencerc6357102012-10-22 22:13:48 +00001309 assert(Name.startswith("m") && "Invalid feature name.");
1310 Name = Name.substr(1);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001311
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001312 bool IsNegative = Name.startswith("no-");
1313 if (IsNegative)
1314 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001315
Eli Friedmand18eeca2011-07-02 00:34:19 +00001316 unsigned& Prev = PrevFeature[Name];
1317 if (Prev)
1318 Features[Prev - 1] = 0;
1319 Prev = Features.size() + 1;
1320 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1321 }
1322 for (unsigned i = 0; i < Features.size(); i++) {
1323 if (Features[i]) {
1324 CmdArgs.push_back("-target-feature");
1325 CmdArgs.push_back(Features[i]);
1326 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001327 }
1328}
1329
Matthew Curtis33c95f12012-12-06 17:49:03 +00001330static inline bool HasPICArg(const ArgList &Args) {
1331 return Args.hasArg(options::OPT_fPIC)
1332 || Args.hasArg(options::OPT_fpic);
1333}
1334
1335static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1336 return Args.getLastArg(options::OPT_G,
1337 options::OPT_G_EQ,
1338 options::OPT_msmall_data_threshold_EQ);
1339}
1340
1341static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1342 std::string value;
1343 if (HasPICArg(Args))
1344 value = "0";
1345 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1346 value = A->getValue();
1347 A->claim();
1348 }
1349 return value;
1350}
1351
Tony Linthicum96319392011-12-12 21:14:55 +00001352void Clang::AddHexagonTargetArgs(const ArgList &Args,
1353 ArgStringList &CmdArgs) const {
1354 llvm::Triple Triple = getToolChain().getTriple();
1355
1356 CmdArgs.push_back("-target-cpu");
Matthew Curtis67814152012-12-06 14:16:43 +00001357 CmdArgs.push_back(Args.MakeArgString(
1358 "hexagon"
1359 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00001360 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001361 CmdArgs.push_back("-mqdsp6-compat");
1362 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001363
Matthew Curtis33c95f12012-12-06 17:49:03 +00001364 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1365 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001366 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001367 CmdArgs.push_back(Args.MakeArgString(
1368 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001369 }
1370
Sirish Pande5f9688b2012-05-10 20:19:54 +00001371 if (!Args.hasArg(options::OPT_fno_short_enums))
1372 CmdArgs.push_back("-fshort-enums");
1373 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1374 CmdArgs.push_back ("-mllvm");
1375 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1376 }
Tony Linthicum96319392011-12-12 21:14:55 +00001377 CmdArgs.push_back ("-mllvm");
1378 CmdArgs.push_back ("-machine-sink-split=0");
1379}
1380
Eric Christopher88b7cf02011-08-19 00:30:14 +00001381static bool
John McCall260611a2012-06-20 06:18:46 +00001382shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001383 const llvm::Triple &Triple) {
1384 // We use the zero-cost exception tables for Objective-C if the non-fragile
1385 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1386 // later.
John McCall260611a2012-06-20 06:18:46 +00001387 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001388 return true;
1389
Bob Wilson905c45f2011-10-14 05:03:44 +00001390 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001391 return false;
1392
Eric Christopheraa7333c2011-07-02 00:20:22 +00001393 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001394 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001395 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001396}
1397
Anders Carlsson15348ae2011-02-28 02:27:16 +00001398/// addExceptionArgs - Adds exception related arguments to the driver command
1399/// arguments. There's a master flag, -fexceptions and also language specific
1400/// flags to enable/disable C++ and Objective-C exceptions.
1401/// This makes it possible to for example disable C++ exceptions but enable
1402/// Objective-C exceptions.
1403static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1404 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001405 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001406 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001407 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001408 if (KernelOrKext) {
1409 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1410 // arguments now to avoid warnings about unused arguments.
1411 Args.ClaimAllArgs(options::OPT_fexceptions);
1412 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1413 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1414 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1415 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1416 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001417 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001418 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001419
1420 // Exceptions are enabled by default.
1421 bool ExceptionsEnabled = true;
1422
1423 // This keeps track of whether exceptions were explicitly turned on or off.
1424 bool DidHaveExplicitExceptionFlag = false;
1425
Rafael Espindolaf759df02009-10-01 13:33:33 +00001426 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1427 options::OPT_fno_exceptions)) {
1428 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001429 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001430 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001431 ExceptionsEnabled = false;
1432
1433 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001434 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001435
Anders Carlsson15348ae2011-02-28 02:27:16 +00001436 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001437
Anders Carlsson15348ae2011-02-28 02:27:16 +00001438 // Exception tables and cleanups can be enabled with -fexceptions even if the
1439 // language itself doesn't support exceptions.
1440 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1441 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001442
Daniel Dunbard47ea692011-03-17 23:28:31 +00001443 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1444 // is not necessarily sensible, but follows GCC.
1445 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001446 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001447 options::OPT_fno_objc_exceptions,
1448 true)) {
1449 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001450
Eric Christopher88b7cf02011-08-19 00:30:14 +00001451 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001452 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001453 }
1454
1455 if (types::isCXX(InputType)) {
1456 bool CXXExceptionsEnabled = ExceptionsEnabled;
1457
Eric Christopher88b7cf02011-08-19 00:30:14 +00001458 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1459 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001460 options::OPT_fexceptions,
1461 options::OPT_fno_exceptions)) {
1462 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1463 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001464 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001465 CXXExceptionsEnabled = false;
1466 }
1467
1468 if (CXXExceptionsEnabled) {
1469 CmdArgs.push_back("-fcxx-exceptions");
1470
1471 ShouldUseExceptionTables = true;
1472 }
1473 }
1474
1475 if (ShouldUseExceptionTables)
1476 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001477}
1478
Daniel Dunbarf4910132013-04-16 18:21:19 +00001479static bool ShouldDisableAutolink(const ArgList &Args,
1480 const ToolChain &TC) {
1481 bool Default = true;
1482 if (TC.getTriple().isOSDarwin()) {
1483 // The native darwin assembler doesn't support the linker_option directives,
1484 // so we disable them if we think the .s file will be passed to it.
1485 Default = TC.useIntegratedAs();
1486 }
1487 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1488 Default);
1489}
1490
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001491static bool ShouldDisableCFI(const ArgList &Args,
1492 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001493 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001494 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001495 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001496 // we disable them if we think the .s file will be passed to it.
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001497 Default = TC.useIntegratedAs();
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001498 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001499 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001500 options::OPT_fno_dwarf2_cfi_asm,
1501 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001502}
1503
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001504static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1505 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001506 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1507 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001508 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001509 return !UseDwarfDirectory;
1510}
1511
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001512/// \brief Check whether the given input tree contains any compilation actions.
1513static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001514 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001515 return true;
1516
1517 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1518 if (ContainsCompileAction(*it))
1519 return true;
1520
1521 return false;
1522}
1523
1524/// \brief Check if -relax-all should be passed to the internal assembler.
1525/// This is done by default when compiling non-assembler source with -O0.
1526static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1527 bool RelaxDefault = true;
1528
1529 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1530 RelaxDefault = A->getOption().matches(options::OPT_O0);
1531
1532 if (RelaxDefault) {
1533 RelaxDefault = false;
1534 for (ActionList::const_iterator it = C.getActions().begin(),
1535 ie = C.getActions().end(); it != ie; ++it) {
1536 if (ContainsCompileAction(*it)) {
1537 RelaxDefault = true;
1538 break;
1539 }
1540 }
1541 }
1542
1543 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1544 RelaxDefault);
1545}
1546
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00001547SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001548 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1549 AsanZeroBaseShadow(false) {
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001550 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1551 // at least once (possibly, disabled further).
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00001552 const Driver &D = TC.getDriver();
Richard Smithc4dabad2012-11-05 22:04:41 +00001553 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov3325b162012-11-28 17:34:24 +00001554 unsigned Add, Remove;
1555 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smithc4dabad2012-11-05 22:04:41 +00001556 continue;
Richard Smithc4dabad2012-11-05 22:04:41 +00001557 (*I)->claim();
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00001558 Kind |= Add;
1559 Kind &= ~Remove;
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001560 AllKinds |= Add;
Richard Smithc4dabad2012-11-05 22:04:41 +00001561 }
1562
Chad Rosier78d85b12013-01-29 23:31:22 +00001563 UbsanTrapOnError =
1564 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1565 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1566 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1567
1568 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1569 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1570 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1571 D.Diag(diag::err_drv_argument_not_allowed_with)
1572 << "-fcatch-undefined-behavior"
1573 << "-fno-sanitize-undefined-trap-on-error";
1574 }
1575
1576 // Warn about undefined sanitizer options that require runtime support.
1577 if (UbsanTrapOnError && notAllowedWithTrap()) {
1578 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1579 D.Diag(diag::err_drv_argument_not_allowed_with)
1580 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1581 << "-fcatch-undefined-behavior";
1582 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1583 options::OPT_fno_sanitize_undefined_trap_on_error,
1584 false))
1585 D.Diag(diag::err_drv_argument_not_allowed_with)
1586 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1587 << "-fsanitize-undefined-trap-on-error";
1588 }
1589
Richard Smithc4dabad2012-11-05 22:04:41 +00001590 // Only one runtime library can be used at once.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00001591 bool NeedsAsan = needsAsanRt();
1592 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001593 bool NeedsMsan = needsMsanRt();
Sergey Matveev050309f2013-05-27 11:17:01 +00001594 bool NeedsLsan = needsLeakDetection();
Richard Smith05650372012-12-01 01:02:45 +00001595 if (NeedsAsan && NeedsTsan)
Richard Smithc4dabad2012-11-05 22:04:41 +00001596 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith05650372012-12-01 01:02:45 +00001597 << lastArgumentForKind(D, Args, NeedsAsanRt)
1598 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001599 if (NeedsAsan && NeedsMsan)
1600 D.Diag(diag::err_drv_argument_not_allowed_with)
1601 << lastArgumentForKind(D, Args, NeedsAsanRt)
1602 << lastArgumentForKind(D, Args, NeedsMsanRt);
1603 if (NeedsTsan && NeedsMsan)
1604 D.Diag(diag::err_drv_argument_not_allowed_with)
1605 << lastArgumentForKind(D, Args, NeedsTsanRt)
1606 << lastArgumentForKind(D, Args, NeedsMsanRt);
Sergey Matveev050309f2013-05-27 11:17:01 +00001607 if (NeedsLsan && NeedsTsan)
1608 D.Diag(diag::err_drv_argument_not_allowed_with)
1609 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1610 << lastArgumentForKind(D, Args, NeedsTsanRt);
1611 if (NeedsLsan && NeedsMsan)
1612 D.Diag(diag::err_drv_argument_not_allowed_with)
1613 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1614 << lastArgumentForKind(D, Args, NeedsMsanRt);
1615 // FIXME: Currenly -fsanitize=leak is silently ignored in the presence of
1616 // -fsanitize=address. Perhaps it should print an error, or perhaps
1617 // -f(-no)sanitize=leak should change whether leak detection is enabled by
1618 // default in ASan?
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +00001619
1620 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001621 // explicitly contain -fsanitize=address (probably, turned off later in the
1622 // command line).
1623 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1624 D.Diag(diag::warn_drv_unused_sanitizer)
1625 << lastArgumentForKind(D, Args, AddressFull)
1626 << "-fsanitize=address";
Alexey Samsonov91ecfa62012-12-03 19:12:58 +00001627
1628 // Parse -f(no-)sanitize-blacklist options.
1629 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1630 options::OPT_fno_sanitize_blacklist)) {
1631 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1632 std::string BLPath = BLArg->getValue();
Rafael Espindola829e88d2013-06-25 14:48:00 +00001633 if (llvm::sys::fs::exists(BLPath))
Alexey Samsonov91ecfa62012-12-03 19:12:58 +00001634 BlacklistFile = BLPath;
1635 else
1636 D.Diag(diag::err_drv_no_such_file) << BLPath;
1637 }
Alexey Samsonov24697b02013-02-19 11:25:29 +00001638 } else {
1639 // If no -fsanitize-blacklist option is specified, try to look up for
1640 // blacklist in the resource directory.
1641 std::string BLPath;
Alexey Samsonov24697b02013-02-19 11:25:29 +00001642 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
Rafael Espindola829e88d2013-06-25 14:48:00 +00001643 llvm::sys::fs::exists(BLPath))
Alexey Samsonov24697b02013-02-19 11:25:29 +00001644 BlacklistFile = BLPath;
Alexey Samsonov91ecfa62012-12-03 19:12:58 +00001645 }
Evgeniy Stepanov34ef11b2012-12-24 08:42:34 +00001646
1647 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001648 if (NeedsMsan)
Evgeniy Stepanov34ef11b2012-12-24 08:42:34 +00001649 MsanTrackOrigins =
1650 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1651 options::OPT_fno_sanitize_memory_track_origins,
1652 /* Default */false);
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001653
1654 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov4a1ea522013-04-09 07:27:44 +00001655 if (NeedsAsan) {
1656 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1657 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001658 AsanZeroBaseShadow =
Alexey Samsonov4a1ea522013-04-09 07:27:44 +00001659 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1660 options::OPT_fno_sanitize_address_zero_base_shadow,
1661 ZeroBaseShadowDefault);
1662 // Zero-base shadow is a requirement on Android.
1663 if (IsAndroid && !AsanZeroBaseShadow) {
1664 D.Diag(diag::err_drv_argument_not_allowed_with)
1665 << "-fno-sanitize-address-zero-base-shadow"
1666 << lastArgumentForKind(D, Args, Address);
1667 }
1668 }
Richard Smithc4dabad2012-11-05 22:04:41 +00001669}
1670
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001671static void addProfileRTLinux(
1672 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1673 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1674 Args.hasArg(options::OPT_fprofile_generate) ||
1675 Args.hasArg(options::OPT_fcreate_profile) ||
1676 Args.hasArg(options::OPT_coverage)))
1677 return;
1678
1679 // The profile runtime is located in the Linux library directory and has name
1680 // "libclang_rt.profile-<ArchName>.a".
1681 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1682 llvm::sys::path::append(
1683 LibProfile, "lib", "linux",
1684 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1685
1686 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1687}
1688
Alexey Samsonov86143042013-02-27 11:14:55 +00001689static void addSanitizerRTLinkFlagsLinux(
1690 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smith76e6e132013-03-23 00:30:08 +00001691 const StringRef Sanitizer, bool BeforeLibStdCXX,
1692 bool ExportSymbols = true) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001693 // Sanitizer runtime is located in the Linux library directory and
1694 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1695 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1696 llvm::sys::path::append(
1697 LibSanitizer, "lib", "linux",
1698 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smith61a574f2013-03-20 23:49:07 +00001699
Alexey Samsonov86143042013-02-27 11:14:55 +00001700 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1701 // etc.) so that the linker picks custom versions of the global 'operator
1702 // new' and 'operator delete' symbols. We take the extreme (but simple)
1703 // strategy of inserting it at the front of the link command. It also
1704 // needs to be forced to end up in the executable, so wrap it in
1705 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001706 SmallVector<const char *, 3> LibSanitizerArgs;
1707 LibSanitizerArgs.push_back("-whole-archive");
1708 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1709 LibSanitizerArgs.push_back("-no-whole-archive");
1710
1711 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1712 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1713
Alexey Samsonov86143042013-02-27 11:14:55 +00001714 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov3a8aff92013-05-24 14:28:03 +00001715 CmdArgs.push_back("-lrt");
Alexey Samsonov86143042013-02-27 11:14:55 +00001716 CmdArgs.push_back("-ldl");
Richard Smith76e6e132013-03-23 00:30:08 +00001717
1718 // If possible, use a dynamic symbols file to export the symbols from the
1719 // runtime library. If we can't do so, use -export-dynamic instead to export
1720 // all symbols from the binary.
1721 if (ExportSymbols) {
1722 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1723 CmdArgs.push_back(
1724 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1725 else
1726 CmdArgs.push_back("-export-dynamic");
1727 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001728}
1729
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001730/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1731/// This needs to be called before we add the C run-time (malloc, etc).
1732static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001733 ArgStringList &CmdArgs) {
Logan Chien94a71422012-09-02 09:30:11 +00001734 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001735 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1736 llvm::sys::path::append(LibAsan, "lib", "linux",
1737 (Twine("libclang_rt.asan-") +
1738 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001739 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001740 } else {
Sergey Matveev050309f2013-05-27 11:17:01 +00001741 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001742 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001743 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001744}
1745
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001746/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1747/// This needs to be called before we add the C run-time (malloc, etc).
1748static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1749 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001750 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001751 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001752}
1753
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001754/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1755/// This needs to be called before we add the C run-time (malloc, etc).
1756static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1757 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001758 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001759 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00001760}
1761
1762/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1763/// This needs to be called before we add the C run-time (malloc, etc).
1764static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1765 ArgStringList &CmdArgs) {
1766 if (!Args.hasArg(options::OPT_shared))
1767 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001768}
1769
Richard Smith4def70d2012-10-09 19:52:38 +00001770/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1771/// (Linux).
1772static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001773 ArgStringList &CmdArgs, bool IsCXX,
1774 bool HasOtherSanitizerRt) {
1775 if (Args.hasArg(options::OPT_shared))
1776 return;
1777
1778 // Need a copy of sanitizer_common. This could come from another sanitizer
1779 // runtime; if we're not including one, include our own copy.
1780 if (!HasOtherSanitizerRt)
Richard Smith76e6e132013-03-23 00:30:08 +00001781 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smith61a574f2013-03-20 23:49:07 +00001782
Alexey Samsonov86143042013-02-27 11:14:55 +00001783 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smith61a574f2013-03-20 23:49:07 +00001784
1785 // Only include the bits of the runtime which need a C++ ABI library if
1786 // we're linking in C++ mode.
1787 if (IsCXX)
1788 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001789}
1790
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001791static bool shouldUseFramePointer(const ArgList &Args,
1792 const llvm::Triple &Triple) {
1793 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1794 options::OPT_fomit_frame_pointer))
1795 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1796
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001797 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001798 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1799 Triple.getArch() == llvm::Triple::x86) &&
1800 Triple.getOS() == llvm::Triple::Linux) {
1801 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1802 if (!A->getOption().matches(options::OPT_O0))
1803 return false;
1804 }
1805
1806 return true;
1807}
1808
Eric Christopherd3e22df2013-04-03 01:58:53 +00001809static bool shouldUseLeafFramePointer(const ArgList &Args,
1810 const llvm::Triple &Triple) {
1811 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1812 options::OPT_momit_leaf_frame_pointer))
1813 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1814
1815 // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
1816 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1817 Triple.getArch() == llvm::Triple::x86) &&
1818 Triple.getOS() == llvm::Triple::Linux) {
1819 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1820 if (!A->getOption().matches(options::OPT_O0))
1821 return false;
1822 }
1823
1824 return true;
1825}
1826
Chandler Carruthd566df62012-12-17 21:40:04 +00001827/// If the PWD environment variable is set, add a CC1 option to specify the
1828/// debug compilation directory.
1829static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001830 struct stat StatPWDBuf, StatDotBuf;
1831
Benjamin Kramer99d2eb42013-04-27 08:42:33 +00001832 const char *pwd = ::getenv("PWD");
1833 if (!pwd)
1834 return;
1835
1836 if (llvm::sys::path::is_absolute(pwd) &&
Chad Rosierb1c81222013-04-26 20:49:50 +00001837 stat(pwd, &StatPWDBuf) == 0 &&
1838 stat(".", &StatDotBuf) == 0 &&
1839 StatPWDBuf.st_ino == StatDotBuf.st_ino &&
1840 StatPWDBuf.st_dev == StatDotBuf.st_dev) {
1841 CmdArgs.push_back("-fdebug-compilation-dir");
1842 CmdArgs.push_back(Args.MakeArgString(pwd));
1843 return;
1844 }
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001845
Chad Rosierb1c81222013-04-26 20:49:50 +00001846 // Fall back to using getcwd.
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001847 SmallString<128> cwd;
1848 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001849 CmdArgs.push_back("-fdebug-compilation-dir");
1850 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00001851 }
1852}
1853
Eric Christopher80190392013-02-22 20:12:52 +00001854static const char *SplitDebugName(const ArgList &Args,
1855 const InputInfoList &Inputs) {
1856 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1857 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1858 SmallString<128> T(FinalOutput->getValue());
1859 llvm::sys::path::replace_extension(T, "dwo");
1860 return Args.MakeArgString(T);
1861 } else {
1862 // Use the compilation dir.
1863 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1864 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1865 llvm::sys::path::replace_extension(F, "dwo");
1866 T += F;
1867 return Args.MakeArgString(F);
1868 }
1869}
1870
1871static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1872 const Tool &T, const JobAction &JA,
1873 const ArgList &Args, const InputInfo &Output,
1874 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001875 ArgStringList ExtractArgs;
1876 ExtractArgs.push_back("--extract-dwo");
1877
1878 ArgStringList StripArgs;
1879 StripArgs.push_back("--strip-dwo");
1880
1881 // Grabbing the output of the earlier compile step.
1882 StripArgs.push_back(Output.getFilename());
1883 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001884 ExtractArgs.push_back(OutFile);
1885
1886 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001887 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001888
1889 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001890 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001891
1892 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001893 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001894}
1895
Chad Rosierb82e1172013-04-24 18:09:54 +00001896static bool isOptimizationLevelFast(const ArgList &Args) {
1897 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1898 if (A->getOption().matches(options::OPT_Ofast))
1899 return true;
1900 return false;
1901}
1902
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001903void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001904 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001905 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001906 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001907 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001908 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1909 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001910 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001911 ArgStringList CmdArgs;
1912
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001913 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1914
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001915 // Invoke ourselves in -cc1 mode.
1916 //
1917 // FIXME: Implement custom jobs for internal actions.
1918 CmdArgs.push_back("-cc1");
1919
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001920 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001921 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001922 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001923 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001924
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001925 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001926 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001927
Daniel Dunbar1d460332009-03-18 10:01:51 +00001928 if (isa<AnalyzeJobAction>(JA)) {
1929 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1930 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001931 } else if (isa<MigrateJobAction>(JA)) {
1932 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001933 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001934 if (Output.getType() == types::TY_Dependencies)
1935 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001936 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001937 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001938 if (Args.hasArg(options::OPT_rewrite_objc) &&
1939 !Args.hasArg(options::OPT_g_Group))
1940 CmdArgs.push_back("-P");
1941 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001942 } else if (isa<AssembleJobAction>(JA)) {
1943 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001944
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001945 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001946 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001947
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001948 // When using an integrated assembler, translate -Wa, and -Xassembler
1949 // options.
1950 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1951 options::OPT_Xassembler),
1952 ie = Args.filtered_end(); it != ie; ++it) {
1953 const Arg *A = *it;
1954 A->claim();
1955
1956 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001957 StringRef Value = A->getValue(i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001958
1959 if (Value == "-force_cpusubtype_ALL") {
1960 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001961 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001962 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001963 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001964 CmdArgs.push_back("-mllvm");
1965 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001966 } else if (Value == "--noexecstack") {
1967 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001968 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001969 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001970 << A->getOption().getName() << Value;
1971 }
1972 }
1973 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001974
1975 // Also ignore explicit -force_cpusubtype_ALL option.
1976 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001977 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001978 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001979 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001980
Aaron Ballman761322b2012-07-31 01:21:00 +00001981 if (JA.getType() == types::TY_Nothing)
1982 CmdArgs.push_back("-fsyntax-only");
1983 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001984 CmdArgs.push_back("-emit-pch");
1985 else
1986 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001987 } else {
1988 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001989
Daniel Dunbar1d460332009-03-18 10:01:51 +00001990 if (JA.getType() == types::TY_Nothing) {
1991 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001992 } else if (JA.getType() == types::TY_LLVM_IR ||
1993 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001994 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001995 } else if (JA.getType() == types::TY_LLVM_BC ||
1996 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001997 CmdArgs.push_back("-emit-llvm-bc");
1998 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001999 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002000 } else if (JA.getType() == types::TY_AST) {
2001 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002002 } else if (JA.getType() == types::TY_ModuleFile) {
2003 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002004 } else if (JA.getType() == types::TY_RewrittenObjC) {
2005 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002006 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002007 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2008 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002009 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002010 } else {
2011 assert(JA.getType() == types::TY_PP_Asm &&
2012 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002013 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002014 }
2015
Daniel Dunbar1d460332009-03-18 10:01:51 +00002016 // The make clang go fast button.
2017 CmdArgs.push_back("-disable-free");
2018
John McCallb689afb2010-02-13 03:50:24 +00002019 // Disable the verification pass in -asserts builds.
2020#ifdef NDEBUG
2021 CmdArgs.push_back("-disable-llvm-verifier");
2022#endif
2023
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002024 // Set the main file name, so that debug info works even with
2025 // -save-temps.
2026 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002027 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002028
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002029 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002030 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002031 if (Args.hasArg(options::OPT_static))
2032 CmdArgs.push_back("-static-define");
2033
Daniel Dunbar1d460332009-03-18 10:01:51 +00002034 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002035 // Enable region store model by default.
2036 CmdArgs.push_back("-analyzer-store=region");
2037
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002038 // Treat blocks as analysis entry points.
2039 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2040
Ted Kremenek51885072011-03-24 00:28:47 +00002041 CmdArgs.push_back("-analyzer-eagerly-assume");
2042
Daniel Dunbar1d460332009-03-18 10:01:51 +00002043 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002044 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002045 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002046
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002047 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2048 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002049
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002050 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002051 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002052
2053 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002054
Jordan Rosee449edc2013-04-05 17:55:07 +00002055 if (types::isCXX(Inputs[0].getType()))
2056 CmdArgs.push_back("-analyzer-checker=cplusplus");
2057
Ted Kremenek8dc05062012-01-26 02:27:38 +00002058 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00002059 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2060 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2061 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2062 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2063 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2064 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002065 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002066
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002067 // Set the output format. The default is plist, for (lame) historical
2068 // reasons.
2069 CmdArgs.push_back("-analyzer-output");
2070 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002071 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002072 else
2073 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002074
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002075 // Disable the presentation of standard compiler warnings when
2076 // using --analyze. We only want to show static analyzer diagnostics
2077 // or frontend errors.
2078 CmdArgs.push_back("-w");
2079
Daniel Dunbar1d460332009-03-18 10:01:51 +00002080 // Add -Xanalyzer arguments when running as analyzer.
2081 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002082 }
2083
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002084 CheckCodeGenerationOptions(D, Args);
2085
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002086 bool PIE = getToolChain().isPIEDefault();
2087 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002088 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002089
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002090 // For the PIC and PIE flag options, this logic is different from the
2091 // legacy logic in very old versions of GCC, as that logic was just
2092 // a bug no one had ever fixed. This logic is both more rational and
2093 // consistent with GCC's new logic now that the bugs are fixed. The last
2094 // argument relating to either PIC or PIE wins, and no other argument is
2095 // used. If the last argument is any flavor of the '-fno-...' arguments,
2096 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2097 // at the same level.
2098 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2099 options::OPT_fpic, options::OPT_fno_pic,
2100 options::OPT_fPIE, options::OPT_fno_PIE,
2101 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002102 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2103 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002104 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002105 if (LastPICArg) {
2106 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002107 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2108 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2109 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2110 PIC = PIE || O.matches(options::OPT_fPIC) ||
2111 O.matches(options::OPT_fpic);
2112 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2113 O.matches(options::OPT_fPIC);
2114 } else {
2115 PIE = PIC = false;
2116 }
2117 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002118 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002119
2120 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2121 // specified while enabling PIC enabled level 1 PIC, just force it back to
2122 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2123 // informal testing).
2124 if (PIC && getToolChain().getTriple().isOSDarwin())
2125 IsPICLevelTwo |= getToolChain().isPICDefault();
2126
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002127 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2128 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002129 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002130 if (KernelOrKext &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002131 (Triple.getOS() != llvm::Triple::IOS ||
2132 Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002133 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002134 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002135 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002136
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002137 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2138 // This is a very special mode. It trumps the other modes, almost no one
2139 // uses it, and it isn't even valid on any OS but Darwin.
2140 if (!getToolChain().getTriple().isOSDarwin())
2141 D.Diag(diag::err_drv_unsupported_opt_for_target)
2142 << A->getSpelling() << getToolChain().getTriple().str();
2143
2144 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2145
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002146 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002147 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002148
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002149 // Only a forced PIC mode can cause the actual compile to have PIC defines
2150 // etc., no flags are sufficient. This behavior was selected to closely
2151 // match that of llvm-gcc and Apple GCC before that.
2152 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2153 CmdArgs.push_back("-pic-level");
2154 CmdArgs.push_back("2");
2155 }
2156 } else {
2157 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2158 // handled in Clang's IRGen by the -pie-level flag.
2159 CmdArgs.push_back("-mrelocation-model");
2160 CmdArgs.push_back(PIC ? "pic" : "static");
2161
2162 if (PIC) {
2163 CmdArgs.push_back("-pic-level");
2164 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2165 if (PIE) {
2166 CmdArgs.push_back("-pie-level");
2167 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2168 }
2169 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002170 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002171
Tanya Lattner59876c22009-11-04 01:18:09 +00002172 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2173 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002174 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002175
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002176 // LLVM Code Generator Options.
2177
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002178 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2179 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002180 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002181 }
2182
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002183 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2184 options::OPT_freg_struct_return)) {
John McCallb8b52972013-06-18 02:46:29 +00002185 if (getToolChain().getTriple().getArch() != llvm::Triple::x86) {
2186 D.Diag(diag::err_drv_unsupported_opt_for_target)
2187 << A->getSpelling() << getToolChain().getTriple().str();
2188 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2189 CmdArgs.push_back("-fpcc-struct-return");
2190 } else {
2191 assert(A->getOption().matches(options::OPT_freg_struct_return));
2192 CmdArgs.push_back("-freg-struct-return");
2193 }
2194 }
2195
Roman Divackycfe9af22011-03-01 17:40:53 +00002196 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2197 CmdArgs.push_back("-mrtd");
2198
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002199 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002200 CmdArgs.push_back("-mdisable-fp-elim");
2201 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2202 options::OPT_fno_zero_initialized_in_bss))
2203 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002204
2205 bool OFastEnabled = isOptimizationLevelFast(Args);
2206 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2207 // enabled. This alias option is being used to simplify the hasFlag logic.
2208 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2209 options::OPT_fstrict_aliasing;
2210 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar398c6102011-02-04 02:20:39 +00002211 options::OPT_fno_strict_aliasing,
2212 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002213 CmdArgs.push_back("-relaxed-aliasing");
Manman Renb37a73d2013-04-04 21:53:22 +00002214 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2215 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002216 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2217 false))
2218 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002219 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2220 options::OPT_fno_optimize_sibling_calls))
2221 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002222
Eric Christopher31056272013-04-04 06:29:47 +00002223 // Handle segmented stacks.
2224 if (Args.hasArg(options::OPT_fsplit_stack))
2225 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002226
2227 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2228 // This alias option is being used to simplify the getLastArg logic.
2229 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2230 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002231
Chandler Carruthabf07a72012-01-02 14:19:45 +00002232 // Handle various floating point optimization flags, mapping them to the
2233 // appropriate LLVM code generation flags. The pattern for all of these is to
2234 // default off the codegen optimizations, and if any flag enables them and no
2235 // flag disables them after the flag enabling them, enable the codegen
2236 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002237 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002238 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002239 options::OPT_ffinite_math_only,
2240 options::OPT_fno_finite_math_only,
2241 options::OPT_fhonor_infinities,
2242 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002243 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2244 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002245 A->getOption().getID() != options::OPT_fhonor_infinities)
2246 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002247 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002248 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002249 options::OPT_ffinite_math_only,
2250 options::OPT_fno_finite_math_only,
2251 options::OPT_fhonor_nans,
2252 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002253 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2254 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002255 A->getOption().getID() != options::OPT_fhonor_nans)
2256 CmdArgs.push_back("-menable-no-nans");
2257
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002258 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2259 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002261 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002262 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002263 options::OPT_fno_math_errno)) {
2264 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2265 // However, turning *off* -ffast_math merely restores the toolchain default
2266 // (which may be false).
2267 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2268 A->getOption().getID() == options::OPT_ffast_math ||
2269 A->getOption().getID() == options::OPT_Ofast)
2270 MathErrno = false;
2271 else if (A->getOption().getID() == options::OPT_fmath_errno)
2272 MathErrno = true;
2273 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002274 if (MathErrno)
2275 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002276
2277 // There are several flags which require disabling very specific
2278 // optimizations. Any of these being disabled forces us to turn off the
2279 // entire set of LLVM optimizations, so collect them through all the flag
2280 // madness.
2281 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002282 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002283 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002284 options::OPT_funsafe_math_optimizations,
2285 options::OPT_fno_unsafe_math_optimizations,
2286 options::OPT_fassociative_math,
2287 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002288 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2289 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002290 A->getOption().getID() != options::OPT_fno_associative_math)
2291 AssociativeMath = true;
2292 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002293 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002294 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002295 options::OPT_funsafe_math_optimizations,
2296 options::OPT_fno_unsafe_math_optimizations,
2297 options::OPT_freciprocal_math,
2298 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002299 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2300 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002301 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2302 ReciprocalMath = true;
2303 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002304 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002305 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002306 options::OPT_funsafe_math_optimizations,
2307 options::OPT_fno_unsafe_math_optimizations,
2308 options::OPT_fsigned_zeros,
2309 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002310 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2311 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002312 A->getOption().getID() != options::OPT_fsigned_zeros)
2313 SignedZeros = false;
2314 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002315 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002316 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002317 options::OPT_funsafe_math_optimizations,
2318 options::OPT_fno_unsafe_math_optimizations,
2319 options::OPT_ftrapping_math,
2320 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002321 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2322 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002323 A->getOption().getID() != options::OPT_ftrapping_math)
2324 TrappingMath = false;
2325 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2326 !TrappingMath)
2327 CmdArgs.push_back("-menable-unsafe-fp-math");
2328
Lang Hamesc9686712012-07-06 00:59:19 +00002329
2330 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002331 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002332 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002333 options::OPT_ffp_contract)) {
2334 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002335 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002336 if (Val == "fast" || Val == "on" || Val == "off") {
2337 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2338 } else {
2339 D.Diag(diag::err_drv_unsupported_option_argument)
2340 << A->getOption().getName() << Val;
2341 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002342 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2343 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002344 // If fast-math is set then set the fp-contract mode to fast.
2345 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2346 }
2347 }
2348
Bob Wilson455e72e2012-07-19 03:52:53 +00002349 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2350 // and if we find them, tell the frontend to provide the appropriate
2351 // preprocessor macros. This is distinct from enabling any optimizations as
2352 // these options induce language changes which must survive serialization
2353 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002354 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2355 options::OPT_fno_fast_math))
2356 if (!A->getOption().matches(options::OPT_fno_fast_math))
2357 CmdArgs.push_back("-ffast-math");
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002358 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2359 if (A->getOption().matches(options::OPT_ffinite_math_only))
2360 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002361
Daniel Dunbar1b718482010-05-14 22:00:22 +00002362 // Decide whether to use verbose asm. Verbose assembly is the default on
2363 // toolchains which have the integrated assembler on by default.
2364 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2365 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002366 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002367 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002368 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002369
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002370 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2371 CmdArgs.push_back("-mdebug-pass");
2372 CmdArgs.push_back("Structure");
2373 }
2374 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2375 CmdArgs.push_back("-mdebug-pass");
2376 CmdArgs.push_back("Arguments");
2377 }
2378
John McCalld0c2ec42010-02-19 02:45:38 +00002379 // Enable -mconstructor-aliases except on darwin, where we have to
2380 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002381 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002382 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002383
John McCall32096692011-03-18 02:56:14 +00002384 // Darwin's kernel doesn't support guard variables; just die if we
2385 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002386 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002387 CmdArgs.push_back("-fforbid-guard-variables");
2388
Douglas Gregor6f755502011-02-01 15:15:22 +00002389 if (Args.hasArg(options::OPT_mms_bitfields)) {
2390 CmdArgs.push_back("-mms-bitfields");
2391 }
John McCalld0c2ec42010-02-19 02:45:38 +00002392
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002393 // This is a coarse approximation of what llvm-gcc actually does, both
2394 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2395 // complicated ways.
2396 bool AsynchronousUnwindTables =
2397 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2398 options::OPT_fno_asynchronous_unwind_tables,
2399 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002400 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002401 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2402 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002403 CmdArgs.push_back("-munwind-tables");
2404
Chandler Carrutha6b25812012-11-21 23:40:23 +00002405 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002406
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002407 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2408 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002409 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002410 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002411
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002412 // FIXME: Handle -mtune=.
2413 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002414
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002415 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002416 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002417 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002418 }
2419
Daniel Dunbar6acda162009-09-09 22:33:08 +00002420 // Add target specific cpu and features flags.
2421 switch(getToolChain().getTriple().getArch()) {
2422 default:
2423 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002424
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002425 case llvm::Triple::arm:
2426 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002427 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002428 break;
2429
Eric Christophered734732010-03-02 02:41:08 +00002430 case llvm::Triple::mips:
2431 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002432 case llvm::Triple::mips64:
2433 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002434 AddMIPSTargetArgs(Args, CmdArgs);
2435 break;
2436
Hal Finkel02a84272012-06-11 22:35:19 +00002437 case llvm::Triple::ppc:
2438 case llvm::Triple::ppc64:
2439 AddPPCTargetArgs(Args, CmdArgs);
2440 break;
2441
Tom Stellarde25d2f62013-04-01 20:56:53 +00002442 case llvm::Triple::r600:
2443 AddR600TargetArgs(Args, CmdArgs);
2444 break;
2445
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002446 case llvm::Triple::sparc:
2447 AddSparcTargetArgs(Args, CmdArgs);
2448 break;
2449
Daniel Dunbar6acda162009-09-09 22:33:08 +00002450 case llvm::Triple::x86:
2451 case llvm::Triple::x86_64:
2452 AddX86TargetArgs(Args, CmdArgs);
2453 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002454
2455 case llvm::Triple::hexagon:
2456 AddHexagonTargetArgs(Args, CmdArgs);
2457 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002458 }
2459
Tony Linthicum96319392011-12-12 21:14:55 +00002460
2461
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002462 // Pass the linker version in use.
2463 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2464 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002465 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002466 }
2467
Eric Christopherd3e22df2013-04-03 01:58:53 +00002468 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002469 CmdArgs.push_back("-momit-leaf-frame-pointer");
2470
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002471 // Explicitly error on some things we know we don't support and can't just
2472 // ignore.
2473 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002474 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2475 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002476 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002477 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00002478 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002479 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2480 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002481 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002482 << Unsupported->getOption().getName();
2483 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002484 }
2485
Daniel Dunbar1d460332009-03-18 10:01:51 +00002486 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002487 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002488 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002489 CmdArgs.push_back("-header-include-file");
2490 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2491 D.CCPrintHeadersFilename : "-");
2492 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002493 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002494 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002495
Chad Rosier2b819102011-08-02 17:58:04 +00002496 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002497 CmdArgs.push_back("-diagnostic-log-file");
2498 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2499 D.CCLogDiagnosticsFilename : "-");
2500 }
2501
Eric Christopherc706c8e2013-02-05 07:29:57 +00002502 // Use the last option from "-g" group. "-gline-tables-only"
2503 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002504 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002505 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002506 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002507 CmdArgs.push_back("-gline-tables-only");
Manman Renfc0f91c2013-06-19 01:46:49 +00002508 else if (A->getOption().matches(options::OPT_gdwarf_2))
2509 CmdArgs.push_back("-gdwarf-2");
2510 else if (A->getOption().matches(options::OPT_gdwarf_3))
2511 CmdArgs.push_back("-gdwarf-3");
2512 else if (A->getOption().matches(options::OPT_gdwarf_4))
2513 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002514 else if (!A->getOption().matches(options::OPT_g0) &&
2515 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00002516 CmdArgs.push_back("-g");
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002517 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002518
Alexey Samsonov7f326072012-06-21 08:22:39 +00002519 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2520 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002521 if (Args.hasArg(options::OPT_gcolumn_info))
2522 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002523
Eric Christopherc706c8e2013-02-05 07:29:57 +00002524 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2525 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002526 // FIXME: Currently only works on Linux.
2527 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2528 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002529 CmdArgs.push_back("-g");
2530 CmdArgs.push_back("-backend-option");
2531 CmdArgs.push_back("-split-dwarf=Enable");
2532 }
2533
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002534
2535 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2536
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002537 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2538 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2539
Chris Lattner7255a2d2010-06-22 00:03:40 +00002540 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2541
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002542 if (Args.hasArg(options::OPT_ftest_coverage) ||
2543 Args.hasArg(options::OPT_coverage))
2544 CmdArgs.push_back("-femit-coverage-notes");
2545 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2546 Args.hasArg(options::OPT_coverage))
2547 CmdArgs.push_back("-femit-coverage-data");
2548
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002549 if (C.getArgs().hasArg(options::OPT_c) ||
2550 C.getArgs().hasArg(options::OPT_S)) {
2551 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002552 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002553 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002554 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2555 if (const char *pwd = ::getenv("PWD")) {
2556 if (llvm::sys::path::is_absolute(pwd)) {
2557 SmallString<128> Pwd(pwd);
2558 llvm::sys::path::append(Pwd, CoverageFilename.str());
2559 CoverageFilename.swap(Pwd);
2560 }
2561 }
2562 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002563 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002564 }
2565 }
2566
Daniel Dunbara268fc02011-10-11 18:20:10 +00002567 // Pass options for controlling the default header search paths.
2568 if (Args.hasArg(options::OPT_nostdinc)) {
2569 CmdArgs.push_back("-nostdsysteminc");
2570 CmdArgs.push_back("-nobuiltininc");
2571 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002572 if (Args.hasArg(options::OPT_nostdlibinc))
2573 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002574 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2575 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2576 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002577
Daniel Dunbar5f122322009-12-15 01:02:52 +00002578 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002579 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002580 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002581
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002582 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2583
Ted Kremenek30660a82012-03-06 20:06:33 +00002584 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002585 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002586 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002587 options::OPT_ccc_arcmt_modify,
2588 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002589 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002590 switch (A->getOption().getID()) {
2591 default:
2592 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002593 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002594 CmdArgs.push_back("-arcmt-check");
2595 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002596 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002597 CmdArgs.push_back("-arcmt-modify");
2598 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002599 case options::OPT_ccc_arcmt_migrate:
2600 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002601 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002602 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002603
2604 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2605 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002606 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002607 }
2608 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00002609 } else {
2610 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2611 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2612 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00002613 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002614
Ted Kremenek30660a82012-03-06 20:06:33 +00002615 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2616 if (ARCMTEnabled) {
2617 D.Diag(diag::err_drv_argument_not_allowed_with)
2618 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2619 }
2620 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002621 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002622
2623 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2624 options::OPT_objcmt_migrate_subscripting)) {
2625 // None specified, means enable them all.
2626 CmdArgs.push_back("-objcmt-migrate-literals");
2627 CmdArgs.push_back("-objcmt-migrate-subscripting");
2628 } else {
2629 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2630 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2631 }
2632 }
2633
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002634 // Add preprocessing options like -I, -D, etc. if we are using the
2635 // preprocessor.
2636 //
2637 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002638 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002639 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002640
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002641 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2642 // that "The compiler can only warn and ignore the option if not recognized".
2643 // When building with ccache, it will pass -D options to clang even on
2644 // preprocessed inputs and configure concludes that -fPIC is not supported.
2645 Args.ClaimAllArgs(options::OPT_D);
2646
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002647 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002648 // others.
2649 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002650 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002651 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002652 else if (A->getOption().matches(options::OPT_O) &&
Richard Smith1d489cf2012-11-01 04:30:05 +00002653 A->getValue()[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002654 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002655 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002656 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002657 }
2658
Chad Rosierb2c08872012-12-12 20:06:31 +00002659 // Don't warn about unused -flto. This can happen when we're preprocessing or
2660 // precompiling.
2661 Args.ClaimAllArgs(options::OPT_flto);
2662
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002663 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002664 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2665 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002666 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002667 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002668
2669 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2670 // (-ansi is equivalent to -std=c89).
2671 //
2672 // If a std is supplied, only add -trigraphs if it follows the
2673 // option.
2674 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2675 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002676 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002677 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002678 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002679 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002680 else
2681 Std->render(Args, CmdArgs);
2682
Daniel Dunbar0e100312010-06-14 21:23:08 +00002683 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2684 options::OPT_trigraphs))
2685 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002686 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002687 } else {
2688 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002689 //
2690 // FIXME: Clang doesn't correctly handle -std= when the input language
2691 // doesn't match. For the time being just ignore this for C++ inputs;
2692 // eventually we want to do all the standard defaulting here instead of
2693 // splitting it between the driver and clang -cc1.
2694 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002695 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2696 "-std=", /*Joined=*/true);
2697 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2698 CmdArgs.push_back("-std=c++11");
2699
Daniel Dunbard573d262009-04-07 22:13:21 +00002700 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002701 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002702
Chandler Carruth50465d12011-04-23 06:30:43 +00002703 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2704 // '-fconst-strings'; this better indicates its actual behavior.
2705 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2706 false)) {
2707 // For perfect compatibility with GCC, we do this even in the presence of
2708 // '-w'. This flag names something other than a warning for GCC.
2709 CmdArgs.push_back("-fconst-strings");
2710 }
2711
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002712 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002713 // during C++ compilation, which it is by default. GCC keeps this define even
2714 // in the presence of '-w', match this behavior bug-for-bug.
2715 if (types::isCXX(InputType) &&
2716 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2717 true)) {
2718 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002719 }
2720
Chandler Carruthc304ba32010-05-22 02:21:53 +00002721 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2722 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2723 if (Asm->getOption().matches(options::OPT_fasm))
2724 CmdArgs.push_back("-fgnu-keywords");
2725 else
2726 CmdArgs.push_back("-fno-gnu-keywords");
2727 }
2728
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002729 if (ShouldDisableCFI(Args, getToolChain()))
2730 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002731
Nick Lewyckyea523d72011-10-17 23:05:52 +00002732 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2733 CmdArgs.push_back("-fno-dwarf-directory-asm");
2734
Daniel Dunbarf4910132013-04-16 18:21:19 +00002735 if (ShouldDisableAutolink(Args, getToolChain()))
2736 CmdArgs.push_back("-fno-autolink");
2737
Chandler Carruthd566df62012-12-17 21:40:04 +00002738 // Add in -fdebug-compilation-dir if necessary.
2739 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002740
Richard Smithc18c4232011-11-21 19:36:32 +00002741 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2742 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002743 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002744 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002745 }
2746
Richard Smithc18c4232011-11-21 19:36:32 +00002747 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2748 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002749 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002750 }
2751
Richard Smithe7565632013-05-08 02:12:03 +00002752 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2753 CmdArgs.push_back("-fconstexpr-steps");
2754 CmdArgs.push_back(A->getValue());
2755 }
2756
Richard Smith9e738cc2013-02-22 01:59:51 +00002757 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2758 CmdArgs.push_back("-fbracket-depth");
2759 CmdArgs.push_back(A->getValue());
2760 }
2761
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002762 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2763 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002764 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002765 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002766 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2767 } else
2768 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002769 }
2770
Nuno Lopesb3198a82012-05-08 22:10:46 +00002771
Michael J. Spencerc6357102012-10-22 22:13:48 +00002772 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002773 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002774
Daniel Dunbar294691e2009-11-04 06:24:38 +00002775 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2776 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002777 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002778 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002779
Chris Lattner124fca52010-01-09 21:54:33 +00002780 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2781 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002782 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002783 }
2784
Chris Lattner0f0c9632010-04-07 20:49:23 +00002785 CmdArgs.push_back("-ferror-limit");
2786 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002787 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002788 else
2789 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002790
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002791 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2792 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002793 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002794 }
2795
2796 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2797 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002798 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002799 }
2800
Richard Smith08d6e032011-12-16 19:06:07 +00002801 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2802 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002803 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002804 }
2805
Daniel Dunbar55efe142009-11-04 06:24:47 +00002806 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002807 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002808 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002809 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002810 } else {
2811 // If -fmessage-length=N was not specified, determine whether this is a
2812 // terminal and, if so, implicitly define -fmessage-length appropriately.
2813 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002814 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002815 }
2816
John McCalla880b192013-02-19 01:57:35 +00002817 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2818 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2819 options::OPT_fvisibility_ms_compat)) {
2820 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2821 CmdArgs.push_back("-fvisibility");
2822 CmdArgs.push_back(A->getValue());
2823 } else {
2824 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2825 CmdArgs.push_back("-fvisibility");
2826 CmdArgs.push_back("hidden");
2827 CmdArgs.push_back("-ftype-visibility");
2828 CmdArgs.push_back("default");
2829 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002830 }
2831
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002832 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002833
Hans Wennborgde981f32012-06-28 08:01:44 +00002834 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2835
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002836 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002837 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2838 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002839 CmdArgs.push_back("-ffreestanding");
2840
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002841 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002842 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002843 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002844 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002845 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002846 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002847 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002848 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2849 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002850
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002851 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00002852 Sanitize.addArgs(Args, CmdArgs);
2853
Will Dietz2d382d12012-12-30 20:53:28 +00002854 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2855 options::OPT_fno_sanitize_recover,
2856 true))
2857 CmdArgs.push_back("-fno-sanitize-recover");
2858
Chad Rosier78d85b12013-01-29 23:31:22 +00002859 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2860 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2861 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2862 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2863
Eric Christopher98654c92013-02-19 06:16:53 +00002864 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002865 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2866 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2867 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2868 D.Diag(diag::err_drv_argument_only_allowed_with)
2869 << A->getAsString(Args) << "ppc/ppc64";
2870
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002871 if (getToolChain().SupportsProfiling())
2872 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002873
2874 // -flax-vector-conversions is default.
2875 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2876 options::OPT_fno_lax_vector_conversions))
2877 CmdArgs.push_back("-fno-lax-vector-conversions");
2878
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002879 if (Args.getLastArg(options::OPT_fapple_kext))
2880 CmdArgs.push_back("-fapple-kext");
2881
David Blaikie940152f2012-06-14 18:55:27 +00002882 if (Args.hasFlag(options::OPT_frewrite_includes,
2883 options::OPT_fno_rewrite_includes, false))
2884 CmdArgs.push_back("-frewrite-includes");
2885
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002886 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002887 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002888 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002889 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2890 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002891
2892 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2893 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002894 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002895 }
2896
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002897 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002898
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002899 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2900 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2901 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2902 options::OPT_fno_wrapv)) {
2903 if (A->getOption().matches(options::OPT_fwrapv))
2904 CmdArgs.push_back("-fwrapv");
2905 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2906 options::OPT_fno_strict_overflow)) {
2907 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2908 CmdArgs.push_back("-fwrapv");
2909 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002910 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002911 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002912
Daniel Dunbar5345c392009-09-03 04:54:28 +00002913 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2914
Mahesha Sf3b52312012-10-27 07:47:56 +00002915
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002916 // -stack-protector=0 is default.
2917 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002918 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2919 options::OPT_fstack_protector_all,
2920 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002921 if (A->getOption().matches(options::OPT_fstack_protector))
2922 StackProtectorLevel = 1;
2923 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2924 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002925 } else {
2926 StackProtectorLevel =
2927 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2928 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002929 if (StackProtectorLevel) {
2930 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002931 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002932 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002933
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002934 // --param ssp-buffer-size=
2935 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2936 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002937 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002938 if (Str.startswith("ssp-buffer-size=")) {
2939 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002940 CmdArgs.push_back("-stack-protector-buffer-size");
2941 // FIXME: Verify the argument is a valid integer.
2942 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002943 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002944 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002945 }
Bill Wendling45483f72009-06-28 07:36:13 +00002946 }
2947
Nick Lewycky4e785c92011-12-06 03:33:03 +00002948 // Translate -mstackrealign
2949 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2950 false)) {
2951 CmdArgs.push_back("-backend-option");
2952 CmdArgs.push_back("-force-align-stack");
2953 }
2954 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2955 false)) {
2956 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2957 }
2958
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002959 if (Args.hasArg(options::OPT_mstack_alignment)) {
2960 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2961 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002962 }
Chad Rosier586a0612012-11-29 00:42:06 +00002963 // -mkernel implies -mstrict-align; don't add the redundant option.
2964 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosier485577d2012-11-09 18:27:01 +00002965 CmdArgs.push_back("-backend-option");
2966 CmdArgs.push_back("-arm-strict-align");
Chad Rosier7e293272012-11-09 17:29:19 +00002967 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002968
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002969 // Forward -f options with positive and negative forms; we translate
2970 // these by hand.
2971
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002972 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002973 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002974 CmdArgs.push_back("-fapple-kext");
2975 if (!Args.hasArg(options::OPT_fbuiltin))
2976 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002977 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002978 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002979 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002980 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002981 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002982
Nuno Lopesfc284482009-12-16 16:59:22 +00002983 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2984 options::OPT_fno_assume_sane_operator_new))
2985 CmdArgs.push_back("-fno-assume-sane-operator-new");
2986
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002987 // -fblocks=0 is default.
2988 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002989 getToolChain().IsBlocksDefault()) ||
2990 (Args.hasArg(options::OPT_fgnu_runtime) &&
2991 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2992 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002993 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002994
2995 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2996 !getToolChain().hasBlocksRuntime())
2997 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002998 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002999
Douglas Gregor64554ba2012-01-18 15:19:58 +00003000 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3001 // users must also pass -fcxx-modules. The latter flag will disappear once the
3002 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003003 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003004 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3005 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3006 options::OPT_fno_cxx_modules,
3007 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003008 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003009 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003010 HaveModules = true;
3011 }
3012 }
3013
Douglas Gregor953a61f2013-02-07 19:01:24 +00003014 // If a module path was provided, pass it along. Otherwise, use a temporary
3015 // directory.
3016 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3017 A->claim();
3018 if (HaveModules) {
3019 A->render(Args, CmdArgs);
3020 }
3021 } else if (HaveModules) {
3022 SmallString<128> DefaultModuleCache;
3023 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3024 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00003025 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3026 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00003027 const char Arg[] = "-fmodules-cache-path=";
3028 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3029 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00003030 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3031 }
3032
3033 // Pass through all -fmodules-ignore-macro arguments.
3034 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003035 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3036 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003037
John McCall32579cf2010-04-09 19:12:06 +00003038 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003039 if (Args.hasFlag(options::OPT_fno_access_control,
3040 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003041 false))
John McCall7002f4c2010-04-09 19:03:51 +00003042 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003043
Anders Carlssona4c24752010-11-21 00:09:52 +00003044 // -felide-constructors is the default.
3045 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3046 options::OPT_felide_constructors,
3047 false))
3048 CmdArgs.push_back("-fno-elide-constructors");
3049
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003050 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003051 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003052 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003053 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003054
Richard Smithc4dabad2012-11-05 22:04:41 +00003055 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003056 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003057 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003058 Args.getLastArg(options::OPT_mkernel,
3059 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003060 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003061 D.Diag(diag::err_drv_argument_not_allowed_with)
3062 << "-fsanitize=vptr" << NoRttiArg;
3063 }
3064 }
3065
Tony Linthicum96319392011-12-12 21:14:55 +00003066 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003067 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003068 options::OPT_fno_short_enums,
3069 getToolChain().getTriple().getArch() ==
3070 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003071 CmdArgs.push_back("-fshort-enums");
3072
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003073 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003074 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003075 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003076 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003077
Anders Carlssona508b7d2010-02-06 23:23:06 +00003078 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003079 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003080 options::OPT_fno_threadsafe_statics))
3081 CmdArgs.push_back("-fno-threadsafe-statics");
3082
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003083 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003084 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3085 options::OPT_fno_use_cxa_atexit,
3086 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00003087 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00003088 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
3089 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003090 CmdArgs.push_back("-fno-use-cxa-atexit");
3091
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003092 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003093 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003094 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3095 CmdArgs.push_back("-fms-extensions");
3096
Francois Pichetae556082011-09-17 04:32:15 +00003097 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003098 if (Args.hasFlag(options::OPT_fms_compatibility,
3099 options::OPT_fno_ms_compatibility,
3100 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3101 Args.hasFlag(options::OPT_fms_extensions,
3102 options::OPT_fno_ms_extensions,
3103 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003104 CmdArgs.push_back("-fms-compatibility");
3105
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003106 // -fmsc-version=1300 is default.
3107 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3108 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3109 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003110 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003111 if (msc_ver.empty())
3112 CmdArgs.push_back("-fmsc-version=1300");
3113 else
3114 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3115 }
3116
3117
Eric Christophercfc01e42013-02-18 00:38:31 +00003118 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003119 if (Args.hasFlag(options::OPT_fborland_extensions,
3120 options::OPT_fno_borland_extensions, false))
3121 CmdArgs.push_back("-fborland-extensions");
3122
Francois Pichet8efcc012011-09-01 16:38:08 +00003123 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3124 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003125 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3126 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003127 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003128 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003129
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003130 // -fgnu-keywords default varies depending on language; only pass if
3131 // specified.
3132 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003133 options::OPT_fno_gnu_keywords))
3134 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003135
Rafael Espindola01ba8542011-06-02 17:30:53 +00003136 if (Args.hasFlag(options::OPT_fgnu89_inline,
3137 options::OPT_fno_gnu89_inline,
3138 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003139 CmdArgs.push_back("-fgnu89-inline");
3140
Chad Rosierfc055f92012-03-15 22:31:42 +00003141 if (Args.hasArg(options::OPT_fno_inline))
3142 CmdArgs.push_back("-fno-inline");
3143
Chad Rosier634a4b12012-03-06 21:17:19 +00003144 if (Args.hasArg(options::OPT_fno_inline_functions))
3145 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003146
John McCall260611a2012-06-20 06:18:46 +00003147 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003148
John McCall260611a2012-06-20 06:18:46 +00003149 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3150 // legacy is the default.
3151 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003152 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3153 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003154 objcRuntime.isLegacyDispatchDefaultForArch(
3155 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003156 if (getToolChain().UseObjCMixedDispatch())
3157 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3158 else
3159 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3160 }
3161 }
3162
Nico Weberdf423542012-03-09 21:19:44 +00003163 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3164 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00003165 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003166 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3167 }
3168
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003169 // -fencode-extended-block-signature=1 is default.
3170 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3171 CmdArgs.push_back("-fencode-extended-block-signature");
3172 }
3173
John McCall9f084a32011-07-06 00:26:06 +00003174 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3175 // NOTE: This logic is duplicated in ToolChains.cpp.
3176 bool ARC = isObjCAutoRefCount(Args);
3177 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003178 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003179
John McCall9f084a32011-07-06 00:26:06 +00003180 CmdArgs.push_back("-fobjc-arc");
3181
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003182 // FIXME: It seems like this entire block, and several around it should be
3183 // wrapped in isObjC, but for now we just use it here as this is where it
3184 // was being used previously.
3185 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3186 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3187 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3188 else
3189 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3190 }
3191
John McCall9f084a32011-07-06 00:26:06 +00003192 // Allow the user to enable full exceptions code emission.
3193 // We define off for Objective-CC, on for Objective-C++.
3194 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3195 options::OPT_fno_objc_arc_exceptions,
3196 /*default*/ types::isCXX(InputType)))
3197 CmdArgs.push_back("-fobjc-arc-exceptions");
3198 }
3199
3200 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3201 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003202 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003203 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003204
John McCall9f084a32011-07-06 00:26:06 +00003205 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3206 // takes precedence.
3207 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3208 if (!GCArg)
3209 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3210 if (GCArg) {
3211 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003212 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003213 << GCArg->getAsString(Args);
3214 } else if (getToolChain().SupportsObjCGC()) {
3215 GCArg->render(Args, CmdArgs);
3216 } else {
3217 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003218 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003219 << GCArg->getAsString(Args);
3220 }
3221 }
3222
John McCalld71315c2011-06-22 00:53:57 +00003223 // Add exception args.
3224 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003225 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003226
3227 if (getToolChain().UseSjLjExceptions())
3228 CmdArgs.push_back("-fsjlj-exceptions");
3229
3230 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003231 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3232 options::OPT_fno_assume_sane_operator_new))
3233 CmdArgs.push_back("-fno-assume-sane-operator-new");
3234
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003235 // -fconstant-cfstrings is default, and may be subject to argument translation
3236 // on Darwin.
3237 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3238 options::OPT_fno_constant_cfstrings) ||
3239 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3240 options::OPT_mno_constant_cfstrings))
3241 CmdArgs.push_back("-fno-constant-cfstrings");
3242
John Thompsona6fda122009-11-05 20:14:16 +00003243 // -fshort-wchar default varies depending on platform; only
3244 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003245 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3246 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003247
Daniel Dunbaree848a72009-10-29 02:39:57 +00003248 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3249 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00003250 //
3251 // FIXME: This is gross; that translation should be pulled from the
3252 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003253 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003254 options::OPT_fno_pascal_strings,
3255 false) ||
3256 Args.hasFlag(options::OPT_mpascal_strings,
3257 options::OPT_mno_pascal_strings,
3258 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003259 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003260
Daniel Dunbar88934e82011-10-05 21:04:55 +00003261 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3262 // -fno-pack-struct doesn't apply to -fpack-struct=.
3263 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003264 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003265 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003266 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003267 } else if (Args.hasFlag(options::OPT_fpack_struct,
3268 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003269 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003270 }
3271
Eric Christopher6c7db892013-02-18 01:16:37 +00003272 if (KernelOrKext) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003273 if (!Args.hasArg(options::OPT_fcommon))
3274 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003275 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003276 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003277
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003278 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003279 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003280 CmdArgs.push_back("-fno-common");
3281
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003282 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003283 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003284 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003285 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003286 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003287 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3288
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003289 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3290 if (!Args.hasFlag(options::OPT_ffor_scope,
3291 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003292 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003293 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3294
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003295 // -fcaret-diagnostics is default.
3296 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3297 options::OPT_fno_caret_diagnostics, true))
3298 CmdArgs.push_back("-fno-caret-diagnostics");
3299
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003300 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003301 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003302 options::OPT_fno_diagnostics_fixit_info))
3303 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003304
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003305 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003306 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003307 options::OPT_fno_diagnostics_show_option))
3308 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003309
Chris Lattner6fbe8392010-05-04 21:55:25 +00003310 if (const Arg *A =
3311 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3312 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003313 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003314 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003315
Douglas Gregorc9471b02011-05-21 17:07:29 +00003316 if (const Arg *A =
3317 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3318 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003319 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003320 }
3321
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003322 if (Arg *A = Args.getLastArg(
3323 options::OPT_fdiagnostics_show_note_include_stack,
3324 options::OPT_fno_diagnostics_show_note_include_stack)) {
3325 if (A->getOption().matches(
3326 options::OPT_fdiagnostics_show_note_include_stack))
3327 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3328 else
3329 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3330 }
3331
Daniel Dunbar838be482009-11-04 06:24:57 +00003332 // Color diagnostics are the default, unless the terminal doesn't support
3333 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003334 // Support both clang's -f[no-]color-diagnostics and gcc's
3335 // -f[no-]diagnostics-colors[=never|always|auto].
3336 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3337 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3338 it != ie; ++it) {
3339 const Option &O = (*it)->getOption();
3340 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3341 !O.matches(options::OPT_fdiagnostics_color) &&
3342 !O.matches(options::OPT_fno_color_diagnostics) &&
3343 !O.matches(options::OPT_fno_diagnostics_color) &&
3344 !O.matches(options::OPT_fdiagnostics_color_EQ))
3345 continue;
3346
3347 (*it)->claim();
3348 if (O.matches(options::OPT_fcolor_diagnostics) ||
3349 O.matches(options::OPT_fdiagnostics_color)) {
3350 ShowColors = Colors_On;
3351 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3352 O.matches(options::OPT_fno_diagnostics_color)) {
3353 ShowColors = Colors_Off;
3354 } else {
3355 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3356 StringRef value((*it)->getValue());
3357 if (value == "always")
3358 ShowColors = Colors_On;
3359 else if (value == "never")
3360 ShowColors = Colors_Off;
3361 else if (value == "auto")
3362 ShowColors = Colors_Auto;
3363 else
3364 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3365 << ("-fdiagnostics-color=" + value).str();
3366 }
3367 }
3368 if (ShowColors == Colors_On ||
3369 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003370 CmdArgs.push_back("-fcolor-diagnostics");
3371
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003372 if (!Args.hasFlag(options::OPT_fshow_source_location,
3373 options::OPT_fno_show_source_location))
3374 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003375
Douglas Gregorc9471b02011-05-21 17:07:29 +00003376 if (!Args.hasFlag(options::OPT_fshow_column,
3377 options::OPT_fno_show_column,
3378 true))
3379 CmdArgs.push_back("-fno-show-column");
3380
Douglas Gregora0068fc2010-07-09 17:35:33 +00003381 if (!Args.hasFlag(options::OPT_fspell_checking,
3382 options::OPT_fno_spell_checking))
3383 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003384
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003385
Chad Rosier15490fd2012-12-05 21:08:21 +00003386 // -fno-asm-blocks is default.
3387 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3388 false))
3389 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003390
Chad Rosier31422792013-04-24 18:29:59 +00003391 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3392 // This alias option is being used to simplify the hasFlag logic.
3393 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3394 options::OPT_fvectorize;
3395
Nadav Rotem0f6ef282012-12-18 23:10:16 +00003396 // -fvectorize is default.
Chad Rosier31422792013-04-24 18:29:59 +00003397 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003398 options::OPT_fno_vectorize, true))
Chad Rosierc04d0932012-12-11 17:12:28 +00003399 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00003400
Hal Finkel443c9992012-12-11 19:59:32 +00003401 // -fno-slp-vectorize is default.
3402 if (Args.hasFlag(options::OPT_fslp_vectorize,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003403 options::OPT_fno_slp_vectorize, false))
Nadav Rotem50ea9632013-04-15 04:57:18 +00003404 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003405
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003406 // -fno-slp-vectorize-aggressive is default.
3407 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003408 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003409 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003410
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003411 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3412 A->render(Args, CmdArgs);
3413
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003414 // -fdollars-in-identifiers default varies depending on platform and
3415 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003416 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003417 options::OPT_fno_dollars_in_identifiers)) {
3418 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003419 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003420 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003421 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003422 }
3423
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003424 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3425 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003426 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003427 options::OPT_fno_unit_at_a_time)) {
3428 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003429 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003430 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003431
Eli Friedman19bda3a2011-11-02 01:53:16 +00003432 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3433 options::OPT_fno_apple_pragma_pack, false))
3434 CmdArgs.push_back("-fapple-pragma-pack");
3435
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003436 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003437 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003438 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003439#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003440 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003441 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3442 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3443 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3444 CmdArgs.push_back("-fno-builtin-strcat");
3445 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3446 CmdArgs.push_back("-fno-builtin-strcpy");
3447 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003448#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003449
Daniel Dunbard98750f2011-03-18 21:23:40 +00003450 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003451 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003452 options::OPT_traditional_cpp)) {
3453 if (isa<PreprocessJobAction>(JA))
3454 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003455 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003456 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003457 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003458
Daniel Dunbar1d460332009-03-18 10:01:51 +00003459 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003460 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003461
3462 // Handle serialized diagnostics.
3463 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3464 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003465 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003466 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003467
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003468 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3469 CmdArgs.push_back("-fretain-comments-from-system-headers");
3470
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003471 // Forward -fcomment-block-commands to -cc1.
3472 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003473 // Forward -fparse-all-comments to -cc1.
3474 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003475
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003476 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3477 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003478 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003479 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3480 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003481 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003482
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003483 // We translate this by hand to the -cc1 argument, since nightly test uses
3484 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003485 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003486 CmdArgs.push_back("-disable-llvm-optzns");
3487 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003488 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003489 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003490
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003491 if (Output.getType() == types::TY_Dependencies) {
3492 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003493 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003494 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003495 CmdArgs.push_back(Output.getFilename());
3496 } else {
3497 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003498 }
3499
Daniel Dunbar1d460332009-03-18 10:01:51 +00003500 for (InputInfoList::const_iterator
3501 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3502 const InputInfo &II = *it;
3503 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003504 if (Args.hasArg(options::OPT_rewrite_objc))
3505 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3506 else
3507 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003508 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003509 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003510 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003511 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003512 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003513
Chris Lattnere6113de2009-11-03 19:50:27 +00003514 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3515
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003516 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003517
3518 // Optionally embed the -cc1 level arguments into the debug info, for build
3519 // analysis.
3520 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003521 ArgStringList OriginalArgs;
3522 for (ArgList::const_iterator it = Args.begin(),
3523 ie = Args.end(); it != ie; ++it)
3524 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003525
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003526 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003527 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003528 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003529 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003530 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003531 }
3532 CmdArgs.push_back("-dwarf-debug-flags");
3533 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3534 }
3535
Eric Christopher80190392013-02-22 20:12:52 +00003536 // Add the split debug info name to the command lines here so we
3537 // can propagate it to the backend.
3538 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3539 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherff971d72013-02-22 23:50:16 +00003540 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003541 const char *SplitDwarfOut;
3542 if (SplitDwarf) {
3543 CmdArgs.push_back("-split-dwarf-file");
3544 SplitDwarfOut = SplitDebugName(Args, Inputs);
3545 CmdArgs.push_back(SplitDwarfOut);
3546 }
3547
3548 // Finally add the compile command to the compilation.
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003549 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00003550
Eric Christopherff971d72013-02-22 23:50:16 +00003551 // Handle the debug info splitting at object creation time if we're
3552 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003553 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003554 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003555 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003556
Roman Divackybe4c8702011-02-10 16:52:03 +00003557 if (Arg *A = Args.getLastArg(options::OPT_pg))
3558 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003559 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003560 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003561
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003562 // Claim some arguments which clang supports automatically.
3563
Daniel Dunbarf4046862010-04-15 06:18:42 +00003564 // -fpch-preprocess is used with gcc to add a special marker in the output to
3565 // include the PCH file. Clang's PTH solution is completely transparent, so we
3566 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003567 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003568
Daniel Dunbara880db02009-03-23 19:03:36 +00003569 // Claim some arguments which clang doesn't support, but we don't
3570 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003571 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3572 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003573
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003574 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003575 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003576 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003577}
3578
Jim Grosbachfc308292012-02-10 20:37:10 +00003579void ClangAs::AddARMTargetArgs(const ArgList &Args,
3580 ArgStringList &CmdArgs) const {
3581 const Driver &D = getToolChain().getDriver();
3582 llvm::Triple Triple = getToolChain().getTriple();
3583
3584 // Set the CPU based on -march= and -mcpu=.
3585 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00003586 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00003587
3588 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00003589 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00003590 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00003591
3592 // Honor -mfpmath=.
3593 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00003594 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00003595}
3596
Benjamin Kramerefc5b672013-02-22 20:55:17 +00003597void ClangAs::AddX86TargetArgs(const ArgList &Args,
3598 ArgStringList &CmdArgs) const {
3599 // Set the CPU based on -march=.
3600 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3601 CmdArgs.push_back("-target-cpu");
3602 CmdArgs.push_back(CPUName);
3603 }
3604}
3605
John McCall260611a2012-06-20 06:18:46 +00003606/// Add options related to the Objective-C runtime/ABI.
3607///
3608/// Returns true if the runtime is non-fragile.
3609ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3610 ArgStringList &cmdArgs,
3611 RewriteKind rewriteKind) const {
3612 // Look for the controlling runtime option.
3613 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3614 options::OPT_fgnu_runtime,
3615 options::OPT_fobjc_runtime_EQ);
3616
3617 // Just forward -fobjc-runtime= to the frontend. This supercedes
3618 // options about fragility.
3619 if (runtimeArg &&
3620 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3621 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003622 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003623 if (runtime.tryParse(value)) {
3624 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3625 << value;
3626 }
3627
3628 runtimeArg->render(args, cmdArgs);
3629 return runtime;
3630 }
3631
3632 // Otherwise, we'll need the ABI "version". Version numbers are
3633 // slightly confusing for historical reasons:
3634 // 1 - Traditional "fragile" ABI
3635 // 2 - Non-fragile ABI, version 1
3636 // 3 - Non-fragile ABI, version 2
3637 unsigned objcABIVersion = 1;
3638 // If -fobjc-abi-version= is present, use that to set the version.
3639 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003640 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003641 if (value == "1")
3642 objcABIVersion = 1;
3643 else if (value == "2")
3644 objcABIVersion = 2;
3645 else if (value == "3")
3646 objcABIVersion = 3;
3647 else
3648 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3649 << value;
3650 } else {
3651 // Otherwise, determine if we are using the non-fragile ABI.
3652 bool nonFragileABIIsDefault =
3653 (rewriteKind == RK_NonFragile ||
3654 (rewriteKind == RK_None &&
3655 getToolChain().IsObjCNonFragileABIDefault()));
3656 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3657 options::OPT_fno_objc_nonfragile_abi,
3658 nonFragileABIIsDefault)) {
3659 // Determine the non-fragile ABI version to use.
3660#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3661 unsigned nonFragileABIVersion = 1;
3662#else
3663 unsigned nonFragileABIVersion = 2;
3664#endif
3665
3666 if (Arg *abiArg = args.getLastArg(
3667 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003668 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003669 if (value == "1")
3670 nonFragileABIVersion = 1;
3671 else if (value == "2")
3672 nonFragileABIVersion = 2;
3673 else
3674 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3675 << value;
3676 }
3677
3678 objcABIVersion = 1 + nonFragileABIVersion;
3679 } else {
3680 objcABIVersion = 1;
3681 }
3682 }
3683
3684 // We don't actually care about the ABI version other than whether
3685 // it's non-fragile.
3686 bool isNonFragile = objcABIVersion != 1;
3687
3688 // If we have no runtime argument, ask the toolchain for its default runtime.
3689 // However, the rewriter only really supports the Mac runtime, so assume that.
3690 ObjCRuntime runtime;
3691 if (!runtimeArg) {
3692 switch (rewriteKind) {
3693 case RK_None:
3694 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3695 break;
3696 case RK_Fragile:
3697 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3698 break;
3699 case RK_NonFragile:
3700 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3701 break;
3702 }
3703
3704 // -fnext-runtime
3705 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3706 // On Darwin, make this use the default behavior for the toolchain.
3707 if (getToolChain().getTriple().isOSDarwin()) {
3708 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3709
3710 // Otherwise, build for a generic macosx port.
3711 } else {
3712 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3713 }
3714
3715 // -fgnu-runtime
3716 } else {
3717 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003718 // Legacy behaviour is to target the gnustep runtime if we are i
3719 // non-fragile mode or the GCC runtime in fragile mode.
3720 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003721 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003722 else
3723 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003724 }
3725
3726 cmdArgs.push_back(args.MakeArgString(
3727 "-fobjc-runtime=" + runtime.getAsString()));
3728 return runtime;
3729}
3730
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003731void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003732 const InputInfo &Output,
3733 const InputInfoList &Inputs,
3734 const ArgList &Args,
3735 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003736 ArgStringList CmdArgs;
3737
3738 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3739 const InputInfo &Input = Inputs[0];
3740
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003741 // Don't warn about "clang -w -c foo.s"
3742 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003743 // and "clang -emit-llvm -c foo.s"
3744 Args.ClaimAllArgs(options::OPT_emit_llvm);
3745 // and "clang -use-gold-plugin -c foo.s"
3746 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003747
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003748 // Invoke ourselves in -cc1as mode.
3749 //
3750 // FIXME: Implement custom jobs for internal actions.
3751 CmdArgs.push_back("-cc1as");
3752
3753 // Add the "effective" target triple.
3754 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003755 std::string TripleStr =
3756 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003757 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3758
3759 // Set the output mode, we currently only expect to be used as a real
3760 // assembler.
3761 CmdArgs.push_back("-filetype");
3762 CmdArgs.push_back("obj");
3763
Eric Christopher27e2b982012-12-18 00:31:10 +00003764 // Set the main file name, so that debug info works even with
3765 // -save-temps or preprocessed assembly.
3766 CmdArgs.push_back("-main-file-name");
3767 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3768
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003769 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003770 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003771
Jim Grosbachfc308292012-02-10 20:37:10 +00003772 // Add target specific cpu and features flags.
3773 switch(getToolChain().getTriple().getArch()) {
3774 default:
3775 break;
3776
3777 case llvm::Triple::arm:
3778 case llvm::Triple::thumb:
3779 AddARMTargetArgs(Args, CmdArgs);
3780 break;
Benjamin Kramerefc5b672013-02-22 20:55:17 +00003781
3782 case llvm::Triple::x86:
3783 case llvm::Triple::x86_64:
3784 AddX86TargetArgs(Args, CmdArgs);
3785 break;
Jim Grosbachfc308292012-02-10 20:37:10 +00003786 }
3787
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003788 // Ignore explicit -force_cpusubtype_ALL option.
3789 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003790
Eric Christopher8f0a4032012-01-10 00:38:01 +00003791 // Determine the original source input.
3792 const Action *SourceAction = &JA;
3793 while (SourceAction->getKind() != Action::InputClass) {
3794 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3795 SourceAction = SourceAction->getInputs()[0];
3796 }
3797
Chandler Carruthd566df62012-12-17 21:40:04 +00003798 // Forward -g and handle debug info related flags, assuming we are dealing
3799 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003800 if (SourceAction->getType() == types::TY_Asm ||
3801 SourceAction->getType() == types::TY_PP_Asm) {
3802 Args.ClaimAllArgs(options::OPT_g_Group);
3803 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3804 if (!A->getOption().matches(options::OPT_g0))
3805 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003806
3807 // Add the -fdebug-compilation-dir flag if needed.
3808 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003809
3810 // Set the AT_producer to the clang version when using the integrated
3811 // assembler on assembly source files.
3812 CmdArgs.push_back("-dwarf-debug-producer");
3813 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003814 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003815
3816 // Optionally embed the -cc1as level arguments into the debug info, for build
3817 // analysis.
3818 if (getToolChain().UseDwarfDebugFlags()) {
3819 ArgStringList OriginalArgs;
3820 for (ArgList::const_iterator it = Args.begin(),
3821 ie = Args.end(); it != ie; ++it)
3822 (*it)->render(Args, OriginalArgs);
3823
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003824 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003825 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3826 Flags += Exec;
3827 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3828 Flags += " ";
3829 Flags += OriginalArgs[i];
3830 }
3831 CmdArgs.push_back("-dwarf-debug-flags");
3832 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3833 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003834
3835 // FIXME: Add -static support, once we have it.
3836
3837 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3838 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003839 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003840
3841 assert(Output.isFilename() && "Unexpected lipo output.");
3842 CmdArgs.push_back("-o");
3843 CmdArgs.push_back(Output.getFilename());
3844
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003845 assert(Input.isFilename() && "Invalid input.");
3846 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003847
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003848 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003849 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00003850
3851 // Handle the debug info splitting at object creation time if we're
3852 // creating an object.
3853 // TODO: Currently only works on linux with newer objcopy.
3854 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3855 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3856 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3857 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003858}
3859
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003860void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003861 const InputInfo &Output,
3862 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003863 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003864 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003865 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003866 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003867
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003868 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003869 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003870 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00003871 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003872 // Don't forward any -g arguments to assembly steps.
3873 if (isa<AssembleJobAction>(JA) &&
3874 A->getOption().matches(options::OPT_g_Group))
3875 continue;
3876
Daniel Dunbar75877192009-03-19 07:55:12 +00003877 // It is unfortunate that we have to claim here, as this means
3878 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003879 // platforms using a generic gcc, even if we are just using gcc
3880 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003881 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003882 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003883 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003884 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003885
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003886 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003887
3888 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003889 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00003890 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003891 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003892
3893 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003894 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003895 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003896 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003897 CmdArgs.push_back("ppc64");
3898 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003899 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003900 }
3901
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003902 // Try to force gcc to match the tool chain we want, if we recognize
3903 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003904 //
3905 // FIXME: The triple class should directly provide the information we want
3906 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003907 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003908 CmdArgs.push_back("-m32");
Hans Wennborg33092292013-03-20 07:34:27 +00003909 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003910 CmdArgs.push_back("-m64");
3911
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003912 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003913 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003914 CmdArgs.push_back(Output.getFilename());
3915 } else {
3916 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003917 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003918 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003919
Tony Linthicum96319392011-12-12 21:14:55 +00003920 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3921 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003922
3923 // Only pass -x if gcc will understand it; otherwise hope gcc
3924 // understands the suffix correctly. The main use case this would go
3925 // wrong in is for linker inputs if they happened to have an odd
3926 // suffix; really the only way to get this to happen is a command
3927 // like '-x foobar a.c' which will treat a.c like a linker input.
3928 //
3929 // FIXME: For the linker case specifically, can we safely convert
3930 // inputs into '-Wl,' options?
3931 for (InputInfoList::const_iterator
3932 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3933 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003934
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003935 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003936 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3937 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003938 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003939 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003940 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003941 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003942 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00003943 else if (II.getType() == types::TY_ModuleFile)
3944 D.Diag(diag::err_drv_no_module_support)
3945 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003946
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003947 if (types::canTypeBeUserSpecified(II.getType())) {
3948 CmdArgs.push_back("-x");
3949 CmdArgs.push_back(types::getTypeName(II.getType()));
3950 }
3951
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003952 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003953 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003954 else {
3955 const Arg &A = II.getInputArg();
3956
3957 // Reverse translate some rewritten options.
3958 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3959 CmdArgs.push_back("-lstdc++");
3960 continue;
3961 }
3962
Daniel Dunbar115a7922009-03-19 07:29:38 +00003963 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003964 A.render(Args, CmdArgs);
3965 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003966 }
3967
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003968 const std::string customGCCName = D.getCCCGenericGCCName();
3969 const char *GCCName;
3970 if (!customGCCName.empty())
3971 GCCName = customGCCName.c_str();
3972 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003973 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003974 } else
3975 GCCName = "gcc";
3976
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003977 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003978 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003979 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003980}
3981
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003982void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3983 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003984 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003985}
3986
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003987void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3988 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003989 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003990}
3991
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003992void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3993 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003994 const Driver &D = getToolChain().getDriver();
3995
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003996 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003997 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3998 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003999 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004000 else {
4001 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004002 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004003 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004004
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004005 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004006 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004007}
4008
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004009void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4010 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004011 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004012}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004013
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004014void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4015 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004016 // The types are (hopefully) good enough.
4017}
4018
Tony Linthicum96319392011-12-12 21:14:55 +00004019// Hexagon tools start.
4020void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4021 ArgStringList &CmdArgs) const {
4022
4023}
4024void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4025 const InputInfo &Output,
4026 const InputInfoList &Inputs,
4027 const ArgList &Args,
4028 const char *LinkingOutput) const {
4029
4030 const Driver &D = getToolChain().getDriver();
4031 ArgStringList CmdArgs;
4032
4033 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004034 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004035 CmdArgs.push_back(Args.MakeArgString(MarchString));
4036
4037 RenderExtraToolArgs(JA, CmdArgs);
4038
4039 if (Output.isFilename()) {
4040 CmdArgs.push_back("-o");
4041 CmdArgs.push_back(Output.getFilename());
4042 } else {
4043 assert(Output.isNothing() && "Unexpected output");
4044 CmdArgs.push_back("-fsyntax-only");
4045 }
4046
Matthew Curtis33c95f12012-12-06 17:49:03 +00004047 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4048 if (!SmallDataThreshold.empty())
4049 CmdArgs.push_back(
4050 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004051
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004052 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4053 options::OPT_Xassembler);
4054
Tony Linthicum96319392011-12-12 21:14:55 +00004055 // Only pass -x if gcc will understand it; otherwise hope gcc
4056 // understands the suffix correctly. The main use case this would go
4057 // wrong in is for linker inputs if they happened to have an odd
4058 // suffix; really the only way to get this to happen is a command
4059 // like '-x foobar a.c' which will treat a.c like a linker input.
4060 //
4061 // FIXME: For the linker case specifically, can we safely convert
4062 // inputs into '-Wl,' options?
4063 for (InputInfoList::const_iterator
4064 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4065 const InputInfo &II = *it;
4066
4067 // Don't try to pass LLVM or AST inputs to a generic gcc.
4068 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4069 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4070 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4071 << getToolChain().getTripleString();
4072 else if (II.getType() == types::TY_AST)
4073 D.Diag(clang::diag::err_drv_no_ast_support)
4074 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004075 else if (II.getType() == types::TY_ModuleFile)
4076 D.Diag(diag::err_drv_no_module_support)
4077 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004078
4079 if (II.isFilename())
4080 CmdArgs.push_back(II.getFilename());
4081 else
4082 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4083 II.getInputArg().render(Args, CmdArgs);
4084 }
4085
4086 const char *GCCName = "hexagon-as";
4087 const char *Exec =
4088 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4089 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4090
4091}
4092void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4093 ArgStringList &CmdArgs) const {
4094 // The types are (hopefully) good enough.
4095}
4096
4097void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4098 const InputInfo &Output,
4099 const InputInfoList &Inputs,
4100 const ArgList &Args,
4101 const char *LinkingOutput) const {
4102
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004103 const toolchains::Hexagon_TC& ToolChain =
4104 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4105 const Driver &D = ToolChain.getDriver();
4106
Tony Linthicum96319392011-12-12 21:14:55 +00004107 ArgStringList CmdArgs;
4108
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004109 //----------------------------------------------------------------------------
4110 //
4111 //----------------------------------------------------------------------------
4112 bool hasStaticArg = Args.hasArg(options::OPT_static);
4113 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004114 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004115 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4116 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4117 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4118 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004119
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004120 //----------------------------------------------------------------------------
4121 // Silence warnings for various options
4122 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004123
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004124 Args.ClaimAllArgs(options::OPT_g_Group);
4125 Args.ClaimAllArgs(options::OPT_emit_llvm);
4126 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4127 // handled somewhere else.
4128 Args.ClaimAllArgs(options::OPT_static_libgcc);
4129
4130 //----------------------------------------------------------------------------
4131 //
4132 //----------------------------------------------------------------------------
4133 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4134 e = ToolChain.ExtraOpts.end();
4135 i != e; ++i)
4136 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004137
Matthew Curtis67814152012-12-06 14:16:43 +00004138 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4139 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004140
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004141 if (buildingLib) {
4142 CmdArgs.push_back("-shared");
4143 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4144 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004145 }
4146
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004147 if (hasStaticArg)
4148 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004149
Matthew Curtis33c95f12012-12-06 17:49:03 +00004150 if (buildPIE && !buildingLib)
4151 CmdArgs.push_back("-pie");
4152
4153 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4154 if (!SmallDataThreshold.empty()) {
4155 CmdArgs.push_back(
4156 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4157 }
4158
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004159 //----------------------------------------------------------------------------
4160 //
4161 //----------------------------------------------------------------------------
4162 CmdArgs.push_back("-o");
4163 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004164
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004165 const std::string MarchSuffix = "/" + MarchString;
4166 const std::string G0Suffix = "/G0";
4167 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4168 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4169 + "/";
4170 const std::string StartFilesDir = RootDir
4171 + "hexagon/lib"
4172 + (buildingLib
4173 ? MarchG0Suffix : MarchSuffix);
4174
4175 //----------------------------------------------------------------------------
4176 // moslib
4177 //----------------------------------------------------------------------------
4178 std::vector<std::string> oslibs;
4179 bool hasStandalone= false;
4180
4181 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4182 ie = Args.filtered_end(); it != ie; ++it) {
4183 (*it)->claim();
4184 oslibs.push_back((*it)->getValue());
4185 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004186 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004187 if (oslibs.empty()) {
4188 oslibs.push_back("standalone");
4189 hasStandalone = true;
4190 }
Tony Linthicum96319392011-12-12 21:14:55 +00004191
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004192 //----------------------------------------------------------------------------
4193 // Start Files
4194 //----------------------------------------------------------------------------
4195 if (incStdLib && incStartFiles) {
4196
4197 if (!buildingLib) {
4198 if (hasStandalone) {
4199 CmdArgs.push_back(
4200 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4201 }
4202 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4203 }
4204 std::string initObj = useShared ? "/initS.o" : "/init.o";
4205 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4206 }
4207
4208 //----------------------------------------------------------------------------
4209 // Library Search Paths
4210 //----------------------------------------------------------------------------
4211 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4212 for (ToolChain::path_list::const_iterator
4213 i = LibPaths.begin(),
4214 e = LibPaths.end();
4215 i != e;
4216 ++i)
4217 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4218
4219 //----------------------------------------------------------------------------
4220 //
4221 //----------------------------------------------------------------------------
4222 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4223 Args.AddAllArgs(CmdArgs, options::OPT_e);
4224 Args.AddAllArgs(CmdArgs, options::OPT_s);
4225 Args.AddAllArgs(CmdArgs, options::OPT_t);
4226 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4227
4228 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4229
4230 //----------------------------------------------------------------------------
4231 // Libraries
4232 //----------------------------------------------------------------------------
4233 if (incStdLib && incDefLibs) {
4234 if (D.CCCIsCXX) {
4235 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4236 CmdArgs.push_back("-lm");
4237 }
4238
4239 CmdArgs.push_back("--start-group");
4240
4241 if (!buildingLib) {
4242 for(std::vector<std::string>::iterator i = oslibs.begin(),
4243 e = oslibs.end(); i != e; ++i)
4244 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4245 CmdArgs.push_back("-lc");
4246 }
4247 CmdArgs.push_back("-lgcc");
4248
4249 CmdArgs.push_back("--end-group");
4250 }
4251
4252 //----------------------------------------------------------------------------
4253 // End files
4254 //----------------------------------------------------------------------------
4255 if (incStdLib && incStartFiles) {
4256 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4257 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4258 }
4259
4260 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4261 C.addCommand(
4262 new Command(
4263 JA, *this,
4264 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004265}
4266// Hexagon tools end.
4267
Rafael Espindolacfed8282012-10-31 18:51:07 +00004268llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4269 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4270 // archs which Darwin doesn't use.
4271
4272 // The matching this routine does is fairly pointless, since it is neither the
4273 // complete architecture list, nor a reasonable subset. The problem is that
4274 // historically the driver driver accepts this and also ties its -march=
4275 // handling to the architecture name, so we need to be careful before removing
4276 // support for it.
4277
4278 // This code must be kept in sync with Clang's Darwin specific argument
4279 // translation.
4280
4281 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4282 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4283 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4284 .Case("ppc64", llvm::Triple::ppc64)
4285 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4286 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4287 llvm::Triple::x86)
4288 .Case("x86_64", llvm::Triple::x86_64)
4289 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004290 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4291 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4292 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004293 .Case("r600", llvm::Triple::r600)
4294 .Case("nvptx", llvm::Triple::nvptx)
4295 .Case("nvptx64", llvm::Triple::nvptx64)
4296 .Case("amdil", llvm::Triple::amdil)
4297 .Case("spir", llvm::Triple::spir)
4298 .Default(llvm::Triple::UnknownArch);
4299}
Tony Linthicum96319392011-12-12 21:14:55 +00004300
Bob Wilson66b8a662012-11-23 06:14:39 +00004301const char *Clang::getBaseInputName(const ArgList &Args,
4302 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004303 return Args.MakeArgString(
4304 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004305}
4306
Bob Wilson66b8a662012-11-23 06:14:39 +00004307const char *Clang::getBaseInputStem(const ArgList &Args,
4308 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004309 const char *Str = getBaseInputName(Args, Inputs);
4310
Chris Lattner657ca662011-01-16 08:14:11 +00004311 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004312 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004313
4314 return Str;
4315}
4316
Bob Wilson66b8a662012-11-23 06:14:39 +00004317const char *Clang::getDependencyFileName(const ArgList &Args,
4318 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004319 // FIXME: Think about this more.
4320 std::string Res;
4321
4322 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004323 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004324 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004325 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004326 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004327 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004328 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004329}
4330
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004331void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004332 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004333 const InputInfoList &Inputs,
4334 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004335 const char *LinkingOutput) const {
4336 ArgStringList CmdArgs;
4337
4338 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4339 const InputInfo &Input = Inputs[0];
4340
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004341 // Determine the original source input.
4342 const Action *SourceAction = &JA;
4343 while (SourceAction->getKind() != Action::InputClass) {
4344 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4345 SourceAction = SourceAction->getInputs()[0];
4346 }
4347
4348 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004349 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004350 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004351 if (Args.hasArg(options::OPT_gstabs))
4352 CmdArgs.push_back("--gstabs");
4353 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004354 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004355 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004356
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004357 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004358 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004359
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004360 // Use -force_cpusubtype_ALL on x86 by default.
4361 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4362 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004363 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4364 CmdArgs.push_back("-force_cpusubtype_ALL");
4365
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004366 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004367 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004368 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004369 (!getDarwinToolChain().isTargetIPhoneOS() ||
4370 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4371 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004372 CmdArgs.push_back("-static");
4373
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004374 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4375 options::OPT_Xassembler);
4376
4377 assert(Output.isFilename() && "Unexpected lipo output.");
4378 CmdArgs.push_back("-o");
4379 CmdArgs.push_back(Output.getFilename());
4380
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004381 assert(Input.isFilename() && "Invalid input.");
4382 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004383
4384 // asm_final spec is empty.
4385
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004386 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004387 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004388 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004389}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004390
David Blaikie99ba9e32011-12-20 02:48:34 +00004391void darwin::DarwinTool::anchor() {}
4392
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004393void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4394 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004395 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004396
Daniel Dunbar02633b52009-03-26 16:23:12 +00004397 // Derived from darwin_arch spec.
4398 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004399 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004400
Daniel Dunbareeff4062010-01-22 02:04:58 +00004401 // FIXME: Is this needed anymore?
4402 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004403 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004404}
4405
Bill Wendling6acf8b42012-10-02 18:02:50 +00004406bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4407 // We only need to generate a temp path for LTO if we aren't compiling object
4408 // files. When compiling source files, we run 'dsymutil' after linking. We
4409 // don't run 'dsymutil' when compiling object files.
4410 for (InputInfoList::const_iterator
4411 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4412 if (it->getType() != types::TY_Object)
4413 return true;
4414
4415 return false;
4416}
4417
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004418void darwin::Link::AddLinkArgs(Compilation &C,
4419 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004420 ArgStringList &CmdArgs,
4421 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004422 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004423 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004424
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004425 unsigned Version[3] = { 0, 0, 0 };
4426 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4427 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004428 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004429 Version[1], Version[2], HadExtra) ||
4430 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004431 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004432 << A->getAsString(Args);
4433 }
4434
4435 // Newer linkers support -demangle, pass it if supported and not disabled by
4436 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004437 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004438 // Don't pass -demangle to ld_classic.
4439 //
4440 // FIXME: This is a temporary workaround, ld should be handling this.
4441 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4442 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004443 if (getToolChain().getArch() == llvm::Triple::x86) {
4444 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4445 options::OPT_Wl_COMMA),
4446 ie = Args.filtered_end(); it != ie; ++it) {
4447 const Arg *A = *it;
4448 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004449 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004450 UsesLdClassic = true;
4451 }
4452 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004453 if (!UsesLdClassic)
4454 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004455 }
4456
Bill Wendlingc35f9082012-11-16 23:03:00 +00004457 // If we are using LTO, then automatically create a temporary file path for
4458 // the linker to use, so that it's lifetime will extend past a possible
4459 // dsymutil step.
4460 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4461 const char *TmpPath = C.getArgs().MakeArgString(
4462 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4463 C.addTempFile(TmpPath);
4464 CmdArgs.push_back("-object_path_lto");
4465 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004466 }
4467
Daniel Dunbar02633b52009-03-26 16:23:12 +00004468 // Derived from the "link" spec.
4469 Args.AddAllArgs(CmdArgs, options::OPT_static);
4470 if (!Args.hasArg(options::OPT_static))
4471 CmdArgs.push_back("-dynamic");
4472 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4473 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4474 // here. How do we wish to handle such things?
4475 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004476
Daniel Dunbar02633b52009-03-26 16:23:12 +00004477 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004478 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004479 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004480 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004481
4482 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4483 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4484 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4485
4486 Arg *A;
4487 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4488 (A = Args.getLastArg(options::OPT_current__version)) ||
4489 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004490 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004491 << A->getAsString(Args) << "-dynamiclib";
4492
4493 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4494 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4495 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4496 } else {
4497 CmdArgs.push_back("-dylib");
4498
4499 Arg *A;
4500 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4501 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4502 (A = Args.getLastArg(options::OPT_client__name)) ||
4503 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4504 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4505 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004506 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004507 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004508
Daniel Dunbar02633b52009-03-26 16:23:12 +00004509 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4510 "-dylib_compatibility_version");
4511 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4512 "-dylib_current_version");
4513
Daniel Dunbara6d38492010-01-22 02:04:52 +00004514 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004515
4516 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4517 "-dylib_install_name");
4518 }
4519
4520 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4521 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4522 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004523 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004524 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004525 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4526 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4527 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4528 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4529 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4530 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004531 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004532 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4533 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4534 Args.AddAllArgs(CmdArgs, options::OPT_init);
4535
Daniel Dunbarce911f52011-04-28 21:23:41 +00004536 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004537 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004538
4539 // If we had an explicit -mios-simulator-version-min argument, honor that,
4540 // otherwise use the traditional deployment targets. We can't just check the
4541 // is-sim attribute because existing code follows this path, and the linker
4542 // may not handle the argument.
4543 //
4544 // FIXME: We may be able to remove this, once we can verify no one depends on
4545 // it.
4546 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4547 CmdArgs.push_back("-ios_simulator_version_min");
4548 else if (DarwinTC.isTargetIPhoneOS())
4549 CmdArgs.push_back("-iphoneos_version_min");
4550 else
4551 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004552 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004553
Daniel Dunbar02633b52009-03-26 16:23:12 +00004554 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4555 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4556 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4557 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4558 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004559
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004560 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4561 options::OPT_fno_pie,
4562 options::OPT_fno_PIE)) {
4563 if (A->getOption().matches(options::OPT_fpie) ||
4564 A->getOption().matches(options::OPT_fPIE))
4565 CmdArgs.push_back("-pie");
4566 else
4567 CmdArgs.push_back("-no_pie");
4568 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004569
4570 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4571 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4572 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4573 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4574 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4575 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4576 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4577 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4578 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4579 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4580 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4581 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4582 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4583 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4584 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4585 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004586
Daniel Dunbarcc957192011-05-02 21:03:47 +00004587 // Give --sysroot= preference, over the Apple specific behavior to also use
4588 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004589 StringRef sysroot = C.getSysRoot();
4590 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004591 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004592 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004593 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4594 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004595 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004596 }
4597
Daniel Dunbar02633b52009-03-26 16:23:12 +00004598 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4599 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4600 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4601 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4602 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004603 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004604 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4605 Args.AddAllArgs(CmdArgs, options::OPT_y);
4606 Args.AddLastArg(CmdArgs, options::OPT_w);
4607 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4608 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4609 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4610 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4611 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4612 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4613 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4614 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4615 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4616 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4617 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4618 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4619}
4620
4621void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004622 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004623 const InputInfoList &Inputs,
4624 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004625 const char *LinkingOutput) const {
4626 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004627
Daniel Dunbar02633b52009-03-26 16:23:12 +00004628 // The logic here is derived from gcc's behavior; most of which
4629 // comes from specs (starting with link_command). Consult gcc for
4630 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004631 ArgStringList CmdArgs;
4632
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004633 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4634 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4635 options::OPT_ccc_arcmt_migrate)) {
4636 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4637 (*I)->claim();
4638 const char *Exec =
4639 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4640 CmdArgs.push_back(Output.getFilename());
4641 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4642 return;
4643 }
4644
Daniel Dunbar02633b52009-03-26 16:23:12 +00004645 // I'm not sure why this particular decomposition exists in gcc, but
4646 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004647 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004648
Daniel Dunbar02633b52009-03-26 16:23:12 +00004649 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4650 Args.AddAllArgs(CmdArgs, options::OPT_s);
4651 Args.AddAllArgs(CmdArgs, options::OPT_t);
4652 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4653 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004654 Args.AddLastArg(CmdArgs, options::OPT_e);
4655 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4656 Args.AddAllArgs(CmdArgs, options::OPT_r);
4657
Daniel Dunbar270073c2010-10-18 22:08:36 +00004658 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4659 // members of static archive libraries which implement Objective-C classes or
4660 // categories.
4661 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4662 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004663
Bill Wendlingd56f4032012-12-10 21:48:41 +00004664 if (Args.hasArg(options::OPT_rdynamic))
4665 CmdArgs.push_back("-export_dynamic");
4666
Daniel Dunbar02633b52009-03-26 16:23:12 +00004667 CmdArgs.push_back("-o");
4668 CmdArgs.push_back(Output.getFilename());
4669
Chad Rosier18937312012-05-16 23:45:12 +00004670 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004671 !Args.hasArg(options::OPT_nostartfiles)) {
4672 // Derived from startfile spec.
4673 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004674 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004675 if (getDarwinToolChain().isTargetIOSSimulator()) {
4676 // The simulator doesn't have a versioned crt1 file.
4677 CmdArgs.push_back("-ldylib1.o");
4678 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004679 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4680 CmdArgs.push_back("-ldylib1.o");
4681 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004682 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004683 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004684 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004685 CmdArgs.push_back("-ldylib1.10.5.o");
4686 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004687 } else {
4688 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004689 if (!Args.hasArg(options::OPT_static)) {
4690 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004691 if (getDarwinToolChain().isTargetIOSSimulator()) {
4692 // The simulator doesn't have a versioned crt1 file.
4693 CmdArgs.push_back("-lbundle1.o");
4694 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004695 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4696 CmdArgs.push_back("-lbundle1.o");
4697 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004698 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004699 CmdArgs.push_back("-lbundle1.o");
4700 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004701 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004702 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004703 if (Args.hasArg(options::OPT_pg) &&
4704 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004705 if (Args.hasArg(options::OPT_static) ||
4706 Args.hasArg(options::OPT_object) ||
4707 Args.hasArg(options::OPT_preload)) {
4708 CmdArgs.push_back("-lgcrt0.o");
4709 } else {
4710 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004711
Daniel Dunbar02633b52009-03-26 16:23:12 +00004712 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004713 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004714 // By default on OS X 10.8 and later, we don't link with a crt1.o
4715 // file and the linker knows to use _main as the entry point. But,
4716 // when compiling with -pg, we need to link with the gcrt1.o file,
4717 // so pass the -no_new_main option to tell the linker to use the
4718 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004719 if (getDarwinToolChain().isTargetMacOS() &&
4720 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4721 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004722 } else {
4723 if (Args.hasArg(options::OPT_static) ||
4724 Args.hasArg(options::OPT_object) ||
4725 Args.hasArg(options::OPT_preload)) {
4726 CmdArgs.push_back("-lcrt0.o");
4727 } else {
4728 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004729 if (getDarwinToolChain().isTargetIOSSimulator()) {
4730 // The simulator doesn't have a versioned crt1 file.
4731 CmdArgs.push_back("-lcrt1.o");
4732 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004733 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4734 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004735 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004736 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004737 } else {
4738 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4739 CmdArgs.push_back("-lcrt1.o");
4740 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4741 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004742 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004743 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004744
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004745 // darwin_crt2 spec is empty.
4746 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004747 }
4748 }
4749 }
4750 }
4751
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004752 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4753 Args.hasArg(options::OPT_shared_libgcc) &&
4754 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004755 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004756 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004757 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004758 }
4759 }
4760
4761 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004762
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00004763 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004764 // If we're building a dynamic lib with -fsanitize=address,
4765 // unresolved symbols may appear. Mark all
Alexey Samsonov75fcb192012-11-16 12:53:14 +00004766 // of them as dynamic_lookup. Linking executables is handled in
4767 // lib/Driver/ToolChains.cpp.
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004768 if (Sanitize.needsAsanRt()) {
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004769 if (Args.hasArg(options::OPT_dynamiclib) ||
4770 Args.hasArg(options::OPT_bundle)) {
4771 CmdArgs.push_back("-undefined");
4772 CmdArgs.push_back("dynamic_lookup");
4773 }
4774 }
4775
Daniel Dunbar02633b52009-03-26 16:23:12 +00004776 if (Args.hasArg(options::OPT_fopenmp))
4777 // This is more complicated in gcc...
4778 CmdArgs.push_back("-lgomp");
4779
Douglas Gregor04e326b2012-05-15 21:00:27 +00004780 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4781
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004782 if (isObjCRuntimeLinked(Args) &&
4783 !Args.hasArg(options::OPT_nostdlib) &&
4784 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004785 // Avoid linking compatibility stubs on i386 mac.
4786 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004787 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004788 // If we don't have ARC or subscripting runtime support, link in the
4789 // runtime stubs. We have to do this *before* adding any of the normal
4790 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004791 ObjCRuntime runtime =
4792 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004793 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004794 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004795 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004796 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004797 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004798 CmdArgs.push_back("-framework");
4799 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004800 // Link libobj.
4801 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004802 }
John McCallf85e1932011-06-15 23:02:42 +00004803
Daniel Dunbar02633b52009-03-26 16:23:12 +00004804 if (LinkingOutput) {
4805 CmdArgs.push_back("-arch_multiple");
4806 CmdArgs.push_back("-final_output");
4807 CmdArgs.push_back(LinkingOutput);
4808 }
4809
Daniel Dunbar02633b52009-03-26 16:23:12 +00004810 if (Args.hasArg(options::OPT_fnested_functions))
4811 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004812
Daniel Dunbar02633b52009-03-26 16:23:12 +00004813 if (!Args.hasArg(options::OPT_nostdlib) &&
4814 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004815 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004816 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004817
Daniel Dunbar02633b52009-03-26 16:23:12 +00004818 // link_ssp spec is empty.
4819
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004820 // Let the tool chain choose which runtime library to link.
4821 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004822 }
4823
Chad Rosier18937312012-05-16 23:45:12 +00004824 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004825 !Args.hasArg(options::OPT_nostartfiles)) {
4826 // endfile_spec is empty.
4827 }
4828
4829 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4830 Args.AddAllArgs(CmdArgs, options::OPT_F);
4831
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004832 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004833 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004834 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004835}
4836
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004837void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004838 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004839 const InputInfoList &Inputs,
4840 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004841 const char *LinkingOutput) const {
4842 ArgStringList CmdArgs;
4843
4844 CmdArgs.push_back("-create");
4845 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004846
4847 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004848 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004849
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004850 for (InputInfoList::const_iterator
4851 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4852 const InputInfo &II = *it;
4853 assert(II.isFilename() && "Unexpected lipo input.");
4854 CmdArgs.push_back(II.getFilename());
4855 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004856 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004857 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004858 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004859}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004860
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004861void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004862 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004863 const InputInfoList &Inputs,
4864 const ArgList &Args,
4865 const char *LinkingOutput) const {
4866 ArgStringList CmdArgs;
4867
Daniel Dunbar03e92302011-05-09 17:23:16 +00004868 CmdArgs.push_back("-o");
4869 CmdArgs.push_back(Output.getFilename());
4870
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004871 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4872 const InputInfo &Input = Inputs[0];
4873 assert(Input.isFilename() && "Unexpected dsymutil input.");
4874 CmdArgs.push_back(Input.getFilename());
4875
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004876 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004877 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004878 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004879}
4880
Eric Christopherf8571862011-08-23 17:56:55 +00004881void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00004882 const InputInfo &Output,
4883 const InputInfoList &Inputs,
4884 const ArgList &Args,
4885 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00004886 ArgStringList CmdArgs;
4887 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004888 CmdArgs.push_back("--debug-info");
4889 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004890 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004891
4892 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4893 const InputInfo &Input = Inputs[0];
4894 assert(Input.isFilename() && "Unexpected verify input");
4895
4896 // Grabbing the output of the earlier dsymutil run.
4897 CmdArgs.push_back(Input.getFilename());
4898
4899 const char *Exec =
4900 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4901 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4902}
4903
David Chisnall31c46902012-02-15 13:39:01 +00004904void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4905 const InputInfo &Output,
4906 const InputInfoList &Inputs,
4907 const ArgList &Args,
4908 const char *LinkingOutput) const {
4909 ArgStringList CmdArgs;
4910
4911 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4912 options::OPT_Xassembler);
4913
4914 CmdArgs.push_back("-o");
4915 CmdArgs.push_back(Output.getFilename());
4916
4917 for (InputInfoList::const_iterator
4918 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4919 const InputInfo &II = *it;
4920 CmdArgs.push_back(II.getFilename());
4921 }
4922
4923 const char *Exec =
4924 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4925 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4926}
4927
4928
4929void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4930 const InputInfo &Output,
4931 const InputInfoList &Inputs,
4932 const ArgList &Args,
4933 const char *LinkingOutput) const {
4934 // FIXME: Find a real GCC, don't hard-code versions here
4935 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4936 const llvm::Triple &T = getToolChain().getTriple();
4937 std::string LibPath = "/usr/lib/";
4938 llvm::Triple::ArchType Arch = T.getArch();
4939 switch (Arch) {
4940 case llvm::Triple::x86:
4941 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4942 T.getOSName()).str() + "/4.5.2/";
4943 break;
4944 case llvm::Triple::x86_64:
4945 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4946 T.getOSName()).str();
4947 GCCLibPath += "/4.5.2/amd64/";
4948 LibPath += "amd64/";
4949 break;
4950 default:
4951 assert(0 && "Unsupported architecture");
4952 }
4953
4954 ArgStringList CmdArgs;
4955
David Chisnall41d476d2012-02-29 15:06:12 +00004956 // Demangle C++ names in errors
4957 CmdArgs.push_back("-C");
4958
David Chisnall31c46902012-02-15 13:39:01 +00004959 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4960 (!Args.hasArg(options::OPT_shared))) {
4961 CmdArgs.push_back("-e");
4962 CmdArgs.push_back("_start");
4963 }
4964
4965 if (Args.hasArg(options::OPT_static)) {
4966 CmdArgs.push_back("-Bstatic");
4967 CmdArgs.push_back("-dn");
4968 } else {
4969 CmdArgs.push_back("-Bdynamic");
4970 if (Args.hasArg(options::OPT_shared)) {
4971 CmdArgs.push_back("-shared");
4972 } else {
4973 CmdArgs.push_back("--dynamic-linker");
4974 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4975 }
4976 }
4977
4978 if (Output.isFilename()) {
4979 CmdArgs.push_back("-o");
4980 CmdArgs.push_back(Output.getFilename());
4981 } else {
4982 assert(Output.isNothing() && "Invalid output.");
4983 }
4984
4985 if (!Args.hasArg(options::OPT_nostdlib) &&
4986 !Args.hasArg(options::OPT_nostartfiles)) {
4987 if (!Args.hasArg(options::OPT_shared)) {
4988 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4989 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004990 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004991 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4992 } else {
4993 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004994 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4995 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004996 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004997 if (getToolChain().getDriver().CCCIsCXX)
4998 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004999 }
5000
5001 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5002
5003 Args.AddAllArgs(CmdArgs, options::OPT_L);
5004 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5005 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005006 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005007
5008 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5009
5010 if (!Args.hasArg(options::OPT_nostdlib) &&
5011 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00005012 if (getToolChain().getDriver().CCCIsCXX)
5013 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005014 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005015 if (!Args.hasArg(options::OPT_shared)) {
5016 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005017 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005018 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005019 }
David Chisnall31c46902012-02-15 13:39:01 +00005020 }
5021
5022 if (!Args.hasArg(options::OPT_nostdlib) &&
5023 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005024 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005025 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005026 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005027
5028 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5029
5030 const char *Exec =
5031 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5032 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5033}
5034
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005035void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005036 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005037 const InputInfoList &Inputs,
5038 const ArgList &Args,
5039 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005040 ArgStringList CmdArgs;
5041
5042 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5043 options::OPT_Xassembler);
5044
5045 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005046 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005047
5048 for (InputInfoList::const_iterator
5049 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5050 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005051 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005052 }
5053
5054 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005055 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005057}
5058
5059void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005060 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005061 const InputInfoList &Inputs,
5062 const ArgList &Args,
5063 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005064 ArgStringList CmdArgs;
5065
5066 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005067 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005068 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005069 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005070 }
5071
5072 if (Args.hasArg(options::OPT_static)) {
5073 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005074 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005075 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005076// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005077 CmdArgs.push_back("-Bdynamic");
5078 if (Args.hasArg(options::OPT_shared)) {
5079 CmdArgs.push_back("-shared");
5080 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005081 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005082 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5083 }
5084 }
5085
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005086 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005087 CmdArgs.push_back("-o");
5088 CmdArgs.push_back(Output.getFilename());
5089 } else {
5090 assert(Output.isNothing() && "Invalid output.");
5091 }
5092
5093 if (!Args.hasArg(options::OPT_nostdlib) &&
5094 !Args.hasArg(options::OPT_nostartfiles)) {
5095 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005096 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005097 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005098 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005099 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005100 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005101 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005102 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005103 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005104 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005105 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005106 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005107 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005108 }
5109
Daniel Dunbar294691e2009-11-04 06:24:38 +00005110 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5111 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005112 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005113
5114 Args.AddAllArgs(CmdArgs, options::OPT_L);
5115 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5116 Args.AddAllArgs(CmdArgs, options::OPT_e);
5117
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005118 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005119
5120 if (!Args.hasArg(options::OPT_nostdlib) &&
5121 !Args.hasArg(options::OPT_nodefaultlibs)) {
5122 // FIXME: For some reason GCC passes -lgcc before adding
5123 // the default system libraries. Just mimic this for now.
5124 CmdArgs.push_back("-lgcc");
5125
5126 if (Args.hasArg(options::OPT_pthread))
5127 CmdArgs.push_back("-pthread");
5128 if (!Args.hasArg(options::OPT_shared))
5129 CmdArgs.push_back("-lc");
5130 CmdArgs.push_back("-lgcc");
5131 }
5132
5133 if (!Args.hasArg(options::OPT_nostdlib) &&
5134 !Args.hasArg(options::OPT_nostartfiles)) {
5135 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005136 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005137 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005138 }
5139
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005140 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005141
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005142 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005143 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005144 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005145}
5146
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005147void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005148 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005149 const InputInfoList &Inputs,
5150 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005151 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005152 ArgStringList CmdArgs;
5153
5154 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5155 options::OPT_Xassembler);
5156
5157 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005158 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005159
5160 for (InputInfoList::const_iterator
5161 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5162 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005163 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005164 }
5165
5166 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005167 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005168 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005169}
5170
5171void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005172 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005173 const InputInfoList &Inputs,
5174 const ArgList &Args,
5175 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005176 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005177 ArgStringList CmdArgs;
5178
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005179 // Silence warning for "clang -g foo.o -o foo"
5180 Args.ClaimAllArgs(options::OPT_g_Group);
5181 // and "clang -emit-llvm foo.o -o foo"
5182 Args.ClaimAllArgs(options::OPT_emit_llvm);
5183 // and for "clang -w foo.o -o foo". Other warning options are already
5184 // handled somewhere else.
5185 Args.ClaimAllArgs(options::OPT_w);
5186
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005187 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005188 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005189 CmdArgs.push_back("-e");
5190 CmdArgs.push_back("__start");
5191 }
5192
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005193 if (Args.hasArg(options::OPT_static)) {
5194 CmdArgs.push_back("-Bstatic");
5195 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005196 if (Args.hasArg(options::OPT_rdynamic))
5197 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005198 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005199 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005200 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005201 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005202 } else {
5203 CmdArgs.push_back("-dynamic-linker");
5204 CmdArgs.push_back("/usr/libexec/ld.so");
5205 }
5206 }
5207
Rafael Espindola9adba392013-06-05 04:28:55 +00005208 if (Args.hasArg(options::OPT_nopie))
5209 CmdArgs.push_back("-nopie");
5210
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005211 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005212 CmdArgs.push_back("-o");
5213 CmdArgs.push_back(Output.getFilename());
5214 } else {
5215 assert(Output.isNothing() && "Invalid output.");
5216 }
5217
5218 if (!Args.hasArg(options::OPT_nostdlib) &&
5219 !Args.hasArg(options::OPT_nostartfiles)) {
5220 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005221 if (Args.hasArg(options::OPT_pg))
5222 CmdArgs.push_back(Args.MakeArgString(
5223 getToolChain().GetFilePath("gcrt0.o")));
5224 else
5225 CmdArgs.push_back(Args.MakeArgString(
5226 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005227 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005228 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005229 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005230 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005231 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005232 }
5233 }
5234
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005235 std::string Triple = getToolChain().getTripleString();
5236 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005237 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005238 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005239 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005240
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005241 Args.AddAllArgs(CmdArgs, options::OPT_L);
5242 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5243 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005244 Args.AddAllArgs(CmdArgs, options::OPT_s);
5245 Args.AddAllArgs(CmdArgs, options::OPT_t);
5246 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5247 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005248
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005249 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005250
5251 if (!Args.hasArg(options::OPT_nostdlib) &&
5252 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00005253 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005254 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005255 if (Args.hasArg(options::OPT_pg))
5256 CmdArgs.push_back("-lm_p");
5257 else
5258 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005259 }
5260
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005261 // FIXME: For some reason GCC passes -lgcc before adding
5262 // the default system libraries. Just mimic this for now.
5263 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005264
Eric Christopherdc6cc872012-09-13 06:32:34 +00005265 if (Args.hasArg(options::OPT_pthread)) {
5266 if (!Args.hasArg(options::OPT_shared) &&
5267 Args.hasArg(options::OPT_pg))
5268 CmdArgs.push_back("-lpthread_p");
5269 else
5270 CmdArgs.push_back("-lpthread");
5271 }
5272
Chandler Carruth657849c2011-12-17 22:32:42 +00005273 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005274 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005275 CmdArgs.push_back("-lc_p");
5276 else
5277 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005278 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005279
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005280 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005281 }
5282
5283 if (!Args.hasArg(options::OPT_nostdlib) &&
5284 !Args.hasArg(options::OPT_nostartfiles)) {
5285 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005286 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005287 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005288 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005289 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005290 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005291 }
5292
5293 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005294 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005295 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005296}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005297
Eli Friedman42f74f22012-08-08 23:57:20 +00005298void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5299 const InputInfo &Output,
5300 const InputInfoList &Inputs,
5301 const ArgList &Args,
5302 const char *LinkingOutput) const {
5303 ArgStringList CmdArgs;
5304
5305 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5306 options::OPT_Xassembler);
5307
5308 CmdArgs.push_back("-o");
5309 CmdArgs.push_back(Output.getFilename());
5310
5311 for (InputInfoList::const_iterator
5312 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5313 const InputInfo &II = *it;
5314 CmdArgs.push_back(II.getFilename());
5315 }
5316
5317 const char *Exec =
5318 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5319 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5320}
5321
5322void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5323 const InputInfo &Output,
5324 const InputInfoList &Inputs,
5325 const ArgList &Args,
5326 const char *LinkingOutput) const {
5327 const Driver &D = getToolChain().getDriver();
5328 ArgStringList CmdArgs;
5329
5330 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5331 (!Args.hasArg(options::OPT_shared))) {
5332 CmdArgs.push_back("-e");
5333 CmdArgs.push_back("__start");
5334 }
5335
5336 if (Args.hasArg(options::OPT_static)) {
5337 CmdArgs.push_back("-Bstatic");
5338 } else {
5339 if (Args.hasArg(options::OPT_rdynamic))
5340 CmdArgs.push_back("-export-dynamic");
5341 CmdArgs.push_back("--eh-frame-hdr");
5342 CmdArgs.push_back("-Bdynamic");
5343 if (Args.hasArg(options::OPT_shared)) {
5344 CmdArgs.push_back("-shared");
5345 } else {
5346 CmdArgs.push_back("-dynamic-linker");
5347 CmdArgs.push_back("/usr/libexec/ld.so");
5348 }
5349 }
5350
5351 if (Output.isFilename()) {
5352 CmdArgs.push_back("-o");
5353 CmdArgs.push_back(Output.getFilename());
5354 } else {
5355 assert(Output.isNothing() && "Invalid output.");
5356 }
5357
5358 if (!Args.hasArg(options::OPT_nostdlib) &&
5359 !Args.hasArg(options::OPT_nostartfiles)) {
5360 if (!Args.hasArg(options::OPT_shared)) {
5361 if (Args.hasArg(options::OPT_pg))
5362 CmdArgs.push_back(Args.MakeArgString(
5363 getToolChain().GetFilePath("gcrt0.o")));
5364 else
5365 CmdArgs.push_back(Args.MakeArgString(
5366 getToolChain().GetFilePath("crt0.o")));
5367 CmdArgs.push_back(Args.MakeArgString(
5368 getToolChain().GetFilePath("crtbegin.o")));
5369 } else {
5370 CmdArgs.push_back(Args.MakeArgString(
5371 getToolChain().GetFilePath("crtbeginS.o")));
5372 }
5373 }
5374
5375 Args.AddAllArgs(CmdArgs, options::OPT_L);
5376 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5377 Args.AddAllArgs(CmdArgs, options::OPT_e);
5378
5379 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5380
5381 if (!Args.hasArg(options::OPT_nostdlib) &&
5382 !Args.hasArg(options::OPT_nodefaultlibs)) {
5383 if (D.CCCIsCXX) {
5384 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5385 if (Args.hasArg(options::OPT_pg))
5386 CmdArgs.push_back("-lm_p");
5387 else
5388 CmdArgs.push_back("-lm");
5389 }
5390
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005391 if (Args.hasArg(options::OPT_pthread)) {
5392 if (!Args.hasArg(options::OPT_shared) &&
5393 Args.hasArg(options::OPT_pg))
5394 CmdArgs.push_back("-lpthread_p");
5395 else
5396 CmdArgs.push_back("-lpthread");
5397 }
5398
Eli Friedman42f74f22012-08-08 23:57:20 +00005399 if (!Args.hasArg(options::OPT_shared)) {
5400 if (Args.hasArg(options::OPT_pg))
5401 CmdArgs.push_back("-lc_p");
5402 else
5403 CmdArgs.push_back("-lc");
5404 }
5405
5406 std::string myarch = "-lclang_rt.";
5407 const llvm::Triple &T = getToolChain().getTriple();
5408 llvm::Triple::ArchType Arch = T.getArch();
5409 switch (Arch) {
5410 case llvm::Triple::arm:
5411 myarch += ("arm");
5412 break;
5413 case llvm::Triple::x86:
5414 myarch += ("i386");
5415 break;
5416 case llvm::Triple::x86_64:
5417 myarch += ("amd64");
5418 break;
5419 default:
5420 assert(0 && "Unsupported architecture");
5421 }
5422 CmdArgs.push_back(Args.MakeArgString(myarch));
5423 }
5424
5425 if (!Args.hasArg(options::OPT_nostdlib) &&
5426 !Args.hasArg(options::OPT_nostartfiles)) {
5427 if (!Args.hasArg(options::OPT_shared))
5428 CmdArgs.push_back(Args.MakeArgString(
5429 getToolChain().GetFilePath("crtend.o")));
5430 else
5431 CmdArgs.push_back(Args.MakeArgString(
5432 getToolChain().GetFilePath("crtendS.o")));
5433 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005434
5435 const char *Exec =
5436 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5437 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005438}
5439
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005440void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005441 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005442 const InputInfoList &Inputs,
5443 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005444 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005445 ArgStringList CmdArgs;
5446
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005447 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5448 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005449 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005450 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005451 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005452 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005453 else if (getToolChain().getArch() == llvm::Triple::mips ||
5454 getToolChain().getArch() == llvm::Triple::mipsel ||
5455 getToolChain().getArch() == llvm::Triple::mips64 ||
5456 getToolChain().getArch() == llvm::Triple::mips64el) {
5457 StringRef CPUName;
5458 StringRef ABIName;
5459 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005460
Eric Christopherc55da4b2012-09-05 21:32:44 +00005461 CmdArgs.push_back("-march");
5462 CmdArgs.push_back(CPUName.data());
5463
Eric Christopherc55da4b2012-09-05 21:32:44 +00005464 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005465 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005466
5467 if (getToolChain().getArch() == llvm::Triple::mips ||
5468 getToolChain().getArch() == llvm::Triple::mips64)
5469 CmdArgs.push_back("-EB");
5470 else
5471 CmdArgs.push_back("-EL");
5472
5473 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5474 options::OPT_fpic, options::OPT_fno_pic,
5475 options::OPT_fPIE, options::OPT_fno_PIE,
5476 options::OPT_fpie, options::OPT_fno_pie);
5477 if (LastPICArg &&
5478 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5479 LastPICArg->getOption().matches(options::OPT_fpic) ||
5480 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5481 LastPICArg->getOption().matches(options::OPT_fpie))) {
5482 CmdArgs.push_back("-KPIC");
5483 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005484 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5485 getToolChain().getArch() == llvm::Triple::thumb) {
5486 CmdArgs.push_back("-mfpu=softvfp");
5487 switch(getToolChain().getTriple().getEnvironment()) {
5488 case llvm::Triple::GNUEABI:
5489 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005490 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005491 break;
5492
5493 default:
5494 CmdArgs.push_back("-matpcs");
5495 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005496 }
Eric Christophered734732010-03-02 02:41:08 +00005497
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005498 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5499 options::OPT_Xassembler);
5500
5501 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005502 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005503
5504 for (InputInfoList::const_iterator
5505 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5506 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005507 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005508 }
5509
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005510 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005511 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005512 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005513}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005514
5515void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005516 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005517 const InputInfoList &Inputs,
5518 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005519 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005520 const toolchains::FreeBSD& ToolChain =
5521 static_cast<const toolchains::FreeBSD&>(getToolChain());
5522 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005523 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005524
5525 // Silence warning for "clang -g foo.o -o foo"
5526 Args.ClaimAllArgs(options::OPT_g_Group);
5527 // and "clang -emit-llvm foo.o -o foo"
5528 Args.ClaimAllArgs(options::OPT_emit_llvm);
5529 // and for "clang -w foo.o -o foo". Other warning options are already
5530 // handled somewhere else.
5531 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005532
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005533 if (!D.SysRoot.empty())
5534 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5535
Roman Divacky94380162012-08-28 15:09:03 +00005536 if (Args.hasArg(options::OPT_pie))
5537 CmdArgs.push_back("-pie");
5538
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005539 if (Args.hasArg(options::OPT_static)) {
5540 CmdArgs.push_back("-Bstatic");
5541 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005542 if (Args.hasArg(options::OPT_rdynamic))
5543 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005544 CmdArgs.push_back("--eh-frame-hdr");
5545 if (Args.hasArg(options::OPT_shared)) {
5546 CmdArgs.push_back("-Bshareable");
5547 } else {
5548 CmdArgs.push_back("-dynamic-linker");
5549 CmdArgs.push_back("/libexec/ld-elf.so.1");
5550 }
Roman Divacky94380162012-08-28 15:09:03 +00005551 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5552 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005553 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5554 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5555 CmdArgs.push_back("--hash-style=both");
5556 }
5557 }
5558 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005559 }
5560
5561 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5562 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005563 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005564 CmdArgs.push_back("-m");
5565 CmdArgs.push_back("elf_i386_fbsd");
5566 }
5567
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005568 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005569 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005570 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005571 }
5572
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005573 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005574 CmdArgs.push_back("-o");
5575 CmdArgs.push_back(Output.getFilename());
5576 } else {
5577 assert(Output.isNothing() && "Invalid output.");
5578 }
5579
5580 if (!Args.hasArg(options::OPT_nostdlib) &&
5581 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005582 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005583 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005584 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005585 crt1 = "gcrt1.o";
5586 else if (Args.hasArg(options::OPT_pie))
5587 crt1 = "Scrt1.o";
5588 else
5589 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005590 }
Roman Divacky94380162012-08-28 15:09:03 +00005591 if (crt1)
5592 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5593
5594 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5595
5596 const char *crtbegin = NULL;
5597 if (Args.hasArg(options::OPT_static))
5598 crtbegin = "crtbeginT.o";
5599 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5600 crtbegin = "crtbeginS.o";
5601 else
5602 crtbegin = "crtbegin.o";
5603
5604 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005605 }
5606
5607 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005608 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005609 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5610 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005611 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005612 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5613 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005614 Args.AddAllArgs(CmdArgs, options::OPT_s);
5615 Args.AddAllArgs(CmdArgs, options::OPT_t);
5616 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5617 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005618
Roman Divacky94380162012-08-28 15:09:03 +00005619 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005620
5621 if (!Args.hasArg(options::OPT_nostdlib) &&
5622 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005623 if (D.CCCIsCXX) {
Roman Divacky94380162012-08-28 15:09:03 +00005624 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005625 if (Args.hasArg(options::OPT_pg))
5626 CmdArgs.push_back("-lm_p");
5627 else
5628 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005629 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005630 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5631 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005632 if (Args.hasArg(options::OPT_pg))
5633 CmdArgs.push_back("-lgcc_p");
5634 else
5635 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005636 if (Args.hasArg(options::OPT_static)) {
5637 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005638 } else if (Args.hasArg(options::OPT_pg)) {
5639 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005640 } else {
5641 CmdArgs.push_back("--as-needed");
5642 CmdArgs.push_back("-lgcc_s");
5643 CmdArgs.push_back("--no-as-needed");
5644 }
5645
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005646 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005647 if (Args.hasArg(options::OPT_pg))
5648 CmdArgs.push_back("-lpthread_p");
5649 else
5650 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005651 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005652
Roman Divackyc16bb762011-02-10 16:59:40 +00005653 if (Args.hasArg(options::OPT_pg)) {
5654 if (Args.hasArg(options::OPT_shared))
5655 CmdArgs.push_back("-lc");
5656 else
5657 CmdArgs.push_back("-lc_p");
5658 CmdArgs.push_back("-lgcc_p");
5659 } else {
5660 CmdArgs.push_back("-lc");
5661 CmdArgs.push_back("-lgcc");
5662 }
5663
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005664 if (Args.hasArg(options::OPT_static)) {
5665 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005666 } else if (Args.hasArg(options::OPT_pg)) {
5667 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005668 } else {
5669 CmdArgs.push_back("--as-needed");
5670 CmdArgs.push_back("-lgcc_s");
5671 CmdArgs.push_back("--no-as-needed");
5672 }
5673 }
5674
5675 if (!Args.hasArg(options::OPT_nostdlib) &&
5676 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005677 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005678 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005679 else
5680 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005681 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005682 }
5683
Roman Divacky94380162012-08-28 15:09:03 +00005684 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005685
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005686 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005687 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005688 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005689}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005690
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005691void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5692 const InputInfo &Output,
5693 const InputInfoList &Inputs,
5694 const ArgList &Args,
5695 const char *LinkingOutput) const {
5696 ArgStringList CmdArgs;
5697
5698 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5699 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005700 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005701 CmdArgs.push_back("--32");
5702
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005703 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005704 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005705 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005706 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005707 CmdArgs.push_back("-EL");
5708
5709 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5710 options::OPT_Xassembler);
5711
5712 CmdArgs.push_back("-o");
5713 CmdArgs.push_back(Output.getFilename());
5714
5715 for (InputInfoList::const_iterator
5716 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5717 const InputInfo &II = *it;
5718 CmdArgs.push_back(II.getFilename());
5719 }
5720
David Chisnall5adcec12011-09-27 22:03:18 +00005721 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005722 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5723}
5724
5725void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5726 const InputInfo &Output,
5727 const InputInfoList &Inputs,
5728 const ArgList &Args,
5729 const char *LinkingOutput) const {
5730 const Driver &D = getToolChain().getDriver();
5731 ArgStringList CmdArgs;
5732
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005733 if (!D.SysRoot.empty())
5734 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5735
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005736 if (Args.hasArg(options::OPT_static)) {
5737 CmdArgs.push_back("-Bstatic");
5738 } else {
5739 if (Args.hasArg(options::OPT_rdynamic))
5740 CmdArgs.push_back("-export-dynamic");
5741 CmdArgs.push_back("--eh-frame-hdr");
5742 if (Args.hasArg(options::OPT_shared)) {
5743 CmdArgs.push_back("-Bshareable");
5744 } else {
5745 CmdArgs.push_back("-dynamic-linker");
5746 CmdArgs.push_back("/libexec/ld.elf_so");
5747 }
5748 }
5749
5750 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5751 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005752 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005753 CmdArgs.push_back("-m");
5754 CmdArgs.push_back("elf_i386");
5755 }
5756
5757 if (Output.isFilename()) {
5758 CmdArgs.push_back("-o");
5759 CmdArgs.push_back(Output.getFilename());
5760 } else {
5761 assert(Output.isNothing() && "Invalid output.");
5762 }
5763
5764 if (!Args.hasArg(options::OPT_nostdlib) &&
5765 !Args.hasArg(options::OPT_nostartfiles)) {
5766 if (!Args.hasArg(options::OPT_shared)) {
5767 CmdArgs.push_back(Args.MakeArgString(
5768 getToolChain().GetFilePath("crt0.o")));
5769 CmdArgs.push_back(Args.MakeArgString(
5770 getToolChain().GetFilePath("crti.o")));
5771 CmdArgs.push_back(Args.MakeArgString(
5772 getToolChain().GetFilePath("crtbegin.o")));
5773 } else {
5774 CmdArgs.push_back(Args.MakeArgString(
5775 getToolChain().GetFilePath("crti.o")));
5776 CmdArgs.push_back(Args.MakeArgString(
5777 getToolChain().GetFilePath("crtbeginS.o")));
5778 }
5779 }
5780
5781 Args.AddAllArgs(CmdArgs, options::OPT_L);
5782 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5783 Args.AddAllArgs(CmdArgs, options::OPT_e);
5784 Args.AddAllArgs(CmdArgs, options::OPT_s);
5785 Args.AddAllArgs(CmdArgs, options::OPT_t);
5786 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5787 Args.AddAllArgs(CmdArgs, options::OPT_r);
5788
5789 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5790
5791 if (!Args.hasArg(options::OPT_nostdlib) &&
5792 !Args.hasArg(options::OPT_nodefaultlibs)) {
5793 if (D.CCCIsCXX) {
5794 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5795 CmdArgs.push_back("-lm");
5796 }
5797 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5798 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005799 if (Args.hasArg(options::OPT_static)) {
5800 CmdArgs.push_back("-lgcc_eh");
5801 } else {
5802 CmdArgs.push_back("--as-needed");
5803 CmdArgs.push_back("-lgcc_s");
5804 CmdArgs.push_back("--no-as-needed");
5805 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005806 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005807
5808 if (Args.hasArg(options::OPT_pthread))
5809 CmdArgs.push_back("-lpthread");
5810 CmdArgs.push_back("-lc");
5811
5812 CmdArgs.push_back("-lgcc");
5813 if (Args.hasArg(options::OPT_static)) {
5814 CmdArgs.push_back("-lgcc_eh");
5815 } else {
5816 CmdArgs.push_back("--as-needed");
5817 CmdArgs.push_back("-lgcc_s");
5818 CmdArgs.push_back("--no-as-needed");
5819 }
5820 }
5821
5822 if (!Args.hasArg(options::OPT_nostdlib) &&
5823 !Args.hasArg(options::OPT_nostartfiles)) {
5824 if (!Args.hasArg(options::OPT_shared))
5825 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5826 "crtend.o")));
5827 else
5828 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5829 "crtendS.o")));
5830 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5831 "crtn.o")));
5832 }
5833
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005834 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005835
David Chisnall5adcec12011-09-27 22:03:18 +00005836 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005837 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5838}
5839
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005840void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5841 const InputInfo &Output,
5842 const InputInfoList &Inputs,
5843 const ArgList &Args,
5844 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005845 ArgStringList CmdArgs;
5846
5847 // Add --32/--64 to make sure we get the format we want.
5848 // This is incomplete
5849 if (getToolChain().getArch() == llvm::Triple::x86) {
5850 CmdArgs.push_back("--32");
5851 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5852 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005853 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5854 CmdArgs.push_back("-a32");
5855 CmdArgs.push_back("-mppc");
5856 CmdArgs.push_back("-many");
5857 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5858 CmdArgs.push_back("-a64");
5859 CmdArgs.push_back("-mppc64");
5860 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005861 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005862 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005863 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5864 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005865
5866 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5867 getToolChain().getTriple());
5868 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005869
5870 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5871 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5872 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005873 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5874 getToolChain().getArch() == llvm::Triple::mipsel ||
5875 getToolChain().getArch() == llvm::Triple::mips64 ||
5876 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005877 StringRef CPUName;
5878 StringRef ABIName;
5879 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005880
Simon Atanasyan073a7802012-04-07 22:31:29 +00005881 CmdArgs.push_back("-march");
5882 CmdArgs.push_back(CPUName.data());
5883
Simon Atanasyan073a7802012-04-07 22:31:29 +00005884 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005885 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005886
5887 if (getToolChain().getArch() == llvm::Triple::mips ||
5888 getToolChain().getArch() == llvm::Triple::mips64)
5889 CmdArgs.push_back("-EB");
5890 else
5891 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005892
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00005893 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
5894 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
5895 options::OPT_mno_micromips);
5896 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
5897 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
5898
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005899 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5900 options::OPT_fpic, options::OPT_fno_pic,
5901 options::OPT_fPIE, options::OPT_fno_PIE,
5902 options::OPT_fpie, options::OPT_fno_pie);
5903 if (LastPICArg &&
5904 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5905 LastPICArg->getOption().matches(options::OPT_fpic) ||
5906 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5907 LastPICArg->getOption().matches(options::OPT_fpie))) {
5908 CmdArgs.push_back("-KPIC");
5909 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00005910 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
5911 // At the moment we always produce z10 code.
5912 CmdArgs.push_back("-march=z10");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005913 }
5914
5915 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5916 options::OPT_Xassembler);
5917
5918 CmdArgs.push_back("-o");
5919 CmdArgs.push_back(Output.getFilename());
5920
5921 for (InputInfoList::const_iterator
5922 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5923 const InputInfo &II = *it;
5924 CmdArgs.push_back(II.getFilename());
5925 }
5926
5927 const char *Exec =
5928 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5929 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00005930
5931 // Handle the debug info splitting at object creation time if we're
5932 // creating an object.
5933 // TODO: Currently only works on linux with newer objcopy.
5934 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
5935 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
5936 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5937 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005938}
5939
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005940static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5941 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005942 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00005943 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5944 Args.hasArg(options::OPT_static);
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005945 if (!D.CCCIsCXX)
5946 CmdArgs.push_back("-lgcc");
5947
Logan Chien529a73d2012-11-19 12:04:11 +00005948 if (StaticLibgcc || isAndroid) {
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005949 if (D.CCCIsCXX)
5950 CmdArgs.push_back("-lgcc");
5951 } else {
5952 if (!D.CCCIsCXX)
5953 CmdArgs.push_back("--as-needed");
5954 CmdArgs.push_back("-lgcc_s");
5955 if (!D.CCCIsCXX)
5956 CmdArgs.push_back("--no-as-needed");
5957 }
5958
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005959 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005960 CmdArgs.push_back("-lgcc_eh");
5961 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5962 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00005963
5964 // According to Android ABI, we have to link with libdl if we are
5965 // linking with non-static libgcc.
5966 //
5967 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5968 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5969 if (isAndroid && !StaticLibgcc)
5970 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005971}
5972
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005973static bool hasMipsN32ABIArg(const ArgList &Args) {
5974 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00005975 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005976}
5977
Peter Collingbournebdaa1342013-05-27 21:40:20 +00005978static StringRef getLinuxDynamicLinker(const ArgList &Args,
5979 const toolchains::Linux &ToolChain) {
5980 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
5981 return "/system/bin/linker";
5982 else if (ToolChain.getArch() == llvm::Triple::x86)
5983 return "/lib/ld-linux.so.2";
5984 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5985 return "/lib/ld-linux-aarch64.so.1";
5986 else if (ToolChain.getArch() == llvm::Triple::arm ||
5987 ToolChain.getArch() == llvm::Triple::thumb) {
5988 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5989 return "/lib/ld-linux-armhf.so.3";
5990 else
5991 return "/lib/ld-linux.so.3";
5992 } else if (ToolChain.getArch() == llvm::Triple::mips ||
5993 ToolChain.getArch() == llvm::Triple::mipsel)
5994 return "/lib/ld.so.1";
5995 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5996 ToolChain.getArch() == llvm::Triple::mips64el) {
5997 if (hasMipsN32ABIArg(Args))
5998 return "/lib32/ld.so.1";
5999 else
6000 return "/lib64/ld.so.1";
6001 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6002 return "/lib/ld.so.1";
6003 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6004 ToolChain.getArch() == llvm::Triple::systemz)
6005 return "/lib64/ld64.so.1";
6006 else
6007 return "/lib64/ld-linux-x86-64.so.2";
6008}
6009
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006010void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6011 const InputInfo &Output,
6012 const InputInfoList &Inputs,
6013 const ArgList &Args,
6014 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00006015 const toolchains::Linux& ToolChain =
6016 static_cast<const toolchains::Linux&>(getToolChain());
6017 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00006018 const bool isAndroid =
6019 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006020 SanitizerArgs Sanitize(getToolChain(), Args);
6021 const bool IsPIE =
6022 !Args.hasArg(options::OPT_shared) &&
6023 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006024
Rafael Espindolac1da9812010-11-07 20:14:31 +00006025 ArgStringList CmdArgs;
6026
Rafael Espindola26f14c32010-11-15 18:28:16 +00006027 // Silence warning for "clang -g foo.o -o foo"
6028 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006029 // and "clang -emit-llvm foo.o -o foo"
6030 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00006031 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00006032 // handled somewhere else.
6033 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00006034
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006035 if (!D.SysRoot.empty())
6036 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006037
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006038 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00006039 CmdArgs.push_back("-pie");
6040
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00006041 if (Args.hasArg(options::OPT_rdynamic))
6042 CmdArgs.push_back("-export-dynamic");
6043
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00006044 if (Args.hasArg(options::OPT_s))
6045 CmdArgs.push_back("-s");
6046
Rafael Espindolac1da9812010-11-07 20:14:31 +00006047 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6048 e = ToolChain.ExtraOpts.end();
6049 i != e; ++i)
6050 CmdArgs.push_back(i->c_str());
6051
6052 if (!Args.hasArg(options::OPT_static)) {
6053 CmdArgs.push_back("--eh-frame-hdr");
6054 }
6055
6056 CmdArgs.push_back("-m");
6057 if (ToolChain.getArch() == llvm::Triple::x86)
6058 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00006059 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6060 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00006061 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00006062 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006063 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00006064 else if (ToolChain.getArch() == llvm::Triple::ppc)
6065 CmdArgs.push_back("elf32ppclinux");
6066 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6067 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00006068 else if (ToolChain.getArch() == llvm::Triple::mips)
6069 CmdArgs.push_back("elf32btsmip");
6070 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6071 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006072 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6073 if (hasMipsN32ABIArg(Args))
6074 CmdArgs.push_back("elf32btsmipn32");
6075 else
6076 CmdArgs.push_back("elf64btsmip");
6077 }
6078 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6079 if (hasMipsN32ABIArg(Args))
6080 CmdArgs.push_back("elf32ltsmipn32");
6081 else
6082 CmdArgs.push_back("elf64ltsmip");
6083 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006084 else if (ToolChain.getArch() == llvm::Triple::systemz)
6085 CmdArgs.push_back("elf64_s390");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006086 else
6087 CmdArgs.push_back("elf_x86_64");
6088
6089 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00006090 if (ToolChain.getArch() == llvm::Triple::arm
6091 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006092 CmdArgs.push_back("-Bstatic");
6093 else
6094 CmdArgs.push_back("-static");
6095 } else if (Args.hasArg(options::OPT_shared)) {
6096 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00006097 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006098 CmdArgs.push_back("-Bsymbolic");
6099 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006100 }
6101
6102 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00006103 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00006104 (!Args.hasArg(options::OPT_static) &&
6105 !Args.hasArg(options::OPT_shared))) {
6106 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006107 CmdArgs.push_back(Args.MakeArgString(
6108 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006109 }
6110
6111 CmdArgs.push_back("-o");
6112 CmdArgs.push_back(Output.getFilename());
6113
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006114 if (!Args.hasArg(options::OPT_nostdlib) &&
6115 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006116 if (!isAndroid) {
6117 const char *crt1 = NULL;
6118 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00006119 if (Args.hasArg(options::OPT_pg))
6120 crt1 = "gcrt1.o";
6121 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006122 crt1 = "Scrt1.o";
6123 else
6124 crt1 = "crt1.o";
6125 }
6126 if (crt1)
6127 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006128
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006129 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6130 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006131
Rafael Espindola89414b32010-11-12 03:00:39 +00006132 const char *crtbegin;
6133 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006134 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006135 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006136 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006137 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006138 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006139 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006140 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006141 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00006142
6143 // Add crtfastmath.o if available and fast math is enabled.
6144 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00006145 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006146
6147 Args.AddAllArgs(CmdArgs, options::OPT_L);
6148
6149 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6150
Roman Divacky58e5ac92011-03-01 17:53:14 +00006151 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6152 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006153 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006154
Rafael Espindolac5151542012-04-09 23:53:34 +00006155 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6156 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6157 // forward.
6158 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6159 CmdArgs.push_back("-plugin");
6160 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6161 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006162
6163 // Try to pass driver level flags relevant to LTO code generation down to
6164 // the plugin.
6165
6166 // Handle architecture-specific flags for selecting CPU variants.
6167 if (ToolChain.getArch() == llvm::Triple::x86 ||
6168 ToolChain.getArch() == llvm::Triple::x86_64)
6169 CmdArgs.push_back(
6170 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6171 getX86TargetCPU(Args, ToolChain.getTriple())));
6172 else if (ToolChain.getArch() == llvm::Triple::arm ||
6173 ToolChain.getArch() == llvm::Triple::thumb)
6174 CmdArgs.push_back(
6175 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6176 getARMTargetCPU(Args, ToolChain.getTriple())));
6177
6178 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6179 // as well.
Rafael Espindolac5151542012-04-09 23:53:34 +00006180 }
6181
Chandler Carruth700d4e42013-01-13 11:46:33 +00006182
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006183 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6184 CmdArgs.push_back("--no-demangle");
6185
Rafael Espindolac1da9812010-11-07 20:14:31 +00006186 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6187
Eric Christopher6716d942012-11-29 18:51:05 +00006188 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006189 if (Sanitize.needsUbsanRt())
Richard Smith61a574f2013-03-20 23:49:07 +00006190 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
6191 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev050309f2013-05-27 11:17:01 +00006192 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006193 if (Sanitize.needsAsanRt())
6194 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6195 if (Sanitize.needsTsanRt())
6196 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006197 if (Sanitize.needsMsanRt())
6198 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev050309f2013-05-27 11:17:01 +00006199 if (Sanitize.needsLsanRt())
6200 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006201
Chandler Carruth80a393e2013-06-24 09:38:45 +00006202 // The profile runtime also needs access to system libraries.
6203 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6204
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006205 if (D.CCCIsCXX &&
6206 !Args.hasArg(options::OPT_nostdlib) &&
6207 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006208 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6209 !Args.hasArg(options::OPT_static);
6210 if (OnlyLibstdcxxStatic)
6211 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006212 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006213 if (OnlyLibstdcxxStatic)
6214 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006215 CmdArgs.push_back("-lm");
6216 }
6217
Rafael Espindola89414b32010-11-12 03:00:39 +00006218 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006219 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6220 if (Args.hasArg(options::OPT_static))
6221 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006222
Chandler Carruthdf96e022013-01-17 13:19:29 +00006223 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6224 if (OpenMP) {
6225 CmdArgs.push_back("-lgomp");
6226
6227 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6228 // librt. Most modern Linux platfroms require it, but some may not.
6229 CmdArgs.push_back("-lrt");
6230 }
6231
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006232 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006233
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006234 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006235 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006236 CmdArgs.push_back("-lpthread");
6237
6238 CmdArgs.push_back("-lc");
6239
6240 if (Args.hasArg(options::OPT_static))
6241 CmdArgs.push_back("--end-group");
6242 else
6243 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6244 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006245
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006246 if (!Args.hasArg(options::OPT_nostartfiles)) {
6247 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006248 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006249 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006250 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006251 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006252 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006253 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006254
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006255 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006256 if (!isAndroid)
6257 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006258 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006259 }
6260
Rafael Espindolac1da9812010-11-07 20:14:31 +00006261 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6262}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006263
Chris Lattner38e317d2010-07-07 16:01:42 +00006264void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006265 const InputInfo &Output,
6266 const InputInfoList &Inputs,
6267 const ArgList &Args,
6268 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006269 ArgStringList CmdArgs;
6270
6271 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6272 options::OPT_Xassembler);
6273
6274 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006275 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006276
6277 for (InputInfoList::const_iterator
6278 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6279 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006280 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006281 }
6282
6283 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006284 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006285 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006286}
6287
6288void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006289 const InputInfo &Output,
6290 const InputInfoList &Inputs,
6291 const ArgList &Args,
6292 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006293 const Driver &D = getToolChain().getDriver();
6294 ArgStringList CmdArgs;
6295
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006296 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006297 CmdArgs.push_back("-o");
6298 CmdArgs.push_back(Output.getFilename());
6299 } else {
6300 assert(Output.isNothing() && "Invalid output.");
6301 }
6302
6303 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006304 !Args.hasArg(options::OPT_nostartfiles)) {
6305 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6306 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6307 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6308 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6309 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006310
6311 Args.AddAllArgs(CmdArgs, options::OPT_L);
6312 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6313 Args.AddAllArgs(CmdArgs, options::OPT_e);
6314
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006315 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006316
Eli Friedman6d402dc2011-12-08 23:54:21 +00006317 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6318
Chris Lattner38e317d2010-07-07 16:01:42 +00006319 if (!Args.hasArg(options::OPT_nostdlib) &&
6320 !Args.hasArg(options::OPT_nodefaultlibs)) {
6321 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006322 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006323 CmdArgs.push_back("-lm");
6324 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006325 }
6326
6327 if (!Args.hasArg(options::OPT_nostdlib) &&
6328 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006329 if (Args.hasArg(options::OPT_pthread))
6330 CmdArgs.push_back("-lpthread");
6331 CmdArgs.push_back("-lc");
6332 CmdArgs.push_back("-lCompilerRT-Generic");
6333 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6334 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006335 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006336 }
6337
Eli Friedman6d402dc2011-12-08 23:54:21 +00006338 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006339 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006340}
6341
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006342/// DragonFly Tools
6343
6344// For now, DragonFly Assemble does just about the same as for
6345// FreeBSD, but this may change soon.
6346void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006347 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006348 const InputInfoList &Inputs,
6349 const ArgList &Args,
6350 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006351 ArgStringList CmdArgs;
6352
6353 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6354 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006355 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006356 CmdArgs.push_back("--32");
6357
6358 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6359 options::OPT_Xassembler);
6360
6361 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006362 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006363
6364 for (InputInfoList::const_iterator
6365 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6366 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006367 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006368 }
6369
6370 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006371 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006372 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006373}
6374
6375void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006376 const InputInfo &Output,
6377 const InputInfoList &Inputs,
6378 const ArgList &Args,
6379 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006380 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006381 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006382 ArgStringList CmdArgs;
6383
John McCall8cfb7202013-04-11 22:55:55 +00006384 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6385 UseGCC47 = false;
6386
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006387 if (!D.SysRoot.empty())
6388 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6389
John McCall8cfb7202013-04-11 22:55:55 +00006390 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006391 if (Args.hasArg(options::OPT_static)) {
6392 CmdArgs.push_back("-Bstatic");
6393 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006394 if (Args.hasArg(options::OPT_rdynamic))
6395 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006396 if (Args.hasArg(options::OPT_shared))
6397 CmdArgs.push_back("-Bshareable");
6398 else {
6399 CmdArgs.push_back("-dynamic-linker");
6400 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6401 }
John McCall8cfb7202013-04-11 22:55:55 +00006402 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006403 }
6404
6405 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6406 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006407 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006408 CmdArgs.push_back("-m");
6409 CmdArgs.push_back("elf_i386");
6410 }
6411
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006412 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006413 CmdArgs.push_back("-o");
6414 CmdArgs.push_back(Output.getFilename());
6415 } else {
6416 assert(Output.isNothing() && "Invalid output.");
6417 }
6418
6419 if (!Args.hasArg(options::OPT_nostdlib) &&
6420 !Args.hasArg(options::OPT_nostartfiles)) {
6421 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006422 if (Args.hasArg(options::OPT_pg))
6423 CmdArgs.push_back(Args.MakeArgString(
6424 getToolChain().GetFilePath("gcrt1.o")));
6425 else {
6426 if (Args.hasArg(options::OPT_pie))
6427 CmdArgs.push_back(Args.MakeArgString(
6428 getToolChain().GetFilePath("Scrt1.o")));
6429 else
6430 CmdArgs.push_back(Args.MakeArgString(
6431 getToolChain().GetFilePath("crt1.o")));
6432 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006433 }
John McCall8cfb7202013-04-11 22:55:55 +00006434 CmdArgs.push_back(Args.MakeArgString(
6435 getToolChain().GetFilePath("crti.o")));
6436 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6437 CmdArgs.push_back(Args.MakeArgString(
6438 getToolChain().GetFilePath("crtbeginS.o")));
6439 else
6440 CmdArgs.push_back(Args.MakeArgString(
6441 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006442 }
6443
6444 Args.AddAllArgs(CmdArgs, options::OPT_L);
6445 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6446 Args.AddAllArgs(CmdArgs, options::OPT_e);
6447
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006448 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006449
6450 if (!Args.hasArg(options::OPT_nostdlib) &&
6451 !Args.hasArg(options::OPT_nodefaultlibs)) {
6452 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6453 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006454 if (UseGCC47)
6455 CmdArgs.push_back("-L/usr/lib/gcc47");
6456 else
6457 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006458
6459 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006460 if (UseGCC47) {
6461 CmdArgs.push_back("-rpath");
6462 CmdArgs.push_back("/usr/lib/gcc47");
6463 } else {
6464 CmdArgs.push_back("-rpath");
6465 CmdArgs.push_back("/usr/lib/gcc44");
6466 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006467 }
6468
Rafael Espindola405861d2010-07-20 12:59:03 +00006469 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006470 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006471 CmdArgs.push_back("-lm");
6472 }
6473
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006474 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006475 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006476
6477 if (!Args.hasArg(options::OPT_nolibc)) {
6478 CmdArgs.push_back("-lc");
6479 }
6480
John McCall8cfb7202013-04-11 22:55:55 +00006481 if (UseGCC47) {
6482 if (Args.hasArg(options::OPT_static) ||
6483 Args.hasArg(options::OPT_static_libgcc)) {
6484 CmdArgs.push_back("-lgcc");
6485 CmdArgs.push_back("-lgcc_eh");
6486 } else {
6487 if (Args.hasArg(options::OPT_shared_libgcc)) {
6488 CmdArgs.push_back("-lgcc_pic");
6489 if (!Args.hasArg(options::OPT_shared))
6490 CmdArgs.push_back("-lgcc");
6491 } else {
6492 CmdArgs.push_back("-lgcc");
6493 CmdArgs.push_back("--as-needed");
6494 CmdArgs.push_back("-lgcc_pic");
6495 CmdArgs.push_back("--no-as-needed");
6496 }
6497 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006498 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006499 if (Args.hasArg(options::OPT_shared)) {
6500 CmdArgs.push_back("-lgcc_pic");
6501 } else {
6502 CmdArgs.push_back("-lgcc");
6503 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006504 }
6505 }
6506
6507 if (!Args.hasArg(options::OPT_nostdlib) &&
6508 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006509 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006510 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006511 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006512 else
6513 CmdArgs.push_back(Args.MakeArgString(
6514 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006515 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006516 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006517 }
6518
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006519 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006520
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006521 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006522 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006523 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006524}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006525
6526void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6527 const InputInfo &Output,
6528 const InputInfoList &Inputs,
6529 const ArgList &Args,
6530 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006531 ArgStringList CmdArgs;
6532
6533 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006534 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6535 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006536 } else {
6537 assert(Output.isNothing() && "Invalid output.");
6538 }
6539
6540 if (!Args.hasArg(options::OPT_nostdlib) &&
6541 !Args.hasArg(options::OPT_nostartfiles)) {
6542 CmdArgs.push_back("-defaultlib:libcmt");
6543 }
6544
6545 CmdArgs.push_back("-nologo");
6546
Michael J. Spencera2284f52012-06-18 16:56:04 +00006547 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6548
6549 // Add filenames immediately.
6550 for (InputInfoList::const_iterator
6551 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6552 if (it->isFilename())
6553 CmdArgs.push_back(it->getFilename());
6554 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006555
6556 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006557 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006558 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6559}