blob: 4a105ab8e09d0f510e61616f5288017350e8a957 [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"
Chandler Carruth55fc8732012-12-04 09:13:33 +000012#include "ToolChains.h"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderby02341792013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbar1d460332009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.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))
Hans Wennborg76b86c22013-07-18 20:29:38 +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 &&
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000231 !O.hasFlag(options::DriverOption) &&
232 !O.hasFlag(options::LinkerInput);
233}
234
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000235void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier9d718632013-01-24 19:14:47 +0000236 const JobAction &JA,
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000237 const Driver &D,
Douglas Gregordf91ef32009-04-18 00:34:01 +0000238 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000239 ArgStringList &CmdArgs,
240 const InputInfo &Output,
241 const InputInfoList &Inputs) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000242 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000243
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000244 CheckPreprocessingOptions(D, Args);
245
246 Args.AddLastArg(CmdArgs, options::OPT_C);
247 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000248
249 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000250 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000251 (A = Args.getLastArg(options::OPT_MD)) ||
252 (A = Args.getLastArg(options::OPT_MMD))) {
253 // Determine the output location.
254 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000255 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000256 DepFile = MF->getValue();
Chad Rosier9d718632013-01-24 19:14:47 +0000257 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000258 } else if (Output.getType() == types::TY_Dependencies) {
259 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000260 } else if (A->getOption().matches(options::OPT_M) ||
261 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000262 DepFile = "-";
263 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +0000264 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000265 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000266 }
267 CmdArgs.push_back("-dependency-file");
268 CmdArgs.push_back(DepFile);
269
Chris Lattner3edbeb72010-03-29 17:55:58 +0000270 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000271 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
272 const char *DepTarget;
273
274 // If user provided -o, that is the dependency target, except
275 // when we are only generating a dependency file.
276 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
277 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000278 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000279 } else {
280 // Otherwise derive from the base input.
281 //
282 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000283 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000284 llvm::sys::path::replace_extension(P, "o");
285 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000286 }
287
288 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000289 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000290 QuoteTarget(DepTarget, Quoted);
291 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000292 }
293
Daniel Dunbarb827a052009-11-19 03:26:40 +0000294 if (A->getOption().matches(options::OPT_M) ||
295 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000296 CmdArgs.push_back("-sys-header-deps");
297 }
298
Peter Collingbournebb527862011-07-12 19:35:15 +0000299 if (Args.hasArg(options::OPT_MG)) {
300 if (!A || A->getOption().matches(options::OPT_MD) ||
301 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000302 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000303 CmdArgs.push_back("-MG");
304 }
305
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000306 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000307
308 // Convert all -MQ <target> args to -MT <quoted target>
309 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
310 options::OPT_MQ),
311 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000312 const Arg *A = *it;
313 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000314
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000315 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000316 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000317 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000318 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000319 CmdArgs.push_back(Args.MakeArgString(Quoted));
320
321 // -MT flag - no change
322 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000323 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000324 }
325 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000326
Douglas Gregordf91ef32009-04-18 00:34:01 +0000327 // Add -i* options, and automatically translate to
328 // -include-pch/-include-pth for transparent PCH support. It's
329 // wonky, but we include looking for .gch so we can support seamless
330 // replacement into a build system already set up to be generating
331 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000332 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000333 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
334 ie = Args.filtered_end(); it != ie; ++it) {
335 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000336
337 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000338 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
339 RenderedImplicitInclude = true;
340
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000341 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000342 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000343
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000344 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000345 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000346 SmallString<128> P(A->getValue());
347 // We want the files to have a name like foo.h.pch. Add a dummy extension
348 // so that replace_extension does the right thing.
349 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000350 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000351 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000352 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000353 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000354 }
355
Douglas Gregordf91ef32009-04-18 00:34:01 +0000356 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000357 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000358 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000359 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000360 }
361
Douglas Gregordf91ef32009-04-18 00:34:01 +0000362 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000363 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000364 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000365 FoundPCH = UsePCH;
366 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000367 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000368 }
369
370 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000371 if (IsFirstImplicitInclude) {
372 A->claim();
373 if (UsePCH)
374 CmdArgs.push_back("-include-pch");
375 else
376 CmdArgs.push_back("-include-pth");
377 CmdArgs.push_back(Args.MakeArgString(P.str()));
378 continue;
379 } else {
380 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000381 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000382 << P.str() << A->getAsString(Args);
383 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000384 }
385 }
386
387 // Not translated, render as usual.
388 A->claim();
389 A->render(Args, CmdArgs);
390 }
391
392 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000393 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
394 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000395
396 // Add -Wp, and -Xassembler if using the preprocessor.
397
398 // FIXME: There is a very unfortunate problem here, some troubled
399 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
400 // really support that we would have to parse and then translate
401 // those options. :(
402 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
403 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000404
405 // -I- is a deprecated GCC feature, reject it.
406 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000407 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000408
409 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
410 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000411 StringRef sysroot = C.getSysRoot();
412 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000413 if (!Args.hasArg(options::OPT_isysroot)) {
414 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000415 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000416 }
417 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000418
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000419 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000420 // FIXME: We should probably sink the logic for handling these from the
421 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000422 // CPATH - included following the user specified includes (but prior to
423 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000424 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000425 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000426 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000427 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000428 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000429 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000431 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000433
Chandler Carruth88491fc2011-11-04 07:12:53 +0000434 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000435 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000436 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000437
438 // Add system include arguments.
439 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000440}
441
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000442/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000443/// CPU.
444//
445// FIXME: This is redundant with -mcpu, why does LLVM use this.
446// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000447static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000448 return llvm::StringSwitch<const char *>(CPU)
Tim Northover4889a1f2013-06-13 15:02:46 +0000449 .Case("strongarm", "v4")
Chad Rosierae1aee62011-10-07 17:48:56 +0000450 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
451 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
452 .Cases("arm920", "arm920t", "arm922t", "v4t")
453 .Cases("arm940t", "ep9312","v4t")
454 .Cases("arm10tdmi", "arm1020t", "v5")
455 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
456 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
457 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
458 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
459 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
460 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonfc553452013-03-04 22:37:46 +0000461 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
462 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetab137512012-12-21 17:57:47 +0000463 .Case("cortex-r5", "v7r")
Bob Wilson57f6d192012-03-21 17:19:12 +0000464 .Case("cortex-m0", "v6m")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000465 .Case("cortex-m3", "v7m")
466 .Case("cortex-m4", "v7em")
Bob Wilson336bfa32012-09-29 23:52:50 +0000467 .Case("cortex-a9-mp", "v7f")
468 .Case("swift", "v7s")
Chad Rosierae1aee62011-10-07 17:48:56 +0000469 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000470}
471
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000472/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
473//
474// FIXME: tblgen this.
475static std::string getARMTargetCPU(const ArgList &Args,
476 const llvm::Triple &Triple) {
477 // FIXME: Warn on inconsistent use of -mcpu and -march.
478
479 // If we have -mcpu=, use that.
480 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000481 StringRef MCPU = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000482 // Handle -mcpu=native.
483 if (MCPU == "native")
484 return llvm::sys::getHostCPUName();
485 else
486 return MCPU;
487 }
488
489 StringRef MArch;
490 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
491 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smith1d489cf2012-11-01 04:30:05 +0000492 MArch = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000493 } else {
494 // Otherwise, use the Arch from the triple.
495 MArch = Triple.getArchName();
496 }
497
498 // Handle -march=native.
499 std::string NativeMArch;
500 if (MArch == "native") {
501 std::string CPU = llvm::sys::getHostCPUName();
502 if (CPU != "generic") {
503 // Translate the native cpu into the architecture. The switch below will
504 // then chose the minimum cpu for that arch.
505 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
506 MArch = NativeMArch;
507 }
508 }
509
510 return llvm::StringSwitch<const char *>(MArch)
511 .Cases("armv2", "armv2a","arm2")
512 .Case("armv3", "arm6")
513 .Case("armv3m", "arm7m")
Tim Northover4889a1f2013-06-13 15:02:46 +0000514 .Case("armv4", "strongarm")
515 .Case("armv4t", "arm7tdmi")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000516 .Cases("armv5", "armv5t", "arm10tdmi")
517 .Cases("armv5e", "armv5te", "arm1022e")
518 .Case("armv5tej", "arm926ej-s")
519 .Cases("armv6", "armv6k", "arm1136jf-s")
520 .Case("armv6j", "arm1136j-s")
521 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
522 .Case("armv6t2", "arm1156t2-s")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000523 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000524 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000525 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilson336bfa32012-09-29 23:52:50 +0000526 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
527 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000528 .Cases("armv7r", "armv7-r", "cortex-r4")
529 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Gouly4ec8d5b2013-06-26 17:19:48 +0000530 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000531 .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
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000553 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000554 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000555 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000556 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000557 }
558}
559
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000560static bool isNoCommonDefault(const llvm::Triple &Triple) {
561 switch (Triple.getArch()) {
562 default:
563 return false;
564
565 case llvm::Triple::xcore:
566 return true;
567 }
568}
569
Chad Rosier99317272012-04-04 20:51:35 +0000570// Handle -mfpu=.
571//
572// FIXME: Centralize feature selection, defaulting shouldn't be also in the
573// frontend target.
574static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
575 ArgStringList &CmdArgs) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000576 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000577
578 // Set the target features based on the FPU.
579 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
580 // Disable any default FPU support.
581 CmdArgs.push_back("-target-feature");
582 CmdArgs.push_back("-vfp2");
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("-vfp3");
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("-neon");
587 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
588 CmdArgs.push_back("-target-feature");
589 CmdArgs.push_back("+vfp3");
590 CmdArgs.push_back("-target-feature");
591 CmdArgs.push_back("+d16");
592 CmdArgs.push_back("-target-feature");
593 CmdArgs.push_back("-neon");
594 } else if (FPU == "vfp") {
595 CmdArgs.push_back("-target-feature");
596 CmdArgs.push_back("+vfp2");
597 CmdArgs.push_back("-target-feature");
598 CmdArgs.push_back("-neon");
599 } else if (FPU == "vfp3" || FPU == "vfpv3") {
600 CmdArgs.push_back("-target-feature");
601 CmdArgs.push_back("+vfp3");
602 CmdArgs.push_back("-target-feature");
603 CmdArgs.push_back("-neon");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000604 } else if (FPU == "fp-armv8") {
605 CmdArgs.push_back("-target-feature");
606 CmdArgs.push_back("+v8fp");
607 } else if (FPU == "neon-fp-armv8") {
608 CmdArgs.push_back("-target-feature");
609 CmdArgs.push_back("+v8fp");
610 CmdArgs.push_back("-target-feature");
611 CmdArgs.push_back("+neon");
Chad Rosier99317272012-04-04 20:51:35 +0000612 } else if (FPU == "neon") {
613 CmdArgs.push_back("-target-feature");
614 CmdArgs.push_back("+neon");
615 } else
616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
617}
618
Chad Rosier7a938fa2012-04-04 20:39:32 +0000619// Handle -mfpmath=.
620static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000621 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000622 StringRef FPMath = A->getValue();
Chad Rosier7a938fa2012-04-04 20:39:32 +0000623
624 // Set the target features based on the FPMath.
625 if (FPMath == "neon") {
626 CmdArgs.push_back("-target-feature");
627 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000628
Bob Wilsonfc553452013-03-04 22:37:46 +0000629 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
630 CPU != "cortex-a8" && CPU != "cortex-a9" &&
631 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000632 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
633
Chad Rosier7a938fa2012-04-04 20:39:32 +0000634 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
635 FPMath == "vfp4") {
636 CmdArgs.push_back("-target-feature");
637 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000638
639 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000640 } else
641 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
642}
643
Anton Korobeynikove2571792012-04-09 13:38:30 +0000644// Select the float ABI as determined by -msoft-float, -mhard-float, and
645// -mfloat-abi=.
646static StringRef getARMFloatABI(const Driver &D,
647 const ArgList &Args,
648 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000649 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000650 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
651 options::OPT_mhard_float,
652 options::OPT_mfloat_abi_EQ)) {
653 if (A->getOption().matches(options::OPT_msoft_float))
654 FloatABI = "soft";
655 else if (A->getOption().matches(options::OPT_mhard_float))
656 FloatABI = "hard";
657 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000658 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000659 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000660 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000661 << A->getAsString(Args);
662 FloatABI = "soft";
663 }
664 }
665 }
666
667 // If unspecified, choose the default based on the platform.
668 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000669 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000670 case llvm::Triple::Darwin:
671 case llvm::Triple::MacOSX:
672 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000673 // Darwin defaults to "softfp" for v6 and v7.
674 //
675 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000676 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000677 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000678 if (StringRef(ArchName).startswith("v6") ||
679 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000680 FloatABI = "softfp";
681 else
682 FloatABI = "soft";
683 break;
684 }
685
Rafael Espindola27fa2362012-12-13 04:17:14 +0000686 case llvm::Triple::FreeBSD:
687 // FreeBSD defaults to soft float
688 FloatABI = "soft";
689 break;
690
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000691 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000692 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000693 case llvm::Triple::GNUEABIHF:
694 FloatABI = "hard";
695 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000696 case llvm::Triple::GNUEABI:
697 FloatABI = "softfp";
698 break;
699 case llvm::Triple::EABI:
700 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
701 FloatABI = "softfp";
702 break;
Logan Chien94a71422012-09-02 09:30:11 +0000703 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000704 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000705 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000706 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000707 FloatABI = "softfp";
708 else
709 FloatABI = "soft";
710 break;
711 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000712 default:
713 // Assume "soft", but warn the user we are guessing.
714 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000715 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000716 break;
717 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000718 }
719 }
720
Anton Korobeynikove2571792012-04-09 13:38:30 +0000721 return FloatABI;
722}
723
724
725void Clang::AddARMTargetArgs(const ArgList &Args,
726 ArgStringList &CmdArgs,
727 bool KernelOrKext) const {
728 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000729 // Get the effective triple, which takes into account the deployment target.
730 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
731 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000732 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000733
734 // Select the ABI to use.
735 //
736 // FIXME: Support -meabi.
737 const char *ABIName = 0;
738 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000739 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000740 } else if (Triple.isOSDarwin()) {
741 // The backend is hardwired to assume AAPCS for M-class processors, ensure
742 // the frontend matches that.
743 if (StringRef(CPUName).startswith("cortex-m")) {
744 ABIName = "aapcs";
745 } else {
746 ABIName = "apcs-gnu";
747 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000748 } else {
749 // Select the default based on the platform.
750 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000751 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000752 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000753 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000754 ABIName = "aapcs-linux";
755 break;
756 case llvm::Triple::EABI:
757 ABIName = "aapcs";
758 break;
759 default:
760 ABIName = "apcs-gnu";
761 }
762 }
763 CmdArgs.push_back("-target-abi");
764 CmdArgs.push_back(ABIName);
765
Anton Korobeynikove2571792012-04-09 13:38:30 +0000766 // Determine floating point ABI from the options & target defaults.
767 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000768 if (FloatABI == "soft") {
769 // Floating point operations and argument passing are soft.
770 //
771 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000772 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000773 CmdArgs.push_back("-mfloat-abi");
774 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000775 } else if (FloatABI == "softfp") {
776 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000777 CmdArgs.push_back("-mfloat-abi");
778 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000779 } else {
780 // Floating point operations and argument passing are hard.
781 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000782 CmdArgs.push_back("-mfloat-abi");
783 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000784 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000785
786 // Set appropriate target features for floating point mode.
787 //
788 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
789 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
790 // stripped out by the ARM target.
791
792 // Use software floating point operations?
793 if (FloatABI == "soft") {
794 CmdArgs.push_back("-target-feature");
795 CmdArgs.push_back("+soft-float");
796 }
797
798 // Use software floating point argument passing?
799 if (FloatABI != "hard") {
800 CmdArgs.push_back("-target-feature");
801 CmdArgs.push_back("+soft-float-abi");
802 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000803
804 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000805 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000806 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000807
Chad Rosier7a938fa2012-04-04 20:39:32 +0000808 // Honor -mfpmath=.
809 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000810 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000811
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000812 // Setting -msoft-float effectively disables NEON because of the GCC
813 // implementation, although the same isn't true of VFP or VFP3.
814 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000815 CmdArgs.push_back("-target-feature");
816 CmdArgs.push_back("-neon");
817 }
818
819 // Kernel code has more strict alignment requirements.
820 if (KernelOrKext) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000821 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
822 CmdArgs.push_back("-backend-option");
823 CmdArgs.push_back("-arm-long-calls");
824 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000825
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000826 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000827 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000828
829 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000830 CmdArgs.push_back("-backend-option");
Renato Golinebc313d2013-08-15 20:54:45 +0000831 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000832 }
Chad Rosier1b906052011-08-26 00:26:29 +0000833
834 // Setting -mno-global-merge disables the codegen global merge pass. Setting
835 // -mglobal-merge has no effect as the pass is enabled by default.
836 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
837 options::OPT_mno_global_merge)) {
838 if (A->getOption().matches(options::OPT_mno_global_merge))
839 CmdArgs.push_back("-mno-global-merge");
840 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000841
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000842 if (!Args.hasFlag(options::OPT_mimplicit_float,
843 options::OPT_mno_implicit_float,
844 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000845 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000846}
847
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000848// Translate MIPS CPU name alias option to CPU name.
849static StringRef getMipsCPUFromAlias(const Arg &A) {
850 if (A.getOption().matches(options::OPT_mips32))
851 return "mips32";
852 if (A.getOption().matches(options::OPT_mips32r2))
853 return "mips32r2";
854 if (A.getOption().matches(options::OPT_mips64))
855 return "mips64";
856 if (A.getOption().matches(options::OPT_mips64r2))
857 return "mips64r2";
858 llvm_unreachable("Unexpected option");
859 return "";
860}
861
Simon Atanasyana2768be2012-04-07 22:09:23 +0000862// Get CPU and ABI names. They are not independent
863// so we have to calculate them together.
864static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindolab330e402013-08-20 22:12:08 +0000865 const llvm::Triple &Triple,
Simon Atanasyana2768be2012-04-07 22:09:23 +0000866 StringRef &CPUName,
867 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000868 const char *DefMips32CPU = "mips32";
869 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000870
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000871 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000872 options::OPT_mcpu_EQ,
873 options::OPT_mips_CPUs_Group)) {
874 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
875 CPUName = getMipsCPUFromAlias(*A);
876 else
Richard Smith1d489cf2012-11-01 04:30:05 +0000877 CPUName = A->getValue();
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000878 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000879
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000880 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000881 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000882 // Convert a GNU style Mips ABI name to the name
883 // accepted by LLVM Mips backend.
884 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
885 .Case("32", "o32")
886 .Case("64", "n64")
887 .Default(ABIName);
888 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000889
890 // Setup default CPU and ABI names.
891 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +0000892 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000893 default:
894 llvm_unreachable("Unexpected triple arch name");
895 case llvm::Triple::mips:
896 case llvm::Triple::mipsel:
897 CPUName = DefMips32CPU;
898 break;
899 case llvm::Triple::mips64:
900 case llvm::Triple::mips64el:
901 CPUName = DefMips64CPU;
902 break;
903 }
904 }
905
906 if (!ABIName.empty()) {
907 // Deduce CPU name from ABI name.
908 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyane9616a42013-02-27 14:55:49 +0000909 .Cases("32", "o32", "eabi", DefMips32CPU)
910 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000911 .Default("");
912 }
913 else if (!CPUName.empty()) {
914 // Deduce ABI name from CPU name.
915 ABIName = llvm::StringSwitch<const char *>(CPUName)
916 .Cases("mips32", "mips32r2", "o32")
917 .Cases("mips64", "mips64r2", "n64")
918 .Default("");
919 }
920
921 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000922}
923
Simon Atanasyane9616a42013-02-27 14:55:49 +0000924// Convert ABI name to the GNU tools acceptable variant.
925static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
926 return llvm::StringSwitch<llvm::StringRef>(ABI)
927 .Case("o32", "32")
928 .Case("n64", "64")
929 .Default(ABI);
930}
931
Simon Atanasyan5e627792012-06-02 15:06:29 +0000932// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
933// and -mfloat-abi=.
934static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000935 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000936 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000937 options::OPT_mhard_float,
938 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000939 if (A->getOption().matches(options::OPT_msoft_float))
940 FloatABI = "soft";
941 else if (A->getOption().matches(options::OPT_mhard_float))
942 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000943 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000944 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +0000945 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000946 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000947 FloatABI = "hard";
948 }
949 }
Eric Christophered734732010-03-02 02:41:08 +0000950 }
951
952 // If unspecified, choose the default based on the platform.
953 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000954 // Assume "hard", because it's a default value used by gcc.
955 // When we start to recognize specific target MIPS processors,
956 // we will be able to select the default more correctly.
957 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000958 }
959
Simon Atanasyan5e627792012-06-02 15:06:29 +0000960 return FloatABI;
961}
962
Simon Atanasyandc536f52012-07-05 18:51:43 +0000963static void AddTargetFeature(const ArgList &Args,
964 ArgStringList &CmdArgs,
965 OptSpecifier OnOpt,
966 OptSpecifier OffOpt,
967 StringRef FeatureName) {
968 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
969 CmdArgs.push_back("-target-feature");
970 if (A->getOption().matches(OnOpt))
971 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
972 else
973 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
974 }
975}
976
Simon Atanasyan5e627792012-06-02 15:06:29 +0000977void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +0000978 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000979 const Driver &D = getToolChain().getDriver();
980 StringRef CPUName;
981 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +0000982 const llvm::Triple &Triple = getToolChain().getTriple();
983 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +0000984
985 CmdArgs.push_back("-target-abi");
986 CmdArgs.push_back(ABIName.data());
987
988 StringRef FloatABI = getMipsFloatABI(D, Args);
989
Simon Atanasyane1d792f2013-01-10 12:36:19 +0000990 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
991
992 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +0000993 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000994 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000995 CmdArgs.push_back("-mfloat-abi");
996 CmdArgs.push_back("soft");
997
998 // FIXME: Note, this is a hack. We need to pass the selected float
999 // mode to the MipsTargetInfoBase to define appropriate macros there.
1000 // Now it is the only method.
1001 CmdArgs.push_back("-target-feature");
1002 CmdArgs.push_back("+soft-float");
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001003
1004 if (FloatABI == "hard" && IsMips16) {
1005 CmdArgs.push_back("-mllvm");
1006 CmdArgs.push_back("-mips16-hard-float");
1007 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001008 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001009 else {
1010 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +00001011 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001012 CmdArgs.push_back("-mfloat-abi");
1013 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001014 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001015
Simon Atanasyan7c06cba2013-04-14 14:07:36 +00001016 AddTargetFeature(Args, CmdArgs,
1017 options::OPT_msingle_float, options::OPT_mdouble_float,
1018 "single-float");
Simon Atanasyandc536f52012-07-05 18:51:43 +00001019 AddTargetFeature(Args, CmdArgs,
1020 options::OPT_mips16, options::OPT_mno_mips16,
1021 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +00001022 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan321ae792013-04-14 14:07:51 +00001023 options::OPT_mmicromips, options::OPT_mno_micromips,
1024 "micromips");
1025 AddTargetFeature(Args, CmdArgs,
Simon Atanasyand797a852012-07-05 19:23:00 +00001026 options::OPT_mdsp, options::OPT_mno_dsp,
1027 "dsp");
1028 AddTargetFeature(Args, CmdArgs,
1029 options::OPT_mdspr2, options::OPT_mno_dspr2,
1030 "dspr2");
Jack Carterc613b672013-08-12 17:20:29 +00001031 AddTargetFeature(Args, CmdArgs,
1032 options::OPT_mmsa, options::OPT_mno_msa,
1033 "msa");
Simon Atanasyan9804b762012-08-27 20:55:56 +00001034
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001035 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1036 if (A->getOption().matches(options::OPT_mxgot)) {
1037 CmdArgs.push_back("-mllvm");
1038 CmdArgs.push_back("-mxgot");
1039 }
1040 }
1041
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001042 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1043 options::OPT_mno_ldc1_sdc1)) {
1044 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1045 CmdArgs.push_back("-mllvm");
1046 CmdArgs.push_back("-mno-ldc1-sdc1");
1047 }
1048 }
1049
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001050 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1051 options::OPT_mno_check_zero_division)) {
1052 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1053 CmdArgs.push_back("-mllvm");
1054 CmdArgs.push_back("-mno-check-zero-division");
1055 }
1056 }
1057
Simon Atanasyan9804b762012-08-27 20:55:56 +00001058 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001059 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001060 CmdArgs.push_back("-mllvm");
1061 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1062 A->claim();
1063 }
Eric Christophered734732010-03-02 02:41:08 +00001064}
1065
Hal Finkel02a84272012-06-11 22:35:19 +00001066/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1067static std::string getPPCTargetCPU(const ArgList &Args) {
1068 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001069 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001070
1071 if (CPUName == "native") {
1072 std::string CPU = llvm::sys::getHostCPUName();
1073 if (!CPU.empty() && CPU != "generic")
1074 return CPU;
1075 else
1076 return "";
1077 }
1078
1079 return llvm::StringSwitch<const char *>(CPUName)
1080 .Case("common", "generic")
1081 .Case("440", "440")
1082 .Case("440fp", "440")
1083 .Case("450", "450")
1084 .Case("601", "601")
1085 .Case("602", "602")
1086 .Case("603", "603")
1087 .Case("603e", "603e")
1088 .Case("603ev", "603ev")
1089 .Case("604", "604")
1090 .Case("604e", "604e")
1091 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001092 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001093 .Case("G3", "g3")
1094 .Case("7400", "7400")
1095 .Case("G4", "g4")
1096 .Case("7450", "7450")
1097 .Case("G4+", "g4+")
1098 .Case("750", "750")
1099 .Case("970", "970")
1100 .Case("G5", "g5")
1101 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001102 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001103 .Case("e500mc", "e500mc")
1104 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001105 .Case("power3", "pwr3")
1106 .Case("power4", "pwr4")
1107 .Case("power5", "pwr5")
1108 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001109 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001110 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001111 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001112 .Case("pwr3", "pwr3")
1113 .Case("pwr4", "pwr4")
1114 .Case("pwr5", "pwr5")
1115 .Case("pwr5x", "pwr5x")
1116 .Case("pwr6", "pwr6")
1117 .Case("pwr6x", "pwr6x")
1118 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001119 .Case("powerpc", "ppc")
1120 .Case("powerpc64", "ppc64")
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001121 .Case("powerpc64le", "ppc64le")
Hal Finkel02a84272012-06-11 22:35:19 +00001122 .Default("");
1123 }
1124
1125 return "";
1126}
1127
1128void Clang::AddPPCTargetArgs(const ArgList &Args,
1129 ArgStringList &CmdArgs) const {
Bill Schmidt199402b2013-02-01 02:14:03 +00001130 // Allow override of the Altivec feature.
Hal Finkelf4320ab2013-03-28 08:38:53 +00001131 AddTargetFeature(Args, CmdArgs,
1132 options::OPT_faltivec, options::OPT_fno_altivec,
1133 "altivec");
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001134
Hal Finkelfe6b2712013-03-30 13:47:44 +00001135 AddTargetFeature(Args, CmdArgs,
1136 options::OPT_mfprnd, options::OPT_mno_fprnd,
1137 "fprnd");
1138
Hal Finkelf4320ab2013-03-28 08:38:53 +00001139 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1140 AddTargetFeature(Args, CmdArgs,
1141 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1142 "mfocrf");
1143
Hal Finkel829d1872013-03-28 13:51:36 +00001144 AddTargetFeature(Args, CmdArgs,
1145 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1146 "popcntd");
1147
Hal Finkelf4320ab2013-03-28 08:38:53 +00001148 // It is really only possible to turn qpx off because turning qpx on is tied
1149 // to using the a2q CPU.
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001150 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1151 CmdArgs.push_back("-target-feature");
1152 CmdArgs.push_back("-qpx");
1153 }
Hal Finkel02a84272012-06-11 22:35:19 +00001154}
1155
Tom Stellarde25d2f62013-04-01 20:56:53 +00001156/// Get the (LLVM) name of the R600 gpu we are targeting.
1157static std::string getR600TargetGPU(const ArgList &Args) {
1158 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1159 std::string GPUName = A->getValue();
1160 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001161 .Cases("rv630", "rv635", "r600")
1162 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001163 .Case("rv740", "rv770")
1164 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001165 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001166 .Case("hemlock", "cypress")
1167 .Case("aruba", "cayman")
1168 .Default(GPUName.c_str());
1169 }
1170 return "";
1171}
1172
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001173void Clang::AddSparcTargetArgs(const ArgList &Args,
1174 ArgStringList &CmdArgs) const {
1175 const Driver &D = getToolChain().getDriver();
1176
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001177 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001178 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001179 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1180 options::OPT_mhard_float)) {
1181 if (A->getOption().matches(options::OPT_msoft_float))
1182 FloatABI = "soft";
1183 else if (A->getOption().matches(options::OPT_mhard_float))
1184 FloatABI = "hard";
1185 }
1186
1187 // If unspecified, choose the default based on the platform.
1188 if (FloatABI.empty()) {
Aaron Ballmand58915e2013-07-15 13:41:33 +00001189 // Assume "soft", but warn the user we are guessing.
1190 FloatABI = "soft";
1191 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001192 }
1193
1194 if (FloatABI == "soft") {
1195 // Floating point operations and argument passing are soft.
1196 //
1197 // FIXME: This changes CPP defines, we need -target-soft-float.
1198 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001199 CmdArgs.push_back("-target-feature");
1200 CmdArgs.push_back("+soft-float");
1201 } else {
1202 assert(FloatABI == "hard" && "Invalid float abi!");
1203 CmdArgs.push_back("-mhard-float");
1204 }
1205}
1206
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001207static const char *getSystemZTargetCPU(const ArgList &Args) {
1208 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1209 return A->getValue();
1210 return "z10";
1211}
1212
Chandler Carruth700d4e42013-01-13 11:46:33 +00001213static const char *getX86TargetCPU(const ArgList &Args,
1214 const llvm::Triple &Triple) {
1215 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1216 if (StringRef(A->getValue()) != "native")
1217 return A->getValue();
1218
1219 // FIXME: Reject attempts to use -march=native unless the target matches
1220 // the host.
1221 //
1222 // FIXME: We should also incorporate the detected target features for use
1223 // with -native.
1224 std::string CPU = llvm::sys::getHostCPUName();
1225 if (!CPU.empty() && CPU != "generic")
1226 return Args.MakeArgString(CPU);
1227 }
1228
1229 // Select the default CPU if none was given (or detection failed).
1230
1231 if (Triple.getArch() != llvm::Triple::x86_64 &&
1232 Triple.getArch() != llvm::Triple::x86)
1233 return 0; // This routine is only handling x86 targets.
1234
1235 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1236
1237 // FIXME: Need target hooks.
1238 if (Triple.isOSDarwin())
1239 return Is64Bit ? "core2" : "yonah";
1240
1241 // Everything else goes to x86-64 in 64-bit mode.
1242 if (Is64Bit)
1243 return "x86-64";
1244
1245 if (Triple.getOSName().startswith("haiku"))
1246 return "i586";
1247 if (Triple.getOSName().startswith("openbsd"))
1248 return "i486";
1249 if (Triple.getOSName().startswith("bitrig"))
1250 return "i686";
1251 if (Triple.getOSName().startswith("freebsd"))
1252 return "i486";
1253 if (Triple.getOSName().startswith("netbsd"))
1254 return "i486";
1255 // All x86 devices running Android have core2 as their common
1256 // denominator. This makes a better choice than pentium4.
1257 if (Triple.getEnvironment() == llvm::Triple::Android)
1258 return "core2";
1259
1260 // Fallback to p4.
1261 return "pentium4";
1262}
1263
Rafael Espindolab330e402013-08-20 22:12:08 +00001264static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1265 switch(T.getArch()) {
1266 default:
1267 return "";
1268
1269 case llvm::Triple::arm:
1270 case llvm::Triple::thumb:
1271 return getARMTargetCPU(Args, T);
1272
1273 case llvm::Triple::mips:
1274 case llvm::Triple::mipsel:
1275 case llvm::Triple::mips64:
1276 case llvm::Triple::mips64el: {
1277 StringRef CPUName;
1278 StringRef ABIName;
1279 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1280 return CPUName;
1281 }
1282
1283 case llvm::Triple::ppc:
1284 case llvm::Triple::ppc64:
1285 case llvm::Triple::ppc64le: {
1286 std::string TargetCPUName = getPPCTargetCPU(Args);
1287 // LLVM may default to generating code for the native CPU,
1288 // but, like gcc, we default to a more generic option for
1289 // each architecture. (except on Darwin)
1290 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1291 if (T.getArch() == llvm::Triple::ppc64)
1292 TargetCPUName = "ppc64";
1293 else if (T.getArch() == llvm::Triple::ppc64le)
1294 TargetCPUName = "ppc64le";
1295 else
1296 TargetCPUName = "ppc";
1297 }
1298 return TargetCPUName;
1299 }
1300
1301 case llvm::Triple::sparc:
1302 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1303 return A->getValue();
1304 return "";
1305
1306 case llvm::Triple::x86:
1307 case llvm::Triple::x86_64:
1308 return getX86TargetCPU(Args, T);
1309
1310 case llvm::Triple::hexagon:
1311 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1312
1313 case llvm::Triple::systemz:
1314 return getSystemZTargetCPU(Args);
1315
1316 case llvm::Triple::r600:
1317 return getR600TargetGPU(Args);
1318 }
1319}
1320
Daniel Dunbar6acda162009-09-09 22:33:08 +00001321void Clang::AddX86TargetArgs(const ArgList &Args,
1322 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001323 if (!Args.hasFlag(options::OPT_mred_zone,
1324 options::OPT_mno_red_zone,
1325 true) ||
1326 Args.hasArg(options::OPT_mkernel) ||
1327 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001328 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001329
Bob Wilsonf0c54562013-02-10 16:01:41 +00001330 // Default to avoid implicit floating-point for kernel/kext code, but allow
1331 // that to be overridden with -mno-soft-float.
1332 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1333 Args.hasArg(options::OPT_fapple_kext));
1334 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1335 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001336 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001337 options::OPT_mno_implicit_float)) {
1338 const Option &O = A->getOption();
1339 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1340 O.matches(options::OPT_msoft_float));
1341 }
1342 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001343 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001344
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001345 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1346 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001347 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001348 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001349
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001350 // Skip over "-m".
Michael J. Spencerc6357102012-10-22 22:13:48 +00001351 assert(Name.startswith("m") && "Invalid feature name.");
1352 Name = Name.substr(1);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001353
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001354 bool IsNegative = Name.startswith("no-");
1355 if (IsNegative)
1356 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001357
Rafael Espindolac84ed542013-08-20 18:57:55 +00001358 CmdArgs.push_back("-target-feature");
1359 CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
Daniel Dunbar6acda162009-09-09 22:33:08 +00001360 }
1361}
1362
Matthew Curtis33c95f12012-12-06 17:49:03 +00001363static inline bool HasPICArg(const ArgList &Args) {
1364 return Args.hasArg(options::OPT_fPIC)
1365 || Args.hasArg(options::OPT_fpic);
1366}
1367
1368static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1369 return Args.getLastArg(options::OPT_G,
1370 options::OPT_G_EQ,
1371 options::OPT_msmall_data_threshold_EQ);
1372}
1373
1374static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1375 std::string value;
1376 if (HasPICArg(Args))
1377 value = "0";
1378 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1379 value = A->getValue();
1380 A->claim();
1381 }
1382 return value;
1383}
1384
Tony Linthicum96319392011-12-12 21:14:55 +00001385void Clang::AddHexagonTargetArgs(const ArgList &Args,
1386 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00001387 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001388 CmdArgs.push_back("-mqdsp6-compat");
1389 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001390
Matthew Curtis33c95f12012-12-06 17:49:03 +00001391 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1392 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001393 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001394 CmdArgs.push_back(Args.MakeArgString(
1395 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001396 }
1397
Sirish Pande5f9688b2012-05-10 20:19:54 +00001398 if (!Args.hasArg(options::OPT_fno_short_enums))
1399 CmdArgs.push_back("-fshort-enums");
1400 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1401 CmdArgs.push_back ("-mllvm");
1402 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1403 }
Tony Linthicum96319392011-12-12 21:14:55 +00001404 CmdArgs.push_back ("-mllvm");
1405 CmdArgs.push_back ("-machine-sink-split=0");
1406}
1407
Tim Northoverb793f0d2013-08-01 09:23:19 +00001408void Clang::AddAArch64TargetArgs(const ArgList &Args,
1409 ArgStringList &CmdArgs) const {
1410 const Driver &D = getToolChain().getDriver();
1411 // Honor -mfpu=.
1412 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
1413 addFPUArgs(D, A, Args, CmdArgs);
1414}
1415
Eric Christopher88b7cf02011-08-19 00:30:14 +00001416static bool
John McCall260611a2012-06-20 06:18:46 +00001417shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001418 const llvm::Triple &Triple) {
1419 // We use the zero-cost exception tables for Objective-C if the non-fragile
1420 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1421 // later.
John McCall260611a2012-06-20 06:18:46 +00001422 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001423 return true;
1424
Bob Wilson905c45f2011-10-14 05:03:44 +00001425 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001426 return false;
1427
Eric Christopheraa7333c2011-07-02 00:20:22 +00001428 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001429 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001430 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001431}
1432
Anders Carlsson15348ae2011-02-28 02:27:16 +00001433/// addExceptionArgs - Adds exception related arguments to the driver command
1434/// arguments. There's a master flag, -fexceptions and also language specific
1435/// flags to enable/disable C++ and Objective-C exceptions.
1436/// This makes it possible to for example disable C++ exceptions but enable
1437/// Objective-C exceptions.
1438static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1439 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001440 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001441 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001442 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001443 if (KernelOrKext) {
1444 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1445 // arguments now to avoid warnings about unused arguments.
1446 Args.ClaimAllArgs(options::OPT_fexceptions);
1447 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1448 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1449 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1450 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1451 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001452 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001453 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001454
1455 // Exceptions are enabled by default.
1456 bool ExceptionsEnabled = true;
1457
1458 // This keeps track of whether exceptions were explicitly turned on or off.
1459 bool DidHaveExplicitExceptionFlag = false;
1460
Rafael Espindolaf759df02009-10-01 13:33:33 +00001461 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1462 options::OPT_fno_exceptions)) {
1463 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001464 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001465 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001466 ExceptionsEnabled = false;
1467
1468 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001469 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001470
Anders Carlsson15348ae2011-02-28 02:27:16 +00001471 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001472
Anders Carlsson15348ae2011-02-28 02:27:16 +00001473 // Exception tables and cleanups can be enabled with -fexceptions even if the
1474 // language itself doesn't support exceptions.
1475 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1476 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001477
Daniel Dunbard47ea692011-03-17 23:28:31 +00001478 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1479 // is not necessarily sensible, but follows GCC.
1480 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001481 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001482 options::OPT_fno_objc_exceptions,
1483 true)) {
1484 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001485
Eric Christopher88b7cf02011-08-19 00:30:14 +00001486 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001487 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001488 }
1489
1490 if (types::isCXX(InputType)) {
1491 bool CXXExceptionsEnabled = ExceptionsEnabled;
1492
Eric Christopher88b7cf02011-08-19 00:30:14 +00001493 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1494 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001495 options::OPT_fexceptions,
1496 options::OPT_fno_exceptions)) {
1497 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1498 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001499 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001500 CXXExceptionsEnabled = false;
1501 }
1502
1503 if (CXXExceptionsEnabled) {
1504 CmdArgs.push_back("-fcxx-exceptions");
1505
1506 ShouldUseExceptionTables = true;
1507 }
1508 }
1509
1510 if (ShouldUseExceptionTables)
1511 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001512}
1513
Daniel Dunbarf4910132013-04-16 18:21:19 +00001514static bool ShouldDisableAutolink(const ArgList &Args,
1515 const ToolChain &TC) {
1516 bool Default = true;
1517 if (TC.getTriple().isOSDarwin()) {
1518 // The native darwin assembler doesn't support the linker_option directives,
1519 // so we disable them if we think the .s file will be passed to it.
1520 Default = TC.useIntegratedAs();
1521 }
1522 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1523 Default);
1524}
1525
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001526static bool ShouldDisableCFI(const ArgList &Args,
1527 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001528 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001529 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001530 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001531 // we disable them if we think the .s file will be passed to it.
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001532 Default = TC.useIntegratedAs();
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001533 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001534 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001535 options::OPT_fno_dwarf2_cfi_asm,
1536 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001537}
1538
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001539static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1540 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001541 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1542 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001543 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001544 return !UseDwarfDirectory;
1545}
1546
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001547/// \brief Check whether the given input tree contains any compilation actions.
1548static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001549 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001550 return true;
1551
1552 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1553 if (ContainsCompileAction(*it))
1554 return true;
1555
1556 return false;
1557}
1558
1559/// \brief Check if -relax-all should be passed to the internal assembler.
1560/// This is done by default when compiling non-assembler source with -O0.
1561static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1562 bool RelaxDefault = true;
1563
1564 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1565 RelaxDefault = A->getOption().matches(options::OPT_O0);
1566
1567 if (RelaxDefault) {
1568 RelaxDefault = false;
1569 for (ActionList::const_iterator it = C.getActions().begin(),
1570 ie = C.getActions().end(); it != ie; ++it) {
1571 if (ContainsCompileAction(*it)) {
1572 RelaxDefault = true;
1573 break;
1574 }
1575 }
1576 }
1577
1578 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1579 RelaxDefault);
1580}
1581
David Blaikie73168db2013-07-25 21:19:01 +00001582static void CollectArgsForIntegratedAssembler(Compilation &C,
1583 const ArgList &Args,
1584 ArgStringList &CmdArgs,
1585 const Driver &D) {
1586 if (UseRelaxAll(C, Args))
1587 CmdArgs.push_back("-mrelax-all");
1588
1589 // When using an integrated assembler, translate -Wa, and -Xassembler
1590 // options.
1591 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1592 options::OPT_Xassembler),
1593 ie = Args.filtered_end(); it != ie; ++it) {
1594 const Arg *A = *it;
1595 A->claim();
1596
1597 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1598 StringRef Value = A->getValue(i);
1599
1600 if (Value == "-force_cpusubtype_ALL") {
1601 // Do nothing, this is the default and we don't support anything else.
1602 } else if (Value == "-L") {
1603 CmdArgs.push_back("-msave-temp-labels");
1604 } else if (Value == "--fatal-warnings") {
1605 CmdArgs.push_back("-mllvm");
1606 CmdArgs.push_back("-fatal-assembler-warnings");
1607 } else if (Value == "--noexecstack") {
1608 CmdArgs.push_back("-mnoexecstack");
1609 } else {
1610 D.Diag(diag::err_drv_unsupported_option_argument)
1611 << A->getOption().getName() << Value;
1612 }
1613 }
1614 }
1615}
1616
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001617static void addProfileRTLinux(
1618 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1619 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1620 Args.hasArg(options::OPT_fprofile_generate) ||
1621 Args.hasArg(options::OPT_fcreate_profile) ||
1622 Args.hasArg(options::OPT_coverage)))
1623 return;
1624
1625 // The profile runtime is located in the Linux library directory and has name
1626 // "libclang_rt.profile-<ArchName>.a".
1627 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1628 llvm::sys::path::append(
1629 LibProfile, "lib", "linux",
1630 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1631
1632 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1633}
1634
Alexey Samsonov86143042013-02-27 11:14:55 +00001635static void addSanitizerRTLinkFlagsLinux(
1636 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smith76e6e132013-03-23 00:30:08 +00001637 const StringRef Sanitizer, bool BeforeLibStdCXX,
1638 bool ExportSymbols = true) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001639 // Sanitizer runtime is located in the Linux library directory and
1640 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1641 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1642 llvm::sys::path::append(
1643 LibSanitizer, "lib", "linux",
1644 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smith61a574f2013-03-20 23:49:07 +00001645
Alexey Samsonov86143042013-02-27 11:14:55 +00001646 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1647 // etc.) so that the linker picks custom versions of the global 'operator
1648 // new' and 'operator delete' symbols. We take the extreme (but simple)
1649 // strategy of inserting it at the front of the link command. It also
1650 // needs to be forced to end up in the executable, so wrap it in
1651 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001652 SmallVector<const char *, 3> LibSanitizerArgs;
1653 LibSanitizerArgs.push_back("-whole-archive");
1654 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1655 LibSanitizerArgs.push_back("-no-whole-archive");
1656
1657 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1658 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1659
Alexey Samsonov86143042013-02-27 11:14:55 +00001660 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov3a8aff92013-05-24 14:28:03 +00001661 CmdArgs.push_back("-lrt");
Alexey Samsonov86143042013-02-27 11:14:55 +00001662 CmdArgs.push_back("-ldl");
Richard Smith76e6e132013-03-23 00:30:08 +00001663
1664 // If possible, use a dynamic symbols file to export the symbols from the
1665 // runtime library. If we can't do so, use -export-dynamic instead to export
1666 // all symbols from the binary.
1667 if (ExportSymbols) {
1668 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1669 CmdArgs.push_back(
1670 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1671 else
1672 CmdArgs.push_back("-export-dynamic");
1673 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001674}
1675
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001676/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1677/// This needs to be called before we add the C run-time (malloc, etc).
1678static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001679 ArgStringList &CmdArgs) {
Logan Chien94a71422012-09-02 09:30:11 +00001680 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001681 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1682 llvm::sys::path::append(LibAsan, "lib", "linux",
1683 (Twine("libclang_rt.asan-") +
1684 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001685 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001686 } else {
Sergey Matveev050309f2013-05-27 11:17:01 +00001687 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001688 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001689 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001690}
1691
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001692/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1693/// This needs to be called before we add the C run-time (malloc, etc).
1694static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1695 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001696 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001697 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001698}
1699
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001700/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1701/// This needs to be called before we add the C run-time (malloc, etc).
1702static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1703 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001704 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001705 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00001706}
1707
1708/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1709/// This needs to be called before we add the C run-time (malloc, etc).
1710static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1711 ArgStringList &CmdArgs) {
1712 if (!Args.hasArg(options::OPT_shared))
1713 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001714}
1715
Richard Smith4def70d2012-10-09 19:52:38 +00001716/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1717/// (Linux).
1718static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001719 ArgStringList &CmdArgs, bool IsCXX,
1720 bool HasOtherSanitizerRt) {
Richard Smith61a574f2013-03-20 23:49:07 +00001721 // Need a copy of sanitizer_common. This could come from another sanitizer
1722 // runtime; if we're not including one, include our own copy.
1723 if (!HasOtherSanitizerRt)
Richard Smith76e6e132013-03-23 00:30:08 +00001724 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smith61a574f2013-03-20 23:49:07 +00001725
Alexey Samsonov86143042013-02-27 11:14:55 +00001726 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smith61a574f2013-03-20 23:49:07 +00001727
1728 // Only include the bits of the runtime which need a C++ ABI library if
1729 // we're linking in C++ mode.
1730 if (IsCXX)
1731 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001732}
1733
Peter Collingbourne2eeed712013-08-07 22:47:34 +00001734static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1735 ArgStringList &CmdArgs) {
1736 if (!Args.hasArg(options::OPT_shared))
1737 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1738}
1739
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001740static bool shouldUseFramePointer(const ArgList &Args,
1741 const llvm::Triple &Triple) {
1742 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1743 options::OPT_fomit_frame_pointer))
1744 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1745
Richard Sandiford0e373ec2013-07-19 14:06:49 +00001746 // Don't use a frame pointer on linux x86, x86_64 and z if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001747 if ((Triple.getArch() == llvm::Triple::x86_64 ||
Richard Sandiford0e373ec2013-07-19 14:06:49 +00001748 Triple.getArch() == llvm::Triple::x86 ||
1749 Triple.getArch() == llvm::Triple::systemz) &&
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001750 Triple.getOS() == llvm::Triple::Linux) {
1751 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1752 if (!A->getOption().matches(options::OPT_O0))
1753 return false;
1754 }
1755
Robert Lytton5f15f4d2013-08-13 09:43:10 +00001756 if (Triple.getArch() == llvm::Triple::xcore)
1757 return false;
1758
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001759 return true;
1760}
1761
Eric Christopherd3e22df2013-04-03 01:58:53 +00001762static bool shouldUseLeafFramePointer(const ArgList &Args,
1763 const llvm::Triple &Triple) {
1764 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1765 options::OPT_momit_leaf_frame_pointer))
1766 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1767
Richard Sandiford0e373ec2013-07-19 14:06:49 +00001768 // Don't use a leaf frame pointer on linux x86, x86_64 and z if optimizing.
Eric Christopherd3e22df2013-04-03 01:58:53 +00001769 if ((Triple.getArch() == llvm::Triple::x86_64 ||
Richard Sandiford0e373ec2013-07-19 14:06:49 +00001770 Triple.getArch() == llvm::Triple::x86 ||
1771 Triple.getArch() == llvm::Triple::systemz) &&
Eric Christopherd3e22df2013-04-03 01:58:53 +00001772 Triple.getOS() == llvm::Triple::Linux) {
1773 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1774 if (!A->getOption().matches(options::OPT_O0))
1775 return false;
1776 }
1777
Robert Lytton5f15f4d2013-08-13 09:43:10 +00001778 if (Triple.getArch() == llvm::Triple::xcore)
1779 return false;
1780
Eric Christopherd3e22df2013-04-03 01:58:53 +00001781 return true;
1782}
1783
Rafael Espindolaa2148242013-08-10 01:40:10 +00001784/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00001785static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001786 SmallString<128> cwd;
1787 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001788 CmdArgs.push_back("-fdebug-compilation-dir");
1789 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00001790 }
1791}
1792
Eric Christopher80190392013-02-22 20:12:52 +00001793static const char *SplitDebugName(const ArgList &Args,
1794 const InputInfoList &Inputs) {
1795 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1796 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1797 SmallString<128> T(FinalOutput->getValue());
1798 llvm::sys::path::replace_extension(T, "dwo");
1799 return Args.MakeArgString(T);
1800 } else {
1801 // Use the compilation dir.
1802 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1803 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1804 llvm::sys::path::replace_extension(F, "dwo");
1805 T += F;
1806 return Args.MakeArgString(F);
1807 }
1808}
1809
1810static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1811 const Tool &T, const JobAction &JA,
1812 const ArgList &Args, const InputInfo &Output,
1813 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001814 ArgStringList ExtractArgs;
1815 ExtractArgs.push_back("--extract-dwo");
1816
1817 ArgStringList StripArgs;
1818 StripArgs.push_back("--strip-dwo");
1819
1820 // Grabbing the output of the earlier compile step.
1821 StripArgs.push_back(Output.getFilename());
1822 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001823 ExtractArgs.push_back(OutFile);
1824
1825 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001826 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001827
1828 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001829 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001830
1831 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001832 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001833}
1834
Chad Rosierb82e1172013-04-24 18:09:54 +00001835static bool isOptimizationLevelFast(const ArgList &Args) {
1836 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1837 if (A->getOption().matches(options::OPT_Ofast))
1838 return true;
1839 return false;
1840}
1841
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001842/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1843static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1844 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1845 if (A->getOption().matches(options::OPT_O4) ||
1846 A->getOption().matches(options::OPT_Ofast))
1847 return true;
1848
1849 if (A->getOption().matches(options::OPT_O0))
1850 return false;
1851
1852 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1853
1854 // Vectorize -O (which really is -O2), -Os.
1855 StringRef S(A->getValue());
1856 if (S == "s" || S.empty())
1857 return true;
1858
1859 // Don't vectorize -Oz.
1860 if (S == "z")
1861 return false;
1862
1863 unsigned OptLevel = 0;
1864 if (S.getAsInteger(10, OptLevel))
1865 return false;
1866
1867 return OptLevel > 1;
1868 }
1869
1870 return false;
1871}
1872
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001873void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001874 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001875 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001876 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001877 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001878 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1879 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001880 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001881 ArgStringList CmdArgs;
1882
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001883 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1884
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001885 // Invoke ourselves in -cc1 mode.
1886 //
1887 // FIXME: Implement custom jobs for internal actions.
1888 CmdArgs.push_back("-cc1");
1889
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001890 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001891 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001892 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001893 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001894
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001895 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001896 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001897
Daniel Dunbar1d460332009-03-18 10:01:51 +00001898 if (isa<AnalyzeJobAction>(JA)) {
1899 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1900 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001901 } else if (isa<MigrateJobAction>(JA)) {
1902 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001903 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001904 if (Output.getType() == types::TY_Dependencies)
1905 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001906 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001907 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001908 if (Args.hasArg(options::OPT_rewrite_objc) &&
1909 !Args.hasArg(options::OPT_g_Group))
1910 CmdArgs.push_back("-P");
1911 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001912 } else if (isa<AssembleJobAction>(JA)) {
1913 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001914
David Blaikie73168db2013-07-25 21:19:01 +00001915 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00001916
1917 // Also ignore explicit -force_cpusubtype_ALL option.
1918 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001919 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001920 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001921 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001922
Aaron Ballman761322b2012-07-31 01:21:00 +00001923 if (JA.getType() == types::TY_Nothing)
1924 CmdArgs.push_back("-fsyntax-only");
1925 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001926 CmdArgs.push_back("-emit-pch");
1927 else
1928 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001929 } else {
1930 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001931
Daniel Dunbar1d460332009-03-18 10:01:51 +00001932 if (JA.getType() == types::TY_Nothing) {
1933 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001934 } else if (JA.getType() == types::TY_LLVM_IR ||
1935 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001936 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001937 } else if (JA.getType() == types::TY_LLVM_BC ||
1938 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001939 CmdArgs.push_back("-emit-llvm-bc");
1940 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001941 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001942 } else if (JA.getType() == types::TY_AST) {
1943 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00001944 } else if (JA.getType() == types::TY_ModuleFile) {
1945 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00001946 } else if (JA.getType() == types::TY_RewrittenObjC) {
1947 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001948 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001949 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1950 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001951 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001952 } else {
1953 assert(JA.getType() == types::TY_PP_Asm &&
1954 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001955 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001956 }
1957
Daniel Dunbar1d460332009-03-18 10:01:51 +00001958 // The make clang go fast button.
1959 CmdArgs.push_back("-disable-free");
1960
John McCallb689afb2010-02-13 03:50:24 +00001961 // Disable the verification pass in -asserts builds.
1962#ifdef NDEBUG
1963 CmdArgs.push_back("-disable-llvm-verifier");
1964#endif
1965
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001966 // Set the main file name, so that debug info works even with
1967 // -save-temps.
1968 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00001969 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001970
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001971 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00001972 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001973 if (Args.hasArg(options::OPT_static))
1974 CmdArgs.push_back("-static-define");
1975
Daniel Dunbar1d460332009-03-18 10:01:51 +00001976 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001977 // Enable region store model by default.
1978 CmdArgs.push_back("-analyzer-store=region");
1979
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001980 // Treat blocks as analysis entry points.
1981 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1982
Ted Kremenek51885072011-03-24 00:28:47 +00001983 CmdArgs.push_back("-analyzer-eagerly-assume");
1984
Daniel Dunbar1d460332009-03-18 10:01:51 +00001985 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001986 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001987 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001988
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001989 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1990 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001991
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001992 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001993 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001994
1995 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001996
Jordan Rosee449edc2013-04-05 17:55:07 +00001997 if (types::isCXX(Inputs[0].getType()))
1998 CmdArgs.push_back("-analyzer-checker=cplusplus");
1999
Ted Kremenek8dc05062012-01-26 02:27:38 +00002000 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00002001 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2002 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2003 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2004 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2005 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2006 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002007 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002008
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002009 // Set the output format. The default is plist, for (lame) historical
2010 // reasons.
2011 CmdArgs.push_back("-analyzer-output");
2012 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002013 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002014 else
2015 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002016
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002017 // Disable the presentation of standard compiler warnings when
2018 // using --analyze. We only want to show static analyzer diagnostics
2019 // or frontend errors.
2020 CmdArgs.push_back("-w");
2021
Daniel Dunbar1d460332009-03-18 10:01:51 +00002022 // Add -Xanalyzer arguments when running as analyzer.
2023 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002024 }
2025
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002026 CheckCodeGenerationOptions(D, Args);
2027
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002028 bool PIE = getToolChain().isPIEDefault();
2029 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002030 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002031
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002032 // For the PIC and PIE flag options, this logic is different from the
2033 // legacy logic in very old versions of GCC, as that logic was just
2034 // a bug no one had ever fixed. This logic is both more rational and
2035 // consistent with GCC's new logic now that the bugs are fixed. The last
2036 // argument relating to either PIC or PIE wins, and no other argument is
2037 // used. If the last argument is any flavor of the '-fno-...' arguments,
2038 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2039 // at the same level.
2040 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2041 options::OPT_fpic, options::OPT_fno_pic,
2042 options::OPT_fPIE, options::OPT_fno_PIE,
2043 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002044 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2045 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002046 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002047 if (LastPICArg) {
2048 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002049 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2050 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2051 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2052 PIC = PIE || O.matches(options::OPT_fPIC) ||
2053 O.matches(options::OPT_fpic);
2054 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2055 O.matches(options::OPT_fPIC);
2056 } else {
2057 PIE = PIC = false;
2058 }
2059 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002060 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002061
2062 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2063 // specified while enabling PIC enabled level 1 PIC, just force it back to
2064 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2065 // informal testing).
2066 if (PIC && getToolChain().getTriple().isOSDarwin())
2067 IsPICLevelTwo |= getToolChain().isPICDefault();
2068
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002069 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2070 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002071 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002072 if (KernelOrKext &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002073 (Triple.getOS() != llvm::Triple::IOS ||
2074 Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002075 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002076 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002077 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002078
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002079 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2080 // This is a very special mode. It trumps the other modes, almost no one
2081 // uses it, and it isn't even valid on any OS but Darwin.
2082 if (!getToolChain().getTriple().isOSDarwin())
2083 D.Diag(diag::err_drv_unsupported_opt_for_target)
2084 << A->getSpelling() << getToolChain().getTriple().str();
2085
2086 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2087
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002088 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002089 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002090
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002091 // Only a forced PIC mode can cause the actual compile to have PIC defines
2092 // etc., no flags are sufficient. This behavior was selected to closely
2093 // match that of llvm-gcc and Apple GCC before that.
2094 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2095 CmdArgs.push_back("-pic-level");
2096 CmdArgs.push_back("2");
2097 }
2098 } else {
2099 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2100 // handled in Clang's IRGen by the -pie-level flag.
2101 CmdArgs.push_back("-mrelocation-model");
2102 CmdArgs.push_back(PIC ? "pic" : "static");
2103
2104 if (PIC) {
2105 CmdArgs.push_back("-pic-level");
2106 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2107 if (PIE) {
2108 CmdArgs.push_back("-pie-level");
2109 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2110 }
2111 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002112 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002113
Tanya Lattner59876c22009-11-04 01:18:09 +00002114 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2115 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002116 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002117
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002118 // LLVM Code Generator Options.
2119
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002120 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2121 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002122 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002123 }
2124
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002125 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2126 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002127 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002128 D.Diag(diag::err_drv_unsupported_opt_for_target)
2129 << A->getSpelling() << getToolChain().getTriple().str();
2130 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2131 CmdArgs.push_back("-fpcc-struct-return");
2132 } else {
2133 assert(A->getOption().matches(options::OPT_freg_struct_return));
2134 CmdArgs.push_back("-freg-struct-return");
2135 }
2136 }
2137
Roman Divackycfe9af22011-03-01 17:40:53 +00002138 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2139 CmdArgs.push_back("-mrtd");
2140
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002141 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002142 CmdArgs.push_back("-mdisable-fp-elim");
2143 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2144 options::OPT_fno_zero_initialized_in_bss))
2145 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002146
2147 bool OFastEnabled = isOptimizationLevelFast(Args);
2148 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2149 // enabled. This alias option is being used to simplify the hasFlag logic.
2150 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2151 options::OPT_fstrict_aliasing;
2152 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar398c6102011-02-04 02:20:39 +00002153 options::OPT_fno_strict_aliasing,
2154 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002155 CmdArgs.push_back("-relaxed-aliasing");
Manman Renb37a73d2013-04-04 21:53:22 +00002156 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2157 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002158 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2159 false))
2160 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002161 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2162 options::OPT_fno_optimize_sibling_calls))
2163 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002164
Eric Christopher31056272013-04-04 06:29:47 +00002165 // Handle segmented stacks.
2166 if (Args.hasArg(options::OPT_fsplit_stack))
2167 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002168
2169 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2170 // This alias option is being used to simplify the getLastArg logic.
2171 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2172 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002173
Chandler Carruthabf07a72012-01-02 14:19:45 +00002174 // Handle various floating point optimization flags, mapping them to the
2175 // appropriate LLVM code generation flags. The pattern for all of these is to
2176 // default off the codegen optimizations, and if any flag enables them and no
2177 // flag disables them after the flag enabling them, enable the codegen
2178 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002179 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002180 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002181 options::OPT_ffinite_math_only,
2182 options::OPT_fno_finite_math_only,
2183 options::OPT_fhonor_infinities,
2184 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002185 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2186 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002187 A->getOption().getID() != options::OPT_fhonor_infinities)
2188 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002189 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002190 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002191 options::OPT_ffinite_math_only,
2192 options::OPT_fno_finite_math_only,
2193 options::OPT_fhonor_nans,
2194 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002195 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2196 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002197 A->getOption().getID() != options::OPT_fhonor_nans)
2198 CmdArgs.push_back("-menable-no-nans");
2199
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002200 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2201 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002202 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002203 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002204 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002205 options::OPT_fno_math_errno)) {
2206 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2207 // However, turning *off* -ffast_math merely restores the toolchain default
2208 // (which may be false).
2209 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2210 A->getOption().getID() == options::OPT_ffast_math ||
2211 A->getOption().getID() == options::OPT_Ofast)
2212 MathErrno = false;
2213 else if (A->getOption().getID() == options::OPT_fmath_errno)
2214 MathErrno = true;
2215 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002216 if (MathErrno)
2217 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002218
2219 // There are several flags which require disabling very specific
2220 // optimizations. Any of these being disabled forces us to turn off the
2221 // entire set of LLVM optimizations, so collect them through all the flag
2222 // madness.
2223 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002224 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002225 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002226 options::OPT_funsafe_math_optimizations,
2227 options::OPT_fno_unsafe_math_optimizations,
2228 options::OPT_fassociative_math,
2229 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002230 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2231 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002232 A->getOption().getID() != options::OPT_fno_associative_math)
2233 AssociativeMath = true;
2234 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002235 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002236 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002237 options::OPT_funsafe_math_optimizations,
2238 options::OPT_fno_unsafe_math_optimizations,
2239 options::OPT_freciprocal_math,
2240 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002241 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2242 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002243 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2244 ReciprocalMath = true;
2245 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002246 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002247 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002248 options::OPT_funsafe_math_optimizations,
2249 options::OPT_fno_unsafe_math_optimizations,
2250 options::OPT_fsigned_zeros,
2251 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002252 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2253 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002254 A->getOption().getID() != options::OPT_fsigned_zeros)
2255 SignedZeros = false;
2256 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002257 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002258 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002259 options::OPT_funsafe_math_optimizations,
2260 options::OPT_fno_unsafe_math_optimizations,
2261 options::OPT_ftrapping_math,
2262 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002263 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2264 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002265 A->getOption().getID() != options::OPT_ftrapping_math)
2266 TrappingMath = false;
2267 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2268 !TrappingMath)
2269 CmdArgs.push_back("-menable-unsafe-fp-math");
2270
Lang Hamesc9686712012-07-06 00:59:19 +00002271
2272 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002273 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002274 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002275 options::OPT_ffp_contract)) {
2276 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002277 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002278 if (Val == "fast" || Val == "on" || Val == "off") {
2279 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2280 } else {
2281 D.Diag(diag::err_drv_unsupported_option_argument)
2282 << A->getOption().getName() << Val;
2283 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002284 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2285 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002286 // If fast-math is set then set the fp-contract mode to fast.
2287 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2288 }
2289 }
2290
Bob Wilson455e72e2012-07-19 03:52:53 +00002291 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2292 // and if we find them, tell the frontend to provide the appropriate
2293 // preprocessor macros. This is distinct from enabling any optimizations as
2294 // these options induce language changes which must survive serialization
2295 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002296 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2297 options::OPT_fno_fast_math))
2298 if (!A->getOption().matches(options::OPT_fno_fast_math))
2299 CmdArgs.push_back("-ffast-math");
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002300 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2301 if (A->getOption().matches(options::OPT_ffinite_math_only))
2302 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002303
Daniel Dunbar1b718482010-05-14 22:00:22 +00002304 // Decide whether to use verbose asm. Verbose assembly is the default on
2305 // toolchains which have the integrated assembler on by default.
2306 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2307 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002308 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002309 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002310 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002311
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002312 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2313 CmdArgs.push_back("-mdebug-pass");
2314 CmdArgs.push_back("Structure");
2315 }
2316 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2317 CmdArgs.push_back("-mdebug-pass");
2318 CmdArgs.push_back("Arguments");
2319 }
2320
John McCalld0c2ec42010-02-19 02:45:38 +00002321 // Enable -mconstructor-aliases except on darwin, where we have to
2322 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002323 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002324 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002325
John McCall32096692011-03-18 02:56:14 +00002326 // Darwin's kernel doesn't support guard variables; just die if we
2327 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002328 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002329 CmdArgs.push_back("-fforbid-guard-variables");
2330
Douglas Gregor6f755502011-02-01 15:15:22 +00002331 if (Args.hasArg(options::OPT_mms_bitfields)) {
2332 CmdArgs.push_back("-mms-bitfields");
2333 }
John McCalld0c2ec42010-02-19 02:45:38 +00002334
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002335 // This is a coarse approximation of what llvm-gcc actually does, both
2336 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2337 // complicated ways.
2338 bool AsynchronousUnwindTables =
2339 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2340 options::OPT_fno_asynchronous_unwind_tables,
2341 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002342 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002343 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2344 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002345 CmdArgs.push_back("-munwind-tables");
2346
Chandler Carrutha6b25812012-11-21 23:40:23 +00002347 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002348
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002349 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2350 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002351 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002352 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002353
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002354 // FIXME: Handle -mtune=.
2355 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002356
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002357 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002358 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002359 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002360 }
2361
Rafael Espindolab330e402013-08-20 22:12:08 +00002362 // Add the target cpu
2363 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2364 llvm::Triple ETriple(ETripleStr);
2365 std::string CPU = getCPUName(Args, ETriple);
2366 if (!CPU.empty()) {
2367 CmdArgs.push_back("-target-cpu");
2368 CmdArgs.push_back(Args.MakeArgString(CPU));
2369 }
2370
2371 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002372 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00002373 default:
2374 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002375
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002376 case llvm::Triple::arm:
2377 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002378 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002379 break;
2380
Eric Christophered734732010-03-02 02:41:08 +00002381 case llvm::Triple::mips:
2382 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002383 case llvm::Triple::mips64:
2384 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002385 AddMIPSTargetArgs(Args, CmdArgs);
2386 break;
2387
Hal Finkel02a84272012-06-11 22:35:19 +00002388 case llvm::Triple::ppc:
2389 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002390 case llvm::Triple::ppc64le:
Hal Finkel02a84272012-06-11 22:35:19 +00002391 AddPPCTargetArgs(Args, CmdArgs);
2392 break;
2393
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002394 case llvm::Triple::sparc:
2395 AddSparcTargetArgs(Args, CmdArgs);
2396 break;
2397
Daniel Dunbar6acda162009-09-09 22:33:08 +00002398 case llvm::Triple::x86:
2399 case llvm::Triple::x86_64:
2400 AddX86TargetArgs(Args, CmdArgs);
2401 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002402
2403 case llvm::Triple::hexagon:
2404 AddHexagonTargetArgs(Args, CmdArgs);
2405 break;
Tim Northoverb793f0d2013-08-01 09:23:19 +00002406
2407 case llvm::Triple::aarch64:
2408 AddAArch64TargetArgs(Args, CmdArgs);
2409 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002410 }
2411
Hans Wennborgb3574792013-08-08 00:17:41 +00002412 // Add clang-cl arguments.
2413 if (getToolChain().getDriver().IsCLMode())
2414 AddClangCLArgs(Args, CmdArgs);
2415
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002416 // Pass the linker version in use.
2417 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2418 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002419 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002420 }
2421
Eric Christopherd3e22df2013-04-03 01:58:53 +00002422 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002423 CmdArgs.push_back("-momit-leaf-frame-pointer");
2424
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002425 // Explicitly error on some things we know we don't support and can't just
2426 // ignore.
2427 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002428 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2429 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002430 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002431 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002432 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002433 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2434 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002435 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002436 << Unsupported->getOption().getName();
2437 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002438 }
2439
Daniel Dunbar1d460332009-03-18 10:01:51 +00002440 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002441 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002442 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002443 CmdArgs.push_back("-header-include-file");
2444 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2445 D.CCPrintHeadersFilename : "-");
2446 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002447 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002448 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002449
Chad Rosier2b819102011-08-02 17:58:04 +00002450 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002451 CmdArgs.push_back("-diagnostic-log-file");
2452 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2453 D.CCLogDiagnosticsFilename : "-");
2454 }
2455
Eric Christopherc706c8e2013-02-05 07:29:57 +00002456 // Use the last option from "-g" group. "-gline-tables-only"
2457 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002458 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002459 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002460 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002461 CmdArgs.push_back("-gline-tables-only");
Manman Renfc0f91c2013-06-19 01:46:49 +00002462 else if (A->getOption().matches(options::OPT_gdwarf_2))
2463 CmdArgs.push_back("-gdwarf-2");
2464 else if (A->getOption().matches(options::OPT_gdwarf_3))
2465 CmdArgs.push_back("-gdwarf-3");
2466 else if (A->getOption().matches(options::OPT_gdwarf_4))
2467 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002468 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00002469 !A->getOption().matches(options::OPT_ggdb0)) {
2470 // Default is dwarf-2 for darwin.
2471 if (getToolChain().getTriple().isOSDarwin())
2472 CmdArgs.push_back("-gdwarf-2");
2473 else
2474 CmdArgs.push_back("-g");
2475 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002476 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002477
Alexey Samsonov7f326072012-06-21 08:22:39 +00002478 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2479 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002480 if (Args.hasArg(options::OPT_gcolumn_info))
2481 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002482
Eric Christopherc706c8e2013-02-05 07:29:57 +00002483 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2484 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002485 // FIXME: Currently only works on Linux.
2486 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2487 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002488 CmdArgs.push_back("-g");
2489 CmdArgs.push_back("-backend-option");
2490 CmdArgs.push_back("-split-dwarf=Enable");
2491 }
2492
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002493
2494 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2495
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002496 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2497 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2498
Chris Lattner7255a2d2010-06-22 00:03:40 +00002499 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2500
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002501 if (Args.hasArg(options::OPT_ftest_coverage) ||
2502 Args.hasArg(options::OPT_coverage))
2503 CmdArgs.push_back("-femit-coverage-notes");
2504 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2505 Args.hasArg(options::OPT_coverage))
2506 CmdArgs.push_back("-femit-coverage-data");
2507
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002508 if (C.getArgs().hasArg(options::OPT_c) ||
2509 C.getArgs().hasArg(options::OPT_S)) {
2510 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002511 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002512 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002513 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00002514 SmallString<128> Pwd;
2515 if (!llvm::sys::fs::current_path(Pwd)) {
2516 llvm::sys::path::append(Pwd, CoverageFilename.str());
2517 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00002518 }
2519 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002520 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002521 }
2522 }
2523
Daniel Dunbara268fc02011-10-11 18:20:10 +00002524 // Pass options for controlling the default header search paths.
2525 if (Args.hasArg(options::OPT_nostdinc)) {
2526 CmdArgs.push_back("-nostdsysteminc");
2527 CmdArgs.push_back("-nobuiltininc");
2528 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002529 if (Args.hasArg(options::OPT_nostdlibinc))
2530 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002531 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2532 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2533 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002534
Daniel Dunbar5f122322009-12-15 01:02:52 +00002535 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002536 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002537 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002538
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002539 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2540
Ted Kremenek30660a82012-03-06 20:06:33 +00002541 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002542 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002543 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002544 options::OPT_ccc_arcmt_modify,
2545 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002546 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002547 switch (A->getOption().getID()) {
2548 default:
2549 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002550 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002551 CmdArgs.push_back("-arcmt-check");
2552 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002553 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002554 CmdArgs.push_back("-arcmt-modify");
2555 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002556 case options::OPT_ccc_arcmt_migrate:
2557 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002558 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002559 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002560
2561 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2562 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002563 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002564 }
2565 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00002566 } else {
2567 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2568 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2569 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00002570 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002571
Ted Kremenek30660a82012-03-06 20:06:33 +00002572 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2573 if (ARCMTEnabled) {
2574 D.Diag(diag::err_drv_argument_not_allowed_with)
2575 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2576 }
2577 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002578 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002579
2580 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002581 options::OPT_objcmt_migrate_subscripting,
2582 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002583 // None specified, means enable them all.
2584 CmdArgs.push_back("-objcmt-migrate-literals");
2585 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002586 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00002587 } else {
2588 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2589 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002590 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00002591 }
2592 }
2593
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002594 // Add preprocessing options like -I, -D, etc. if we are using the
2595 // preprocessor.
2596 //
2597 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002598 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002599 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002600
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002601 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2602 // that "The compiler can only warn and ignore the option if not recognized".
2603 // When building with ccache, it will pass -D options to clang even on
2604 // preprocessed inputs and configure concludes that -fPIC is not supported.
2605 Args.ClaimAllArgs(options::OPT_D);
2606
Hans Wennborgf10fa8d2013-08-01 16:21:57 +00002607 // Manually translate -O4 to -O3; let clang reject others.
Daniel Dunbar337a6272009-03-24 20:17:30 +00002608 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002609 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002610 CmdArgs.push_back("-O3");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002611 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002612 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002613 }
2614
Chad Rosierb2c08872012-12-12 20:06:31 +00002615 // Don't warn about unused -flto. This can happen when we're preprocessing or
2616 // precompiling.
2617 Args.ClaimAllArgs(options::OPT_flto);
2618
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002619 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002620 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2621 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002622 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002623 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002624
2625 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00002626 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00002627 //
2628 // If a std is supplied, only add -trigraphs if it follows the
2629 // option.
2630 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2631 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002632 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002633 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002634 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002635 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002636 else
2637 Std->render(Args, CmdArgs);
2638
Daniel Dunbar0e100312010-06-14 21:23:08 +00002639 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2640 options::OPT_trigraphs))
2641 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002642 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002643 } else {
2644 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002645 //
2646 // FIXME: Clang doesn't correctly handle -std= when the input language
2647 // doesn't match. For the time being just ignore this for C++ inputs;
2648 // eventually we want to do all the standard defaulting here instead of
2649 // splitting it between the driver and clang -cc1.
2650 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002651 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2652 "-std=", /*Joined=*/true);
2653 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2654 CmdArgs.push_back("-std=c++11");
2655
Daniel Dunbard573d262009-04-07 22:13:21 +00002656 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002657 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002658
Chandler Carruth50465d12011-04-23 06:30:43 +00002659 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2660 // '-fconst-strings'; this better indicates its actual behavior.
2661 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2662 false)) {
2663 // For perfect compatibility with GCC, we do this even in the presence of
2664 // '-w'. This flag names something other than a warning for GCC.
2665 CmdArgs.push_back("-fconst-strings");
2666 }
2667
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002668 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002669 // during C++ compilation, which it is by default. GCC keeps this define even
2670 // in the presence of '-w', match this behavior bug-for-bug.
2671 if (types::isCXX(InputType) &&
2672 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2673 true)) {
2674 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002675 }
2676
Chandler Carruthc304ba32010-05-22 02:21:53 +00002677 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2678 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2679 if (Asm->getOption().matches(options::OPT_fasm))
2680 CmdArgs.push_back("-fgnu-keywords");
2681 else
2682 CmdArgs.push_back("-fno-gnu-keywords");
2683 }
2684
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002685 if (ShouldDisableCFI(Args, getToolChain()))
2686 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002687
Nick Lewyckyea523d72011-10-17 23:05:52 +00002688 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2689 CmdArgs.push_back("-fno-dwarf-directory-asm");
2690
Daniel Dunbarf4910132013-04-16 18:21:19 +00002691 if (ShouldDisableAutolink(Args, getToolChain()))
2692 CmdArgs.push_back("-fno-autolink");
2693
Chandler Carruthd566df62012-12-17 21:40:04 +00002694 // Add in -fdebug-compilation-dir if necessary.
2695 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002696
Richard Smithc18c4232011-11-21 19:36:32 +00002697 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2698 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002699 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002700 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002701 }
2702
Richard Smithc18c4232011-11-21 19:36:32 +00002703 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2704 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002705 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002706 }
2707
Richard Smithe7565632013-05-08 02:12:03 +00002708 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2709 CmdArgs.push_back("-fconstexpr-steps");
2710 CmdArgs.push_back(A->getValue());
2711 }
2712
Richard Smith9e738cc2013-02-22 01:59:51 +00002713 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2714 CmdArgs.push_back("-fbracket-depth");
2715 CmdArgs.push_back(A->getValue());
2716 }
2717
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002718 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2719 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002720 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002721 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002722 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2723 } else
2724 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002725 }
2726
Nuno Lopesb3198a82012-05-08 22:10:46 +00002727
Michael J. Spencerc6357102012-10-22 22:13:48 +00002728 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002729 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002730
Daniel Dunbar294691e2009-11-04 06:24:38 +00002731 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2732 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002733 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002734 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002735
Chris Lattner124fca52010-01-09 21:54:33 +00002736 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2737 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002738 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002739 }
2740
Chris Lattner0f0c9632010-04-07 20:49:23 +00002741 CmdArgs.push_back("-ferror-limit");
2742 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002743 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002744 else
2745 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002746
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002747 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2748 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002749 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002750 }
2751
2752 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2753 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002754 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002755 }
2756
Richard Smith08d6e032011-12-16 19:06:07 +00002757 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2758 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002759 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002760 }
2761
Daniel Dunbar55efe142009-11-04 06:24:47 +00002762 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002763 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002764 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002765 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002766 } else {
2767 // If -fmessage-length=N was not specified, determine whether this is a
2768 // terminal and, if so, implicitly define -fmessage-length appropriately.
2769 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002770 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002771 }
2772
John McCalla880b192013-02-19 01:57:35 +00002773 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2774 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2775 options::OPT_fvisibility_ms_compat)) {
2776 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2777 CmdArgs.push_back("-fvisibility");
2778 CmdArgs.push_back(A->getValue());
2779 } else {
2780 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2781 CmdArgs.push_back("-fvisibility");
2782 CmdArgs.push_back("hidden");
2783 CmdArgs.push_back("-ftype-visibility");
2784 CmdArgs.push_back("default");
2785 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002786 }
2787
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002788 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002789
Hans Wennborgde981f32012-06-28 08:01:44 +00002790 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2791
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002792 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002793 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2794 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002795 CmdArgs.push_back("-ffreestanding");
2796
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002797 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002798 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002799 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002800 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002801 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002802 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00002803 // AltiVec language extensions aren't relevant for assembling.
2804 if (!isa<PreprocessJobAction>(JA) ||
2805 Output.getType() != types::TY_PP_Asm)
2806 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002807 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2808 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002809
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00002810 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00002811 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00002812
Will Dietz2d382d12012-12-30 20:53:28 +00002813 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2814 options::OPT_fno_sanitize_recover,
2815 true))
2816 CmdArgs.push_back("-fno-sanitize-recover");
2817
Chad Rosier78d85b12013-01-29 23:31:22 +00002818 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2819 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2820 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2821 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2822
Eric Christopher98654c92013-02-19 06:16:53 +00002823 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002824 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002825 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002826 getToolChain().getArch() == llvm::Triple::ppc64 ||
2827 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00002828 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002829 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00002830
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002831 if (getToolChain().SupportsProfiling())
2832 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002833
2834 // -flax-vector-conversions is default.
2835 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2836 options::OPT_fno_lax_vector_conversions))
2837 CmdArgs.push_back("-fno-lax-vector-conversions");
2838
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002839 if (Args.getLastArg(options::OPT_fapple_kext))
2840 CmdArgs.push_back("-fapple-kext");
2841
David Blaikie940152f2012-06-14 18:55:27 +00002842 if (Args.hasFlag(options::OPT_frewrite_includes,
2843 options::OPT_fno_rewrite_includes, false))
2844 CmdArgs.push_back("-frewrite-includes");
2845
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002846 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002847 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002848 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002849 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2850 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002851
2852 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2853 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002854 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002855 }
2856
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002857 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002858
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002859 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2860 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2861 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2862 options::OPT_fno_wrapv)) {
2863 if (A->getOption().matches(options::OPT_fwrapv))
2864 CmdArgs.push_back("-fwrapv");
2865 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2866 options::OPT_fno_strict_overflow)) {
2867 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2868 CmdArgs.push_back("-fwrapv");
2869 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002870 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00002871 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2872 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002873
Daniel Dunbar5345c392009-09-03 04:54:28 +00002874 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2875
Mahesha Sf3b52312012-10-27 07:47:56 +00002876
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002877 // -stack-protector=0 is default.
2878 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002879 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2880 options::OPT_fstack_protector_all,
2881 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002882 if (A->getOption().matches(options::OPT_fstack_protector))
2883 StackProtectorLevel = 1;
2884 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2885 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002886 } else {
2887 StackProtectorLevel =
2888 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2889 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002890 if (StackProtectorLevel) {
2891 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002892 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002893 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002894
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002895 // --param ssp-buffer-size=
2896 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2897 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002898 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002899 if (Str.startswith("ssp-buffer-size=")) {
2900 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002901 CmdArgs.push_back("-stack-protector-buffer-size");
2902 // FIXME: Verify the argument is a valid integer.
2903 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002904 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002905 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002906 }
Bill Wendling45483f72009-06-28 07:36:13 +00002907 }
2908
Nick Lewycky4e785c92011-12-06 03:33:03 +00002909 // Translate -mstackrealign
2910 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2911 false)) {
2912 CmdArgs.push_back("-backend-option");
2913 CmdArgs.push_back("-force-align-stack");
2914 }
2915 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2916 false)) {
2917 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2918 }
2919
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002920 if (Args.hasArg(options::OPT_mstack_alignment)) {
2921 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2922 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002923 }
Chad Rosier586a0612012-11-29 00:42:06 +00002924 // -mkernel implies -mstrict-align; don't add the redundant option.
2925 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosier485577d2012-11-09 18:27:01 +00002926 CmdArgs.push_back("-backend-option");
2927 CmdArgs.push_back("-arm-strict-align");
Chad Rosier7e293272012-11-09 17:29:19 +00002928 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002929
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002930 // Forward -f options with positive and negative forms; we translate
2931 // these by hand.
2932
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002933 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002934 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002935 CmdArgs.push_back("-fapple-kext");
2936 if (!Args.hasArg(options::OPT_fbuiltin))
2937 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002938 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002939 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002940 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002941 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002942 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002943
Nuno Lopesfc284482009-12-16 16:59:22 +00002944 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2945 options::OPT_fno_assume_sane_operator_new))
2946 CmdArgs.push_back("-fno-assume-sane-operator-new");
2947
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002948 // -fblocks=0 is default.
2949 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002950 getToolChain().IsBlocksDefault()) ||
2951 (Args.hasArg(options::OPT_fgnu_runtime) &&
2952 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2953 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002954 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002955
2956 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2957 !getToolChain().hasBlocksRuntime())
2958 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002959 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002960
Douglas Gregor64554ba2012-01-18 15:19:58 +00002961 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2962 // users must also pass -fcxx-modules. The latter flag will disappear once the
2963 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00002964 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00002965 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2966 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2967 options::OPT_fno_cxx_modules,
2968 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00002969 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00002970 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00002971 HaveModules = true;
2972 }
2973 }
2974
Daniel Jasper056ec122013-08-05 20:26:17 +00002975 // -fmodule-maps enables module map processing (off by default) for header
2976 // checking. It is implied by -fmodules.
2977 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
2978 false)) {
2979 CmdArgs.push_back("-fmodule-maps");
2980 }
2981
Douglas Gregor953a61f2013-02-07 19:01:24 +00002982 // If a module path was provided, pass it along. Otherwise, use a temporary
2983 // directory.
2984 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2985 A->claim();
2986 if (HaveModules) {
2987 A->render(Args, CmdArgs);
2988 }
2989 } else if (HaveModules) {
2990 SmallString<128> DefaultModuleCache;
2991 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2992 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00002993 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
2994 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00002995 const char Arg[] = "-fmodules-cache-path=";
2996 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2997 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00002998 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2999 }
3000
3001 // Pass through all -fmodules-ignore-macro arguments.
3002 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003003 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3004 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003005
John McCall32579cf2010-04-09 19:12:06 +00003006 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003007 if (Args.hasFlag(options::OPT_fno_access_control,
3008 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003009 false))
John McCall7002f4c2010-04-09 19:03:51 +00003010 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003011
Anders Carlssona4c24752010-11-21 00:09:52 +00003012 // -felide-constructors is the default.
3013 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3014 options::OPT_felide_constructors,
3015 false))
3016 CmdArgs.push_back("-fno-elide-constructors");
3017
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003018 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003019 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003020 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003021 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003022
Richard Smithc4dabad2012-11-05 22:04:41 +00003023 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003024 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003025 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003026 Args.getLastArg(options::OPT_mkernel,
3027 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003028 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003029 D.Diag(diag::err_drv_argument_not_allowed_with)
3030 << "-fsanitize=vptr" << NoRttiArg;
3031 }
3032 }
3033
Tony Linthicum96319392011-12-12 21:14:55 +00003034 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003035 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003036 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003037 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00003038 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003039 CmdArgs.push_back("-fshort-enums");
3040
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003041 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003042 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003043 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003044 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003045
Anders Carlssona508b7d2010-02-06 23:23:06 +00003046 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003047 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003048 options::OPT_fno_threadsafe_statics))
3049 CmdArgs.push_back("-fno-threadsafe-statics");
3050
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003051 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003052 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3053 options::OPT_fno_use_cxa_atexit,
3054 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00003055 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003056 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00003057 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003058 CmdArgs.push_back("-fno-use-cxa-atexit");
3059
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003060 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003061 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003062 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3063 CmdArgs.push_back("-fms-extensions");
3064
Francois Pichetae556082011-09-17 04:32:15 +00003065 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003066 if (Args.hasFlag(options::OPT_fms_compatibility,
3067 options::OPT_fno_ms_compatibility,
3068 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3069 Args.hasFlag(options::OPT_fms_extensions,
3070 options::OPT_fno_ms_extensions,
3071 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003072 CmdArgs.push_back("-fms-compatibility");
3073
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003074 // -fmsc-version=1300 is default.
3075 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3076 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3077 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003078 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003079 if (msc_ver.empty())
3080 CmdArgs.push_back("-fmsc-version=1300");
3081 else
3082 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3083 }
3084
3085
Eric Christophercfc01e42013-02-18 00:38:31 +00003086 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003087 if (Args.hasFlag(options::OPT_fborland_extensions,
3088 options::OPT_fno_borland_extensions, false))
3089 CmdArgs.push_back("-fborland-extensions");
3090
Francois Pichet8efcc012011-09-01 16:38:08 +00003091 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3092 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003093 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3094 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003095 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003096 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003097
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003098 // -fgnu-keywords default varies depending on language; only pass if
3099 // specified.
3100 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003101 options::OPT_fno_gnu_keywords))
3102 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003103
Rafael Espindola01ba8542011-06-02 17:30:53 +00003104 if (Args.hasFlag(options::OPT_fgnu89_inline,
3105 options::OPT_fno_gnu89_inline,
3106 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003107 CmdArgs.push_back("-fgnu89-inline");
3108
Chad Rosierfc055f92012-03-15 22:31:42 +00003109 if (Args.hasArg(options::OPT_fno_inline))
3110 CmdArgs.push_back("-fno-inline");
3111
Chad Rosier634a4b12012-03-06 21:17:19 +00003112 if (Args.hasArg(options::OPT_fno_inline_functions))
3113 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003114
John McCall260611a2012-06-20 06:18:46 +00003115 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003116
John McCall260611a2012-06-20 06:18:46 +00003117 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3118 // legacy is the default.
3119 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003120 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3121 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003122 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003123 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003124 if (getToolChain().UseObjCMixedDispatch())
3125 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3126 else
3127 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3128 }
3129 }
3130
Nico Weberdf423542012-03-09 21:19:44 +00003131 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3132 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00003133 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003134 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3135 }
3136
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003137 // -fencode-extended-block-signature=1 is default.
3138 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3139 CmdArgs.push_back("-fencode-extended-block-signature");
3140 }
3141
John McCall9f084a32011-07-06 00:26:06 +00003142 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3143 // NOTE: This logic is duplicated in ToolChains.cpp.
3144 bool ARC = isObjCAutoRefCount(Args);
3145 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003146 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003147
John McCall9f084a32011-07-06 00:26:06 +00003148 CmdArgs.push_back("-fobjc-arc");
3149
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003150 // FIXME: It seems like this entire block, and several around it should be
3151 // wrapped in isObjC, but for now we just use it here as this is where it
3152 // was being used previously.
3153 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3154 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3155 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3156 else
3157 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3158 }
3159
John McCall9f084a32011-07-06 00:26:06 +00003160 // Allow the user to enable full exceptions code emission.
3161 // We define off for Objective-CC, on for Objective-C++.
3162 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3163 options::OPT_fno_objc_arc_exceptions,
3164 /*default*/ types::isCXX(InputType)))
3165 CmdArgs.push_back("-fobjc-arc-exceptions");
3166 }
3167
3168 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3169 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003170 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003171 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003172
John McCall9f084a32011-07-06 00:26:06 +00003173 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3174 // takes precedence.
3175 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3176 if (!GCArg)
3177 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3178 if (GCArg) {
3179 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003180 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003181 << GCArg->getAsString(Args);
3182 } else if (getToolChain().SupportsObjCGC()) {
3183 GCArg->render(Args, CmdArgs);
3184 } else {
3185 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003186 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003187 << GCArg->getAsString(Args);
3188 }
3189 }
3190
John McCalld71315c2011-06-22 00:53:57 +00003191 // Add exception args.
3192 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003193 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003194
3195 if (getToolChain().UseSjLjExceptions())
3196 CmdArgs.push_back("-fsjlj-exceptions");
3197
3198 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003199 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3200 options::OPT_fno_assume_sane_operator_new))
3201 CmdArgs.push_back("-fno-assume-sane-operator-new");
3202
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003203 // -fconstant-cfstrings is default, and may be subject to argument translation
3204 // on Darwin.
3205 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3206 options::OPT_fno_constant_cfstrings) ||
3207 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3208 options::OPT_mno_constant_cfstrings))
3209 CmdArgs.push_back("-fno-constant-cfstrings");
3210
John Thompsona6fda122009-11-05 20:14:16 +00003211 // -fshort-wchar default varies depending on platform; only
3212 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003213 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3214 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003215
Hans Wennborgb087a5d2013-07-31 23:39:13 +00003216 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003217 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003218 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003219 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003220 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003221
Daniel Dunbar88934e82011-10-05 21:04:55 +00003222 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3223 // -fno-pack-struct doesn't apply to -fpack-struct=.
3224 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003225 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003226 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003227 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003228 } else if (Args.hasFlag(options::OPT_fpack_struct,
3229 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003230 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003231 }
3232
Robert Lytton5f15f4d2013-08-13 09:43:10 +00003233 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003234 if (!Args.hasArg(options::OPT_fcommon))
3235 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003236 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003237 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003238
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003239 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003240 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003241 CmdArgs.push_back("-fno-common");
3242
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003243 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003244 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003245 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003246 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003247 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003248 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3249
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003250 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3251 if (!Args.hasFlag(options::OPT_ffor_scope,
3252 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003253 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003254 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3255
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003256 // -fcaret-diagnostics is default.
3257 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3258 options::OPT_fno_caret_diagnostics, true))
3259 CmdArgs.push_back("-fno-caret-diagnostics");
3260
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003261 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003262 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003263 options::OPT_fno_diagnostics_fixit_info))
3264 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003265
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003266 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003267 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003268 options::OPT_fno_diagnostics_show_option))
3269 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003270
Chris Lattner6fbe8392010-05-04 21:55:25 +00003271 if (const Arg *A =
3272 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3273 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003274 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003275 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003276
Douglas Gregorc9471b02011-05-21 17:07:29 +00003277 if (const Arg *A =
3278 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3279 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003280 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003281 }
3282
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003283 if (Arg *A = Args.getLastArg(
3284 options::OPT_fdiagnostics_show_note_include_stack,
3285 options::OPT_fno_diagnostics_show_note_include_stack)) {
3286 if (A->getOption().matches(
3287 options::OPT_fdiagnostics_show_note_include_stack))
3288 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3289 else
3290 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3291 }
3292
Daniel Dunbar838be482009-11-04 06:24:57 +00003293 // Color diagnostics are the default, unless the terminal doesn't support
3294 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003295 // Support both clang's -f[no-]color-diagnostics and gcc's
3296 // -f[no-]diagnostics-colors[=never|always|auto].
3297 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3298 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3299 it != ie; ++it) {
3300 const Option &O = (*it)->getOption();
3301 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3302 !O.matches(options::OPT_fdiagnostics_color) &&
3303 !O.matches(options::OPT_fno_color_diagnostics) &&
3304 !O.matches(options::OPT_fno_diagnostics_color) &&
3305 !O.matches(options::OPT_fdiagnostics_color_EQ))
3306 continue;
3307
3308 (*it)->claim();
3309 if (O.matches(options::OPT_fcolor_diagnostics) ||
3310 O.matches(options::OPT_fdiagnostics_color)) {
3311 ShowColors = Colors_On;
3312 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3313 O.matches(options::OPT_fno_diagnostics_color)) {
3314 ShowColors = Colors_Off;
3315 } else {
3316 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3317 StringRef value((*it)->getValue());
3318 if (value == "always")
3319 ShowColors = Colors_On;
3320 else if (value == "never")
3321 ShowColors = Colors_Off;
3322 else if (value == "auto")
3323 ShowColors = Colors_Auto;
3324 else
3325 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3326 << ("-fdiagnostics-color=" + value).str();
3327 }
3328 }
3329 if (ShowColors == Colors_On ||
3330 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003331 CmdArgs.push_back("-fcolor-diagnostics");
3332
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003333 if (!Args.hasFlag(options::OPT_fshow_source_location,
3334 options::OPT_fno_show_source_location))
3335 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003336
Douglas Gregorc9471b02011-05-21 17:07:29 +00003337 if (!Args.hasFlag(options::OPT_fshow_column,
3338 options::OPT_fno_show_column,
3339 true))
3340 CmdArgs.push_back("-fno-show-column");
3341
Douglas Gregora0068fc2010-07-09 17:35:33 +00003342 if (!Args.hasFlag(options::OPT_fspell_checking,
3343 options::OPT_fno_spell_checking))
3344 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003345
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003346
Chad Rosier15490fd2012-12-05 21:08:21 +00003347 // -fno-asm-blocks is default.
3348 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3349 false))
3350 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003351
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003352 // Enable vectorization per default according to the optimization level
3353 // selected. For optimization levels that want vectorization we use the alias
3354 // option to simplify the hasFlag logic.
3355 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3356 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00003357 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00003358 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003359 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00003360 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00003361
Rafael Espindolad8360612013-08-01 23:56:42 +00003362 // -fslp-vectorize is default.
3363 if (Args.hasFlag(options::OPT_fslp_vectorize,
3364 options::OPT_fno_slp_vectorize, true))
Nadav Rotem50ea9632013-04-15 04:57:18 +00003365 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003366
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003367 // -fno-slp-vectorize-aggressive is default.
3368 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003369 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003370 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003371
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003372 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3373 A->render(Args, CmdArgs);
3374
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003375 // -fdollars-in-identifiers default varies depending on platform and
3376 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003377 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003378 options::OPT_fno_dollars_in_identifiers)) {
3379 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003380 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003381 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003382 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003383 }
3384
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003385 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3386 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003387 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003388 options::OPT_fno_unit_at_a_time)) {
3389 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003390 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003391 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003392
Eli Friedman19bda3a2011-11-02 01:53:16 +00003393 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3394 options::OPT_fno_apple_pragma_pack, false))
3395 CmdArgs.push_back("-fapple-pragma-pack");
3396
Eli Benderskyf3ecf892013-07-24 18:20:14 +00003397 // le32-specific flags:
3398 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3399 // by default.
3400 if (getToolChain().getArch() == llvm::Triple::le32) {
3401 CmdArgs.push_back("-fno-math-builtin");
3402 }
3403
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003404 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003405 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003406 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003407#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003408 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003409 (getToolChain().getArch() == llvm::Triple::arm ||
3410 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003411 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3412 CmdArgs.push_back("-fno-builtin-strcat");
3413 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3414 CmdArgs.push_back("-fno-builtin-strcpy");
3415 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003416#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003417
Daniel Dunbard98750f2011-03-18 21:23:40 +00003418 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003419 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003420 options::OPT_traditional_cpp)) {
3421 if (isa<PreprocessJobAction>(JA))
3422 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003423 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003424 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003425 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003426
Daniel Dunbar1d460332009-03-18 10:01:51 +00003427 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003428 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003429
3430 // Handle serialized diagnostics.
3431 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3432 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003433 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003434 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003435
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003436 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3437 CmdArgs.push_back("-fretain-comments-from-system-headers");
3438
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003439 // Forward -fcomment-block-commands to -cc1.
3440 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003441 // Forward -fparse-all-comments to -cc1.
3442 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003443
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003444 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3445 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003446 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003447 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3448 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003449 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003450
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003451 // We translate this by hand to the -cc1 argument, since nightly test uses
3452 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003453 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003454 CmdArgs.push_back("-disable-llvm-optzns");
3455 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003456 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003457 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003458
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003459 if (Output.getType() == types::TY_Dependencies) {
3460 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003461 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003462 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003463 CmdArgs.push_back(Output.getFilename());
3464 } else {
3465 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003466 }
3467
Daniel Dunbar1d460332009-03-18 10:01:51 +00003468 for (InputInfoList::const_iterator
3469 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3470 const InputInfo &II = *it;
3471 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003472 if (Args.hasArg(options::OPT_rewrite_objc))
3473 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3474 else
3475 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003476 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003477 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003478 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003479 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003480 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003481
Chris Lattnere6113de2009-11-03 19:50:27 +00003482 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3483
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003484 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003485
3486 // Optionally embed the -cc1 level arguments into the debug info, for build
3487 // analysis.
3488 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003489 ArgStringList OriginalArgs;
3490 for (ArgList::const_iterator it = Args.begin(),
3491 ie = Args.end(); it != ie; ++it)
3492 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003493
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003494 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003495 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003496 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003497 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003498 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003499 }
3500 CmdArgs.push_back("-dwarf-debug-flags");
3501 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3502 }
3503
Eric Christopher80190392013-02-22 20:12:52 +00003504 // Add the split debug info name to the command lines here so we
3505 // can propagate it to the backend.
3506 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3507 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherff971d72013-02-22 23:50:16 +00003508 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003509 const char *SplitDwarfOut;
3510 if (SplitDwarf) {
3511 CmdArgs.push_back("-split-dwarf-file");
3512 SplitDwarfOut = SplitDebugName(Args, Inputs);
3513 CmdArgs.push_back(SplitDwarfOut);
3514 }
3515
3516 // Finally add the compile command to the compilation.
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003517 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00003518
Eric Christopherff971d72013-02-22 23:50:16 +00003519 // Handle the debug info splitting at object creation time if we're
3520 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003521 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003522 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003523 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003524
Roman Divackybe4c8702011-02-10 16:52:03 +00003525 if (Arg *A = Args.getLastArg(options::OPT_pg))
3526 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003527 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003528 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003529
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003530 // Claim some arguments which clang supports automatically.
3531
Daniel Dunbarf4046862010-04-15 06:18:42 +00003532 // -fpch-preprocess is used with gcc to add a special marker in the output to
3533 // include the PCH file. Clang's PTH solution is completely transparent, so we
3534 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003535 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003536
Daniel Dunbara880db02009-03-23 19:03:36 +00003537 // Claim some arguments which clang doesn't support, but we don't
3538 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003539 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3540 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003541
Hans Wennborg09c34632013-08-02 22:24:50 +00003542 // Claim ignored clang-cl options.
3543 Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
3544
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003545 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003546 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003547 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003548}
3549
Jim Grosbachfc308292012-02-10 20:37:10 +00003550void ClangAs::AddARMTargetArgs(const ArgList &Args,
3551 ArgStringList &CmdArgs) const {
3552 const Driver &D = getToolChain().getDriver();
3553 llvm::Triple Triple = getToolChain().getTriple();
3554
Jim Grosbachfc308292012-02-10 20:37:10 +00003555 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00003556 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00003557 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00003558
3559 // Honor -mfpmath=.
3560 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00003561 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00003562}
3563
John McCall260611a2012-06-20 06:18:46 +00003564/// Add options related to the Objective-C runtime/ABI.
3565///
3566/// Returns true if the runtime is non-fragile.
3567ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3568 ArgStringList &cmdArgs,
3569 RewriteKind rewriteKind) const {
3570 // Look for the controlling runtime option.
3571 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3572 options::OPT_fgnu_runtime,
3573 options::OPT_fobjc_runtime_EQ);
3574
3575 // Just forward -fobjc-runtime= to the frontend. This supercedes
3576 // options about fragility.
3577 if (runtimeArg &&
3578 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3579 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003580 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003581 if (runtime.tryParse(value)) {
3582 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3583 << value;
3584 }
3585
3586 runtimeArg->render(args, cmdArgs);
3587 return runtime;
3588 }
3589
3590 // Otherwise, we'll need the ABI "version". Version numbers are
3591 // slightly confusing for historical reasons:
3592 // 1 - Traditional "fragile" ABI
3593 // 2 - Non-fragile ABI, version 1
3594 // 3 - Non-fragile ABI, version 2
3595 unsigned objcABIVersion = 1;
3596 // If -fobjc-abi-version= is present, use that to set the version.
3597 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003598 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003599 if (value == "1")
3600 objcABIVersion = 1;
3601 else if (value == "2")
3602 objcABIVersion = 2;
3603 else if (value == "3")
3604 objcABIVersion = 3;
3605 else
3606 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3607 << value;
3608 } else {
3609 // Otherwise, determine if we are using the non-fragile ABI.
3610 bool nonFragileABIIsDefault =
3611 (rewriteKind == RK_NonFragile ||
3612 (rewriteKind == RK_None &&
3613 getToolChain().IsObjCNonFragileABIDefault()));
3614 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3615 options::OPT_fno_objc_nonfragile_abi,
3616 nonFragileABIIsDefault)) {
3617 // Determine the non-fragile ABI version to use.
3618#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3619 unsigned nonFragileABIVersion = 1;
3620#else
3621 unsigned nonFragileABIVersion = 2;
3622#endif
3623
3624 if (Arg *abiArg = args.getLastArg(
3625 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003626 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003627 if (value == "1")
3628 nonFragileABIVersion = 1;
3629 else if (value == "2")
3630 nonFragileABIVersion = 2;
3631 else
3632 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3633 << value;
3634 }
3635
3636 objcABIVersion = 1 + nonFragileABIVersion;
3637 } else {
3638 objcABIVersion = 1;
3639 }
3640 }
3641
3642 // We don't actually care about the ABI version other than whether
3643 // it's non-fragile.
3644 bool isNonFragile = objcABIVersion != 1;
3645
3646 // If we have no runtime argument, ask the toolchain for its default runtime.
3647 // However, the rewriter only really supports the Mac runtime, so assume that.
3648 ObjCRuntime runtime;
3649 if (!runtimeArg) {
3650 switch (rewriteKind) {
3651 case RK_None:
3652 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3653 break;
3654 case RK_Fragile:
3655 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3656 break;
3657 case RK_NonFragile:
3658 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3659 break;
3660 }
3661
3662 // -fnext-runtime
3663 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3664 // On Darwin, make this use the default behavior for the toolchain.
3665 if (getToolChain().getTriple().isOSDarwin()) {
3666 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3667
3668 // Otherwise, build for a generic macosx port.
3669 } else {
3670 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3671 }
3672
3673 // -fgnu-runtime
3674 } else {
3675 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003676 // Legacy behaviour is to target the gnustep runtime if we are i
3677 // non-fragile mode or the GCC runtime in fragile mode.
3678 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003679 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003680 else
3681 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003682 }
3683
3684 cmdArgs.push_back(args.MakeArgString(
3685 "-fobjc-runtime=" + runtime.getAsString()));
3686 return runtime;
3687}
3688
Hans Wennborgb3574792013-08-08 00:17:41 +00003689void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3690 unsigned RTOptionID = options::OPT__SLASH_MT;
3691
3692 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD,
3693 options::OPT__SLASH_MDd,
3694 options::OPT__SLASH_MT,
3695 options::OPT__SLASH_MTd)) {
3696 RTOptionID = A->getOption().getID();
3697 }
3698
3699 switch(RTOptionID) {
3700 case options::OPT__SLASH_MD:
3701 CmdArgs.push_back("-D_MT");
3702 CmdArgs.push_back("-D_DLL");
3703 CmdArgs.push_back("--dependent-lib=msvcrt");
3704 break;
3705 case options::OPT__SLASH_MDd:
3706 CmdArgs.push_back("-D_DEBUG");
3707 CmdArgs.push_back("-D_MT");
3708 CmdArgs.push_back("-D_DLL");
3709 CmdArgs.push_back("--dependent-lib=msvcrtd");
3710 break;
3711 case options::OPT__SLASH_MT:
3712 CmdArgs.push_back("-D_MT");
3713 CmdArgs.push_back("--dependent-lib=libcmt");
3714 break;
3715 case options::OPT__SLASH_MTd:
3716 CmdArgs.push_back("-D_DEBUG");
3717 CmdArgs.push_back("-D_MT");
3718 CmdArgs.push_back("--dependent-lib=libcmtd");
3719 break;
3720 default:
3721 llvm_unreachable("Unexpected option ID.");
3722 }
3723
Reid Klecknera32c5232013-08-08 19:33:10 +00003724 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3725 // users want. The /Za flag to cl.exe turns this off, but it's not
3726 // implemented in clang.
3727 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00003728
3729 // FIXME: Make this default for the win32 triple.
3730 CmdArgs.push_back("-cxx-abi");
3731 CmdArgs.push_back("microsoft");
Hans Wennborg708002e2013-08-09 00:32:23 +00003732
3733 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3734 A->render(Args, CmdArgs);
Hans Wennborgb3574792013-08-08 00:17:41 +00003735}
3736
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003737void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003738 const InputInfo &Output,
3739 const InputInfoList &Inputs,
3740 const ArgList &Args,
3741 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003742 ArgStringList CmdArgs;
3743
3744 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3745 const InputInfo &Input = Inputs[0];
3746
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003747 // Don't warn about "clang -w -c foo.s"
3748 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003749 // and "clang -emit-llvm -c foo.s"
3750 Args.ClaimAllArgs(options::OPT_emit_llvm);
3751 // and "clang -use-gold-plugin -c foo.s"
3752 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003753
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003754 // Invoke ourselves in -cc1as mode.
3755 //
3756 // FIXME: Implement custom jobs for internal actions.
3757 CmdArgs.push_back("-cc1as");
3758
3759 // Add the "effective" target triple.
3760 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003761 std::string TripleStr =
3762 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003763 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3764
3765 // Set the output mode, we currently only expect to be used as a real
3766 // assembler.
3767 CmdArgs.push_back("-filetype");
3768 CmdArgs.push_back("obj");
3769
Eric Christopher27e2b982012-12-18 00:31:10 +00003770 // Set the main file name, so that debug info works even with
3771 // -save-temps or preprocessed assembly.
3772 CmdArgs.push_back("-main-file-name");
3773 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3774
Rafael Espindolab330e402013-08-20 22:12:08 +00003775 // Add the target cpu
3776 std::string CPU = getCPUName(Args, getToolChain().getTriple());
3777 if (!CPU.empty()) {
3778 CmdArgs.push_back("-target-cpu");
3779 CmdArgs.push_back(Args.MakeArgString(CPU));
3780 }
3781
3782 // Add target specific features flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003783 switch(getToolChain().getArch()) {
Jim Grosbachfc308292012-02-10 20:37:10 +00003784 default:
3785 break;
3786
3787 case llvm::Triple::arm:
3788 case llvm::Triple::thumb:
3789 AddARMTargetArgs(Args, CmdArgs);
3790 break;
3791 }
3792
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003793 // Ignore explicit -force_cpusubtype_ALL option.
3794 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003795
Eric Christopher8f0a4032012-01-10 00:38:01 +00003796 // Determine the original source input.
3797 const Action *SourceAction = &JA;
3798 while (SourceAction->getKind() != Action::InputClass) {
3799 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3800 SourceAction = SourceAction->getInputs()[0];
3801 }
3802
Chandler Carruthd566df62012-12-17 21:40:04 +00003803 // Forward -g and handle debug info related flags, assuming we are dealing
3804 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003805 if (SourceAction->getType() == types::TY_Asm ||
3806 SourceAction->getType() == types::TY_PP_Asm) {
3807 Args.ClaimAllArgs(options::OPT_g_Group);
3808 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3809 if (!A->getOption().matches(options::OPT_g0))
3810 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003811
3812 // Add the -fdebug-compilation-dir flag if needed.
3813 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003814
3815 // Set the AT_producer to the clang version when using the integrated
3816 // assembler on assembly source files.
3817 CmdArgs.push_back("-dwarf-debug-producer");
3818 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003819 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003820
3821 // Optionally embed the -cc1as level arguments into the debug info, for build
3822 // analysis.
3823 if (getToolChain().UseDwarfDebugFlags()) {
3824 ArgStringList OriginalArgs;
3825 for (ArgList::const_iterator it = Args.begin(),
3826 ie = Args.end(); it != ie; ++it)
3827 (*it)->render(Args, OriginalArgs);
3828
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003829 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003830 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3831 Flags += Exec;
3832 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3833 Flags += " ";
3834 Flags += OriginalArgs[i];
3835 }
3836 CmdArgs.push_back("-dwarf-debug-flags");
3837 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3838 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003839
3840 // FIXME: Add -static support, once we have it.
3841
David Blaikie73168db2013-07-25 21:19:01 +00003842 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3843 getToolChain().getDriver());
3844
Daniel Dunbar3df23252011-04-29 17:53:18 +00003845 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003846
3847 assert(Output.isFilename() && "Unexpected lipo output.");
3848 CmdArgs.push_back("-o");
3849 CmdArgs.push_back(Output.getFilename());
3850
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003851 assert(Input.isFilename() && "Invalid input.");
3852 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003853
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003854 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003855 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00003856
3857 // Handle the debug info splitting at object creation time if we're
3858 // creating an object.
3859 // TODO: Currently only works on linux with newer objcopy.
3860 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3861 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3862 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3863 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003864}
3865
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003866void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003867 const InputInfo &Output,
3868 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003869 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003870 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003871 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003872 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003873
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003874 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003875 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003876 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00003877 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003878 // Don't forward any -g arguments to assembly steps.
3879 if (isa<AssembleJobAction>(JA) &&
3880 A->getOption().matches(options::OPT_g_Group))
3881 continue;
3882
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00003883 // Don't forward any -W arguments to assembly and link steps.
3884 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
3885 A->getOption().matches(options::OPT_W_Group))
3886 continue;
3887
Daniel Dunbar75877192009-03-19 07:55:12 +00003888 // It is unfortunate that we have to claim here, as this means
3889 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003890 // platforms using a generic gcc, even if we are just using gcc
3891 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003892 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003893 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003894 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003895 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003896
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003897 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003898
3899 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003900 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00003901 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003902 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003903
3904 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003905 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003906 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003907 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003908 CmdArgs.push_back("ppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003909 else if (Arch == llvm::Triple::ppc64le)
3910 CmdArgs.push_back("ppc64le");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003911 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003912 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003913 }
3914
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003915 // Try to force gcc to match the tool chain we want, if we recognize
3916 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003917 //
3918 // FIXME: The triple class should directly provide the information we want
3919 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003920 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003921 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003922 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
3923 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003924 CmdArgs.push_back("-m64");
3925
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003926 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003927 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003928 CmdArgs.push_back(Output.getFilename());
3929 } else {
3930 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003931 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003932 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003933
Tony Linthicum96319392011-12-12 21:14:55 +00003934 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3935 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003936
3937 // Only pass -x if gcc will understand it; otherwise hope gcc
3938 // understands the suffix correctly. The main use case this would go
3939 // wrong in is for linker inputs if they happened to have an odd
3940 // suffix; really the only way to get this to happen is a command
3941 // like '-x foobar a.c' which will treat a.c like a linker input.
3942 //
3943 // FIXME: For the linker case specifically, can we safely convert
3944 // inputs into '-Wl,' options?
3945 for (InputInfoList::const_iterator
3946 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3947 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003948
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003949 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003950 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3951 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003952 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003953 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003954 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003955 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003956 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00003957 else if (II.getType() == types::TY_ModuleFile)
3958 D.Diag(diag::err_drv_no_module_support)
3959 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003960
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003961 if (types::canTypeBeUserSpecified(II.getType())) {
3962 CmdArgs.push_back("-x");
3963 CmdArgs.push_back(types::getTypeName(II.getType()));
3964 }
3965
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003966 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003967 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003968 else {
3969 const Arg &A = II.getInputArg();
3970
3971 // Reverse translate some rewritten options.
3972 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3973 CmdArgs.push_back("-lstdc++");
3974 continue;
3975 }
3976
Daniel Dunbar115a7922009-03-19 07:29:38 +00003977 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003978 A.render(Args, CmdArgs);
3979 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003980 }
3981
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003982 const std::string customGCCName = D.getCCCGenericGCCName();
3983 const char *GCCName;
3984 if (!customGCCName.empty())
3985 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00003986 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003987 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003988 } else
3989 GCCName = "gcc";
3990
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003991 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003992 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003993 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003994}
3995
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003996void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3997 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003998 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003999}
4000
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004001void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4002 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004003 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004004}
4005
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004006void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4007 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00004008 const Driver &D = getToolChain().getDriver();
4009
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004010 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004011 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4012 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004013 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004014 else {
4015 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004016 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004017 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004018
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004019 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004020 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004021}
4022
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004023void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4024 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004025 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004026}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004027
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004028void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4029 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004030 // The types are (hopefully) good enough.
4031}
4032
Tony Linthicum96319392011-12-12 21:14:55 +00004033// Hexagon tools start.
4034void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4035 ArgStringList &CmdArgs) const {
4036
4037}
4038void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4039 const InputInfo &Output,
4040 const InputInfoList &Inputs,
4041 const ArgList &Args,
4042 const char *LinkingOutput) const {
4043
4044 const Driver &D = getToolChain().getDriver();
4045 ArgStringList CmdArgs;
4046
4047 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004048 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004049 CmdArgs.push_back(Args.MakeArgString(MarchString));
4050
4051 RenderExtraToolArgs(JA, CmdArgs);
4052
4053 if (Output.isFilename()) {
4054 CmdArgs.push_back("-o");
4055 CmdArgs.push_back(Output.getFilename());
4056 } else {
4057 assert(Output.isNothing() && "Unexpected output");
4058 CmdArgs.push_back("-fsyntax-only");
4059 }
4060
Matthew Curtis33c95f12012-12-06 17:49:03 +00004061 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4062 if (!SmallDataThreshold.empty())
4063 CmdArgs.push_back(
4064 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004065
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004066 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4067 options::OPT_Xassembler);
4068
Tony Linthicum96319392011-12-12 21:14:55 +00004069 // Only pass -x if gcc will understand it; otherwise hope gcc
4070 // understands the suffix correctly. The main use case this would go
4071 // wrong in is for linker inputs if they happened to have an odd
4072 // suffix; really the only way to get this to happen is a command
4073 // like '-x foobar a.c' which will treat a.c like a linker input.
4074 //
4075 // FIXME: For the linker case specifically, can we safely convert
4076 // inputs into '-Wl,' options?
4077 for (InputInfoList::const_iterator
4078 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4079 const InputInfo &II = *it;
4080
4081 // Don't try to pass LLVM or AST inputs to a generic gcc.
4082 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4083 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4084 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4085 << getToolChain().getTripleString();
4086 else if (II.getType() == types::TY_AST)
4087 D.Diag(clang::diag::err_drv_no_ast_support)
4088 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004089 else if (II.getType() == types::TY_ModuleFile)
4090 D.Diag(diag::err_drv_no_module_support)
4091 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004092
4093 if (II.isFilename())
4094 CmdArgs.push_back(II.getFilename());
4095 else
4096 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4097 II.getInputArg().render(Args, CmdArgs);
4098 }
4099
4100 const char *GCCName = "hexagon-as";
4101 const char *Exec =
4102 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4103 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4104
4105}
4106void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4107 ArgStringList &CmdArgs) const {
4108 // The types are (hopefully) good enough.
4109}
4110
4111void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4112 const InputInfo &Output,
4113 const InputInfoList &Inputs,
4114 const ArgList &Args,
4115 const char *LinkingOutput) const {
4116
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004117 const toolchains::Hexagon_TC& ToolChain =
4118 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4119 const Driver &D = ToolChain.getDriver();
4120
Tony Linthicum96319392011-12-12 21:14:55 +00004121 ArgStringList CmdArgs;
4122
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004123 //----------------------------------------------------------------------------
4124 //
4125 //----------------------------------------------------------------------------
4126 bool hasStaticArg = Args.hasArg(options::OPT_static);
4127 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004128 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004129 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4130 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4131 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4132 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004133
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004134 //----------------------------------------------------------------------------
4135 // Silence warnings for various options
4136 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004137
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004138 Args.ClaimAllArgs(options::OPT_g_Group);
4139 Args.ClaimAllArgs(options::OPT_emit_llvm);
4140 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4141 // handled somewhere else.
4142 Args.ClaimAllArgs(options::OPT_static_libgcc);
4143
4144 //----------------------------------------------------------------------------
4145 //
4146 //----------------------------------------------------------------------------
4147 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4148 e = ToolChain.ExtraOpts.end();
4149 i != e; ++i)
4150 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004151
Matthew Curtis67814152012-12-06 14:16:43 +00004152 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4153 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004154
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004155 if (buildingLib) {
4156 CmdArgs.push_back("-shared");
4157 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4158 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004159 }
4160
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004161 if (hasStaticArg)
4162 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004163
Matthew Curtis33c95f12012-12-06 17:49:03 +00004164 if (buildPIE && !buildingLib)
4165 CmdArgs.push_back("-pie");
4166
4167 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4168 if (!SmallDataThreshold.empty()) {
4169 CmdArgs.push_back(
4170 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4171 }
4172
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004173 //----------------------------------------------------------------------------
4174 //
4175 //----------------------------------------------------------------------------
4176 CmdArgs.push_back("-o");
4177 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004178
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004179 const std::string MarchSuffix = "/" + MarchString;
4180 const std::string G0Suffix = "/G0";
4181 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4182 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4183 + "/";
4184 const std::string StartFilesDir = RootDir
4185 + "hexagon/lib"
4186 + (buildingLib
4187 ? MarchG0Suffix : MarchSuffix);
4188
4189 //----------------------------------------------------------------------------
4190 // moslib
4191 //----------------------------------------------------------------------------
4192 std::vector<std::string> oslibs;
4193 bool hasStandalone= false;
4194
4195 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4196 ie = Args.filtered_end(); it != ie; ++it) {
4197 (*it)->claim();
4198 oslibs.push_back((*it)->getValue());
4199 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004200 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004201 if (oslibs.empty()) {
4202 oslibs.push_back("standalone");
4203 hasStandalone = true;
4204 }
Tony Linthicum96319392011-12-12 21:14:55 +00004205
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004206 //----------------------------------------------------------------------------
4207 // Start Files
4208 //----------------------------------------------------------------------------
4209 if (incStdLib && incStartFiles) {
4210
4211 if (!buildingLib) {
4212 if (hasStandalone) {
4213 CmdArgs.push_back(
4214 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4215 }
4216 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4217 }
4218 std::string initObj = useShared ? "/initS.o" : "/init.o";
4219 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4220 }
4221
4222 //----------------------------------------------------------------------------
4223 // Library Search Paths
4224 //----------------------------------------------------------------------------
4225 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4226 for (ToolChain::path_list::const_iterator
4227 i = LibPaths.begin(),
4228 e = LibPaths.end();
4229 i != e;
4230 ++i)
4231 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4232
4233 //----------------------------------------------------------------------------
4234 //
4235 //----------------------------------------------------------------------------
4236 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4237 Args.AddAllArgs(CmdArgs, options::OPT_e);
4238 Args.AddAllArgs(CmdArgs, options::OPT_s);
4239 Args.AddAllArgs(CmdArgs, options::OPT_t);
4240 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4241
4242 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4243
4244 //----------------------------------------------------------------------------
4245 // Libraries
4246 //----------------------------------------------------------------------------
4247 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004248 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004249 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4250 CmdArgs.push_back("-lm");
4251 }
4252
4253 CmdArgs.push_back("--start-group");
4254
4255 if (!buildingLib) {
4256 for(std::vector<std::string>::iterator i = oslibs.begin(),
4257 e = oslibs.end(); i != e; ++i)
4258 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4259 CmdArgs.push_back("-lc");
4260 }
4261 CmdArgs.push_back("-lgcc");
4262
4263 CmdArgs.push_back("--end-group");
4264 }
4265
4266 //----------------------------------------------------------------------------
4267 // End files
4268 //----------------------------------------------------------------------------
4269 if (incStdLib && incStartFiles) {
4270 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4271 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4272 }
4273
4274 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4275 C.addCommand(
4276 new Command(
4277 JA, *this,
4278 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004279}
4280// Hexagon tools end.
4281
Rafael Espindolacfed8282012-10-31 18:51:07 +00004282llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4283 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4284 // archs which Darwin doesn't use.
4285
4286 // The matching this routine does is fairly pointless, since it is neither the
4287 // complete architecture list, nor a reasonable subset. The problem is that
4288 // historically the driver driver accepts this and also ties its -march=
4289 // handling to the architecture name, so we need to be careful before removing
4290 // support for it.
4291
4292 // This code must be kept in sync with Clang's Darwin specific argument
4293 // translation.
4294
4295 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4296 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4297 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4298 .Case("ppc64", llvm::Triple::ppc64)
4299 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4300 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4301 llvm::Triple::x86)
4302 .Case("x86_64", llvm::Triple::x86_64)
4303 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004304 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4305 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4306 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004307 .Case("r600", llvm::Triple::r600)
4308 .Case("nvptx", llvm::Triple::nvptx)
4309 .Case("nvptx64", llvm::Triple::nvptx64)
4310 .Case("amdil", llvm::Triple::amdil)
4311 .Case("spir", llvm::Triple::spir)
4312 .Default(llvm::Triple::UnknownArch);
4313}
Tony Linthicum96319392011-12-12 21:14:55 +00004314
Bob Wilson66b8a662012-11-23 06:14:39 +00004315const char *Clang::getBaseInputName(const ArgList &Args,
4316 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004317 return Args.MakeArgString(
4318 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004319}
4320
Bob Wilson66b8a662012-11-23 06:14:39 +00004321const char *Clang::getBaseInputStem(const ArgList &Args,
4322 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004323 const char *Str = getBaseInputName(Args, Inputs);
4324
Chris Lattner657ca662011-01-16 08:14:11 +00004325 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004326 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004327
4328 return Str;
4329}
4330
Bob Wilson66b8a662012-11-23 06:14:39 +00004331const char *Clang::getDependencyFileName(const ArgList &Args,
4332 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004333 // FIXME: Think about this more.
4334 std::string Res;
4335
4336 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004337 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004338 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004339 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004340 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004341 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004342 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004343}
4344
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004345void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004346 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004347 const InputInfoList &Inputs,
4348 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004349 const char *LinkingOutput) const {
4350 ArgStringList CmdArgs;
4351
4352 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4353 const InputInfo &Input = Inputs[0];
4354
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004355 // Determine the original source input.
4356 const Action *SourceAction = &JA;
4357 while (SourceAction->getKind() != Action::InputClass) {
4358 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4359 SourceAction = SourceAction->getInputs()[0];
4360 }
4361
4362 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004363 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004364 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004365 if (Args.hasArg(options::OPT_gstabs))
4366 CmdArgs.push_back("--gstabs");
4367 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004368 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004369 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004370
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004371 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004372 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004373
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004374 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004375 if (getToolChain().getArch() == llvm::Triple::x86 ||
4376 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004377 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4378 CmdArgs.push_back("-force_cpusubtype_ALL");
4379
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004380 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004381 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004382 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004383 (!getDarwinToolChain().isTargetIPhoneOS() ||
4384 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4385 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004386 CmdArgs.push_back("-static");
4387
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004388 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4389 options::OPT_Xassembler);
4390
4391 assert(Output.isFilename() && "Unexpected lipo output.");
4392 CmdArgs.push_back("-o");
4393 CmdArgs.push_back(Output.getFilename());
4394
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004395 assert(Input.isFilename() && "Invalid input.");
4396 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004397
4398 // asm_final spec is empty.
4399
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004400 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004401 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004402 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004403}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004404
David Blaikie99ba9e32011-12-20 02:48:34 +00004405void darwin::DarwinTool::anchor() {}
4406
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004407void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4408 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004409 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004410
Daniel Dunbar02633b52009-03-26 16:23:12 +00004411 // Derived from darwin_arch spec.
4412 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004413 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004414
Daniel Dunbareeff4062010-01-22 02:04:58 +00004415 // FIXME: Is this needed anymore?
4416 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004417 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004418}
4419
Bill Wendling6acf8b42012-10-02 18:02:50 +00004420bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4421 // We only need to generate a temp path for LTO if we aren't compiling object
4422 // files. When compiling source files, we run 'dsymutil' after linking. We
4423 // don't run 'dsymutil' when compiling object files.
4424 for (InputInfoList::const_iterator
4425 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4426 if (it->getType() != types::TY_Object)
4427 return true;
4428
4429 return false;
4430}
4431
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004432void darwin::Link::AddLinkArgs(Compilation &C,
4433 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004434 ArgStringList &CmdArgs,
4435 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004436 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004437 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004438
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004439 unsigned Version[3] = { 0, 0, 0 };
4440 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4441 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004442 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004443 Version[1], Version[2], HadExtra) ||
4444 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004445 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004446 << A->getAsString(Args);
4447 }
4448
4449 // Newer linkers support -demangle, pass it if supported and not disabled by
4450 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004451 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004452 // Don't pass -demangle to ld_classic.
4453 //
4454 // FIXME: This is a temporary workaround, ld should be handling this.
4455 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4456 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004457 if (getToolChain().getArch() == llvm::Triple::x86) {
4458 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4459 options::OPT_Wl_COMMA),
4460 ie = Args.filtered_end(); it != ie; ++it) {
4461 const Arg *A = *it;
4462 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004463 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004464 UsesLdClassic = true;
4465 }
4466 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004467 if (!UsesLdClassic)
4468 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004469 }
4470
Bob Wilsonbd77c592013-08-02 22:25:34 +00004471 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4472 CmdArgs.push_back("-export_dynamic");
4473
Bill Wendlingc35f9082012-11-16 23:03:00 +00004474 // If we are using LTO, then automatically create a temporary file path for
4475 // the linker to use, so that it's lifetime will extend past a possible
4476 // dsymutil step.
4477 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4478 const char *TmpPath = C.getArgs().MakeArgString(
4479 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4480 C.addTempFile(TmpPath);
4481 CmdArgs.push_back("-object_path_lto");
4482 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004483 }
4484
Daniel Dunbar02633b52009-03-26 16:23:12 +00004485 // Derived from the "link" spec.
4486 Args.AddAllArgs(CmdArgs, options::OPT_static);
4487 if (!Args.hasArg(options::OPT_static))
4488 CmdArgs.push_back("-dynamic");
4489 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4490 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4491 // here. How do we wish to handle such things?
4492 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004493
Daniel Dunbar02633b52009-03-26 16:23:12 +00004494 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004495 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004496 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004497 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004498
4499 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4500 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4501 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4502
4503 Arg *A;
4504 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4505 (A = Args.getLastArg(options::OPT_current__version)) ||
4506 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004507 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004508 << A->getAsString(Args) << "-dynamiclib";
4509
4510 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4511 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4512 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4513 } else {
4514 CmdArgs.push_back("-dylib");
4515
4516 Arg *A;
4517 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4518 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4519 (A = Args.getLastArg(options::OPT_client__name)) ||
4520 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4521 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4522 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004523 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004524 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004525
Daniel Dunbar02633b52009-03-26 16:23:12 +00004526 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4527 "-dylib_compatibility_version");
4528 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4529 "-dylib_current_version");
4530
Daniel Dunbara6d38492010-01-22 02:04:52 +00004531 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004532
4533 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4534 "-dylib_install_name");
4535 }
4536
4537 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4538 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4539 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004540 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004541 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004542 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4543 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4544 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4545 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4546 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4547 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004548 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004549 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4550 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4551 Args.AddAllArgs(CmdArgs, options::OPT_init);
4552
Daniel Dunbarce911f52011-04-28 21:23:41 +00004553 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004554 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004555
4556 // If we had an explicit -mios-simulator-version-min argument, honor that,
4557 // otherwise use the traditional deployment targets. We can't just check the
4558 // is-sim attribute because existing code follows this path, and the linker
4559 // may not handle the argument.
4560 //
4561 // FIXME: We may be able to remove this, once we can verify no one depends on
4562 // it.
4563 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4564 CmdArgs.push_back("-ios_simulator_version_min");
4565 else if (DarwinTC.isTargetIPhoneOS())
4566 CmdArgs.push_back("-iphoneos_version_min");
4567 else
4568 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004569 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004570
Daniel Dunbar02633b52009-03-26 16:23:12 +00004571 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4572 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4573 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4574 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4575 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004576
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004577 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4578 options::OPT_fno_pie,
4579 options::OPT_fno_PIE)) {
4580 if (A->getOption().matches(options::OPT_fpie) ||
4581 A->getOption().matches(options::OPT_fPIE))
4582 CmdArgs.push_back("-pie");
4583 else
4584 CmdArgs.push_back("-no_pie");
4585 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004586
4587 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4588 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4589 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4590 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4591 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4592 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4593 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4594 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4595 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4596 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4597 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4598 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4599 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4600 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4601 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4602 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004603
Daniel Dunbarcc957192011-05-02 21:03:47 +00004604 // Give --sysroot= preference, over the Apple specific behavior to also use
4605 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004606 StringRef sysroot = C.getSysRoot();
4607 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004608 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004609 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004610 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4611 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004612 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004613 }
4614
Daniel Dunbar02633b52009-03-26 16:23:12 +00004615 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4616 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4617 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4618 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4619 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004620 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004621 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4622 Args.AddAllArgs(CmdArgs, options::OPT_y);
4623 Args.AddLastArg(CmdArgs, options::OPT_w);
4624 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4625 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4626 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4627 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4628 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4629 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4630 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4631 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4632 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4633 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4634 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4635 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4636}
4637
4638void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004639 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004640 const InputInfoList &Inputs,
4641 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004642 const char *LinkingOutput) const {
4643 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004644
Daniel Dunbar02633b52009-03-26 16:23:12 +00004645 // The logic here is derived from gcc's behavior; most of which
4646 // comes from specs (starting with link_command). Consult gcc for
4647 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004648 ArgStringList CmdArgs;
4649
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004650 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4651 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4652 options::OPT_ccc_arcmt_migrate)) {
4653 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4654 (*I)->claim();
4655 const char *Exec =
4656 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4657 CmdArgs.push_back(Output.getFilename());
4658 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4659 return;
4660 }
4661
Daniel Dunbar02633b52009-03-26 16:23:12 +00004662 // I'm not sure why this particular decomposition exists in gcc, but
4663 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004664 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004665
Daniel Dunbar02633b52009-03-26 16:23:12 +00004666 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4667 Args.AddAllArgs(CmdArgs, options::OPT_s);
4668 Args.AddAllArgs(CmdArgs, options::OPT_t);
4669 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4670 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004671 Args.AddLastArg(CmdArgs, options::OPT_e);
4672 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4673 Args.AddAllArgs(CmdArgs, options::OPT_r);
4674
Daniel Dunbar270073c2010-10-18 22:08:36 +00004675 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4676 // members of static archive libraries which implement Objective-C classes or
4677 // categories.
4678 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4679 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004680
Daniel Dunbar02633b52009-03-26 16:23:12 +00004681 CmdArgs.push_back("-o");
4682 CmdArgs.push_back(Output.getFilename());
4683
Chad Rosier18937312012-05-16 23:45:12 +00004684 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004685 !Args.hasArg(options::OPT_nostartfiles)) {
4686 // Derived from startfile spec.
4687 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004688 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004689 if (getDarwinToolChain().isTargetIOSSimulator()) {
4690 // The simulator doesn't have a versioned crt1 file.
4691 CmdArgs.push_back("-ldylib1.o");
4692 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004693 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4694 CmdArgs.push_back("-ldylib1.o");
4695 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004696 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004697 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004698 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004699 CmdArgs.push_back("-ldylib1.10.5.o");
4700 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004701 } else {
4702 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004703 if (!Args.hasArg(options::OPT_static)) {
4704 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004705 if (getDarwinToolChain().isTargetIOSSimulator()) {
4706 // The simulator doesn't have a versioned crt1 file.
4707 CmdArgs.push_back("-lbundle1.o");
4708 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004709 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4710 CmdArgs.push_back("-lbundle1.o");
4711 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004712 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004713 CmdArgs.push_back("-lbundle1.o");
4714 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004715 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004716 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004717 if (Args.hasArg(options::OPT_pg) &&
4718 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004719 if (Args.hasArg(options::OPT_static) ||
4720 Args.hasArg(options::OPT_object) ||
4721 Args.hasArg(options::OPT_preload)) {
4722 CmdArgs.push_back("-lgcrt0.o");
4723 } else {
4724 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004725
Daniel Dunbar02633b52009-03-26 16:23:12 +00004726 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004727 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004728 // By default on OS X 10.8 and later, we don't link with a crt1.o
4729 // file and the linker knows to use _main as the entry point. But,
4730 // when compiling with -pg, we need to link with the gcrt1.o file,
4731 // so pass the -no_new_main option to tell the linker to use the
4732 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004733 if (getDarwinToolChain().isTargetMacOS() &&
4734 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4735 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004736 } else {
4737 if (Args.hasArg(options::OPT_static) ||
4738 Args.hasArg(options::OPT_object) ||
4739 Args.hasArg(options::OPT_preload)) {
4740 CmdArgs.push_back("-lcrt0.o");
4741 } else {
4742 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004743 if (getDarwinToolChain().isTargetIOSSimulator()) {
4744 // The simulator doesn't have a versioned crt1 file.
4745 CmdArgs.push_back("-lcrt1.o");
4746 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004747 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4748 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004749 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004750 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004751 } else {
4752 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4753 CmdArgs.push_back("-lcrt1.o");
4754 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4755 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004756 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004757 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004758
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004759 // darwin_crt2 spec is empty.
4760 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004761 }
4762 }
4763 }
4764 }
4765
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004766 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4767 Args.hasArg(options::OPT_shared_libgcc) &&
4768 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004769 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004770 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004771 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004772 }
4773 }
4774
4775 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004776
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00004777 const SanitizerArgs &Sanitize =
4778 getToolChain().getDriver().getOrParseSanitizerArgs(Args);
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004779 // If we're building a dynamic lib with -fsanitize=address,
4780 // unresolved symbols may appear. Mark all
Alexey Samsonov75fcb192012-11-16 12:53:14 +00004781 // of them as dynamic_lookup. Linking executables is handled in
4782 // lib/Driver/ToolChains.cpp.
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004783 if (Sanitize.needsAsanRt()) {
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004784 if (Args.hasArg(options::OPT_dynamiclib) ||
4785 Args.hasArg(options::OPT_bundle)) {
4786 CmdArgs.push_back("-undefined");
4787 CmdArgs.push_back("dynamic_lookup");
4788 }
4789 }
4790
Daniel Dunbar02633b52009-03-26 16:23:12 +00004791 if (Args.hasArg(options::OPT_fopenmp))
4792 // This is more complicated in gcc...
4793 CmdArgs.push_back("-lgomp");
4794
Douglas Gregor04e326b2012-05-15 21:00:27 +00004795 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4796
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004797 if (isObjCRuntimeLinked(Args) &&
4798 !Args.hasArg(options::OPT_nostdlib) &&
4799 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004800 // Avoid linking compatibility stubs on i386 mac.
4801 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004802 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004803 // If we don't have ARC or subscripting runtime support, link in the
4804 // runtime stubs. We have to do this *before* adding any of the normal
4805 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004806 ObjCRuntime runtime =
4807 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004808 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004809 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004810 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004811 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004812 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004813 CmdArgs.push_back("-framework");
4814 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004815 // Link libobj.
4816 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004817 }
John McCallf85e1932011-06-15 23:02:42 +00004818
Daniel Dunbar02633b52009-03-26 16:23:12 +00004819 if (LinkingOutput) {
4820 CmdArgs.push_back("-arch_multiple");
4821 CmdArgs.push_back("-final_output");
4822 CmdArgs.push_back(LinkingOutput);
4823 }
4824
Daniel Dunbar02633b52009-03-26 16:23:12 +00004825 if (Args.hasArg(options::OPT_fnested_functions))
4826 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004827
Daniel Dunbar02633b52009-03-26 16:23:12 +00004828 if (!Args.hasArg(options::OPT_nostdlib) &&
4829 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004830 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004831 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004832
Daniel Dunbar02633b52009-03-26 16:23:12 +00004833 // link_ssp spec is empty.
4834
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004835 // Let the tool chain choose which runtime library to link.
4836 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004837 }
4838
Chad Rosier18937312012-05-16 23:45:12 +00004839 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004840 !Args.hasArg(options::OPT_nostartfiles)) {
4841 // endfile_spec is empty.
4842 }
4843
4844 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4845 Args.AddAllArgs(CmdArgs, options::OPT_F);
4846
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004847 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004848 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004849 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004850}
4851
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004852void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004853 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004854 const InputInfoList &Inputs,
4855 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004856 const char *LinkingOutput) const {
4857 ArgStringList CmdArgs;
4858
4859 CmdArgs.push_back("-create");
4860 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004861
4862 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004863 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004864
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004865 for (InputInfoList::const_iterator
4866 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4867 const InputInfo &II = *it;
4868 assert(II.isFilename() && "Unexpected lipo input.");
4869 CmdArgs.push_back(II.getFilename());
4870 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004871 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004872 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004873 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004874}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004875
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004876void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004877 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004878 const InputInfoList &Inputs,
4879 const ArgList &Args,
4880 const char *LinkingOutput) const {
4881 ArgStringList CmdArgs;
4882
Daniel Dunbar03e92302011-05-09 17:23:16 +00004883 CmdArgs.push_back("-o");
4884 CmdArgs.push_back(Output.getFilename());
4885
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004886 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4887 const InputInfo &Input = Inputs[0];
4888 assert(Input.isFilename() && "Unexpected dsymutil input.");
4889 CmdArgs.push_back(Input.getFilename());
4890
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004891 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004892 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004893 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004894}
4895
Eric Christopherf8571862011-08-23 17:56:55 +00004896void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00004897 const InputInfo &Output,
4898 const InputInfoList &Inputs,
4899 const ArgList &Args,
4900 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00004901 ArgStringList CmdArgs;
4902 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004903 CmdArgs.push_back("--debug-info");
4904 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004905 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004906
4907 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4908 const InputInfo &Input = Inputs[0];
4909 assert(Input.isFilename() && "Unexpected verify input");
4910
4911 // Grabbing the output of the earlier dsymutil run.
4912 CmdArgs.push_back(Input.getFilename());
4913
4914 const char *Exec =
4915 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4916 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4917}
4918
David Chisnall31c46902012-02-15 13:39:01 +00004919void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4920 const InputInfo &Output,
4921 const InputInfoList &Inputs,
4922 const ArgList &Args,
4923 const char *LinkingOutput) const {
4924 ArgStringList CmdArgs;
4925
4926 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4927 options::OPT_Xassembler);
4928
4929 CmdArgs.push_back("-o");
4930 CmdArgs.push_back(Output.getFilename());
4931
4932 for (InputInfoList::const_iterator
4933 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4934 const InputInfo &II = *it;
4935 CmdArgs.push_back(II.getFilename());
4936 }
4937
4938 const char *Exec =
4939 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4940 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4941}
4942
4943
4944void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4945 const InputInfo &Output,
4946 const InputInfoList &Inputs,
4947 const ArgList &Args,
4948 const char *LinkingOutput) const {
4949 // FIXME: Find a real GCC, don't hard-code versions here
4950 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4951 const llvm::Triple &T = getToolChain().getTriple();
4952 std::string LibPath = "/usr/lib/";
4953 llvm::Triple::ArchType Arch = T.getArch();
4954 switch (Arch) {
4955 case llvm::Triple::x86:
4956 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4957 T.getOSName()).str() + "/4.5.2/";
4958 break;
4959 case llvm::Triple::x86_64:
4960 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4961 T.getOSName()).str();
4962 GCCLibPath += "/4.5.2/amd64/";
4963 LibPath += "amd64/";
4964 break;
4965 default:
4966 assert(0 && "Unsupported architecture");
4967 }
4968
4969 ArgStringList CmdArgs;
4970
David Chisnall41d476d2012-02-29 15:06:12 +00004971 // Demangle C++ names in errors
4972 CmdArgs.push_back("-C");
4973
David Chisnall31c46902012-02-15 13:39:01 +00004974 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4975 (!Args.hasArg(options::OPT_shared))) {
4976 CmdArgs.push_back("-e");
4977 CmdArgs.push_back("_start");
4978 }
4979
4980 if (Args.hasArg(options::OPT_static)) {
4981 CmdArgs.push_back("-Bstatic");
4982 CmdArgs.push_back("-dn");
4983 } else {
4984 CmdArgs.push_back("-Bdynamic");
4985 if (Args.hasArg(options::OPT_shared)) {
4986 CmdArgs.push_back("-shared");
4987 } else {
4988 CmdArgs.push_back("--dynamic-linker");
4989 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4990 }
4991 }
4992
4993 if (Output.isFilename()) {
4994 CmdArgs.push_back("-o");
4995 CmdArgs.push_back(Output.getFilename());
4996 } else {
4997 assert(Output.isNothing() && "Invalid output.");
4998 }
4999
5000 if (!Args.hasArg(options::OPT_nostdlib) &&
5001 !Args.hasArg(options::OPT_nostartfiles)) {
5002 if (!Args.hasArg(options::OPT_shared)) {
5003 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5004 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005005 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005006 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5007 } else {
5008 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005009 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5010 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005011 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00005012 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00005013 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005014 }
5015
5016 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5017
5018 Args.AddAllArgs(CmdArgs, options::OPT_L);
5019 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5020 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005021 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005022
5023 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5024
5025 if (!Args.hasArg(options::OPT_nostdlib) &&
5026 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005027 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00005028 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005029 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005030 if (!Args.hasArg(options::OPT_shared)) {
5031 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005032 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005033 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005034 }
David Chisnall31c46902012-02-15 13:39:01 +00005035 }
5036
5037 if (!Args.hasArg(options::OPT_nostdlib) &&
5038 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005039 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005040 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005041 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005042
5043 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5044
5045 const char *Exec =
5046 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5047 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5048}
5049
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005050void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005051 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005052 const InputInfoList &Inputs,
5053 const ArgList &Args,
5054 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005055 ArgStringList CmdArgs;
5056
5057 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5058 options::OPT_Xassembler);
5059
5060 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005061 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005062
5063 for (InputInfoList::const_iterator
5064 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5065 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005066 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005067 }
5068
5069 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005070 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005071 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005072}
5073
5074void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005075 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005076 const InputInfoList &Inputs,
5077 const ArgList &Args,
5078 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005079 ArgStringList CmdArgs;
5080
5081 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005082 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005083 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005084 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005085 }
5086
5087 if (Args.hasArg(options::OPT_static)) {
5088 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005089 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005090 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005091// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005092 CmdArgs.push_back("-Bdynamic");
5093 if (Args.hasArg(options::OPT_shared)) {
5094 CmdArgs.push_back("-shared");
5095 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005096 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005097 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5098 }
5099 }
5100
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005101 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005102 CmdArgs.push_back("-o");
5103 CmdArgs.push_back(Output.getFilename());
5104 } else {
5105 assert(Output.isNothing() && "Invalid output.");
5106 }
5107
5108 if (!Args.hasArg(options::OPT_nostdlib) &&
5109 !Args.hasArg(options::OPT_nostartfiles)) {
5110 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005111 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005112 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005113 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005114 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005115 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005116 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005117 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005118 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005119 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005120 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005121 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005122 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005123 }
5124
Daniel Dunbar294691e2009-11-04 06:24:38 +00005125 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5126 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005127 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005128
5129 Args.AddAllArgs(CmdArgs, options::OPT_L);
5130 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5131 Args.AddAllArgs(CmdArgs, options::OPT_e);
5132
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005133 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005134
5135 if (!Args.hasArg(options::OPT_nostdlib) &&
5136 !Args.hasArg(options::OPT_nodefaultlibs)) {
5137 // FIXME: For some reason GCC passes -lgcc before adding
5138 // the default system libraries. Just mimic this for now.
5139 CmdArgs.push_back("-lgcc");
5140
5141 if (Args.hasArg(options::OPT_pthread))
5142 CmdArgs.push_back("-pthread");
5143 if (!Args.hasArg(options::OPT_shared))
5144 CmdArgs.push_back("-lc");
5145 CmdArgs.push_back("-lgcc");
5146 }
5147
5148 if (!Args.hasArg(options::OPT_nostdlib) &&
5149 !Args.hasArg(options::OPT_nostartfiles)) {
5150 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005151 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005152 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005153 }
5154
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005155 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005156
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005157 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005158 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005159 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005160}
5161
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005162void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005163 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005164 const InputInfoList &Inputs,
5165 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005166 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005167 ArgStringList CmdArgs;
5168
5169 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5170 options::OPT_Xassembler);
5171
5172 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005173 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005174
5175 for (InputInfoList::const_iterator
5176 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5177 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005178 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005179 }
5180
5181 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005182 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005183 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005184}
5185
5186void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005187 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005188 const InputInfoList &Inputs,
5189 const ArgList &Args,
5190 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005191 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005192 ArgStringList CmdArgs;
5193
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005194 // Silence warning for "clang -g foo.o -o foo"
5195 Args.ClaimAllArgs(options::OPT_g_Group);
5196 // and "clang -emit-llvm foo.o -o foo"
5197 Args.ClaimAllArgs(options::OPT_emit_llvm);
5198 // and for "clang -w foo.o -o foo". Other warning options are already
5199 // handled somewhere else.
5200 Args.ClaimAllArgs(options::OPT_w);
5201
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005202 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005203 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005204 CmdArgs.push_back("-e");
5205 CmdArgs.push_back("__start");
5206 }
5207
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005208 if (Args.hasArg(options::OPT_static)) {
5209 CmdArgs.push_back("-Bstatic");
5210 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005211 if (Args.hasArg(options::OPT_rdynamic))
5212 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005213 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005214 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005215 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005216 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005217 } else {
5218 CmdArgs.push_back("-dynamic-linker");
5219 CmdArgs.push_back("/usr/libexec/ld.so");
5220 }
5221 }
5222
Rafael Espindola9adba392013-06-05 04:28:55 +00005223 if (Args.hasArg(options::OPT_nopie))
5224 CmdArgs.push_back("-nopie");
5225
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005226 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005227 CmdArgs.push_back("-o");
5228 CmdArgs.push_back(Output.getFilename());
5229 } else {
5230 assert(Output.isNothing() && "Invalid output.");
5231 }
5232
5233 if (!Args.hasArg(options::OPT_nostdlib) &&
5234 !Args.hasArg(options::OPT_nostartfiles)) {
5235 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005236 if (Args.hasArg(options::OPT_pg))
5237 CmdArgs.push_back(Args.MakeArgString(
5238 getToolChain().GetFilePath("gcrt0.o")));
5239 else
5240 CmdArgs.push_back(Args.MakeArgString(
5241 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005242 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005243 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005244 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005245 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005246 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005247 }
5248 }
5249
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005250 std::string Triple = getToolChain().getTripleString();
5251 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005252 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005253 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005254 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005255
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005256 Args.AddAllArgs(CmdArgs, options::OPT_L);
5257 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5258 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005259 Args.AddAllArgs(CmdArgs, options::OPT_s);
5260 Args.AddAllArgs(CmdArgs, options::OPT_t);
5261 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5262 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005263
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005264 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005265
5266 if (!Args.hasArg(options::OPT_nostdlib) &&
5267 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005268 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005269 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005270 if (Args.hasArg(options::OPT_pg))
5271 CmdArgs.push_back("-lm_p");
5272 else
5273 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005274 }
5275
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005276 // FIXME: For some reason GCC passes -lgcc before adding
5277 // the default system libraries. Just mimic this for now.
5278 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005279
Eric Christopherdc6cc872012-09-13 06:32:34 +00005280 if (Args.hasArg(options::OPT_pthread)) {
5281 if (!Args.hasArg(options::OPT_shared) &&
5282 Args.hasArg(options::OPT_pg))
5283 CmdArgs.push_back("-lpthread_p");
5284 else
5285 CmdArgs.push_back("-lpthread");
5286 }
5287
Chandler Carruth657849c2011-12-17 22:32:42 +00005288 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005289 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005290 CmdArgs.push_back("-lc_p");
5291 else
5292 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005293 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005294
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005295 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005296 }
5297
5298 if (!Args.hasArg(options::OPT_nostdlib) &&
5299 !Args.hasArg(options::OPT_nostartfiles)) {
5300 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005301 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005302 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005303 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005304 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005305 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005306 }
5307
5308 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005309 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005310 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005311}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005312
Eli Friedman42f74f22012-08-08 23:57:20 +00005313void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5314 const InputInfo &Output,
5315 const InputInfoList &Inputs,
5316 const ArgList &Args,
5317 const char *LinkingOutput) const {
5318 ArgStringList CmdArgs;
5319
5320 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5321 options::OPT_Xassembler);
5322
5323 CmdArgs.push_back("-o");
5324 CmdArgs.push_back(Output.getFilename());
5325
5326 for (InputInfoList::const_iterator
5327 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5328 const InputInfo &II = *it;
5329 CmdArgs.push_back(II.getFilename());
5330 }
5331
5332 const char *Exec =
5333 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5334 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5335}
5336
5337void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5338 const InputInfo &Output,
5339 const InputInfoList &Inputs,
5340 const ArgList &Args,
5341 const char *LinkingOutput) const {
5342 const Driver &D = getToolChain().getDriver();
5343 ArgStringList CmdArgs;
5344
5345 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5346 (!Args.hasArg(options::OPT_shared))) {
5347 CmdArgs.push_back("-e");
5348 CmdArgs.push_back("__start");
5349 }
5350
5351 if (Args.hasArg(options::OPT_static)) {
5352 CmdArgs.push_back("-Bstatic");
5353 } else {
5354 if (Args.hasArg(options::OPT_rdynamic))
5355 CmdArgs.push_back("-export-dynamic");
5356 CmdArgs.push_back("--eh-frame-hdr");
5357 CmdArgs.push_back("-Bdynamic");
5358 if (Args.hasArg(options::OPT_shared)) {
5359 CmdArgs.push_back("-shared");
5360 } else {
5361 CmdArgs.push_back("-dynamic-linker");
5362 CmdArgs.push_back("/usr/libexec/ld.so");
5363 }
5364 }
5365
5366 if (Output.isFilename()) {
5367 CmdArgs.push_back("-o");
5368 CmdArgs.push_back(Output.getFilename());
5369 } else {
5370 assert(Output.isNothing() && "Invalid output.");
5371 }
5372
5373 if (!Args.hasArg(options::OPT_nostdlib) &&
5374 !Args.hasArg(options::OPT_nostartfiles)) {
5375 if (!Args.hasArg(options::OPT_shared)) {
5376 if (Args.hasArg(options::OPT_pg))
5377 CmdArgs.push_back(Args.MakeArgString(
5378 getToolChain().GetFilePath("gcrt0.o")));
5379 else
5380 CmdArgs.push_back(Args.MakeArgString(
5381 getToolChain().GetFilePath("crt0.o")));
5382 CmdArgs.push_back(Args.MakeArgString(
5383 getToolChain().GetFilePath("crtbegin.o")));
5384 } else {
5385 CmdArgs.push_back(Args.MakeArgString(
5386 getToolChain().GetFilePath("crtbeginS.o")));
5387 }
5388 }
5389
5390 Args.AddAllArgs(CmdArgs, options::OPT_L);
5391 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5392 Args.AddAllArgs(CmdArgs, options::OPT_e);
5393
5394 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5395
5396 if (!Args.hasArg(options::OPT_nostdlib) &&
5397 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005398 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00005399 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5400 if (Args.hasArg(options::OPT_pg))
5401 CmdArgs.push_back("-lm_p");
5402 else
5403 CmdArgs.push_back("-lm");
5404 }
5405
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005406 if (Args.hasArg(options::OPT_pthread)) {
5407 if (!Args.hasArg(options::OPT_shared) &&
5408 Args.hasArg(options::OPT_pg))
5409 CmdArgs.push_back("-lpthread_p");
5410 else
5411 CmdArgs.push_back("-lpthread");
5412 }
5413
Eli Friedman42f74f22012-08-08 23:57:20 +00005414 if (!Args.hasArg(options::OPT_shared)) {
5415 if (Args.hasArg(options::OPT_pg))
5416 CmdArgs.push_back("-lc_p");
5417 else
5418 CmdArgs.push_back("-lc");
5419 }
5420
5421 std::string myarch = "-lclang_rt.";
5422 const llvm::Triple &T = getToolChain().getTriple();
5423 llvm::Triple::ArchType Arch = T.getArch();
5424 switch (Arch) {
5425 case llvm::Triple::arm:
5426 myarch += ("arm");
5427 break;
5428 case llvm::Triple::x86:
5429 myarch += ("i386");
5430 break;
5431 case llvm::Triple::x86_64:
5432 myarch += ("amd64");
5433 break;
5434 default:
5435 assert(0 && "Unsupported architecture");
5436 }
5437 CmdArgs.push_back(Args.MakeArgString(myarch));
5438 }
5439
5440 if (!Args.hasArg(options::OPT_nostdlib) &&
5441 !Args.hasArg(options::OPT_nostartfiles)) {
5442 if (!Args.hasArg(options::OPT_shared))
5443 CmdArgs.push_back(Args.MakeArgString(
5444 getToolChain().GetFilePath("crtend.o")));
5445 else
5446 CmdArgs.push_back(Args.MakeArgString(
5447 getToolChain().GetFilePath("crtendS.o")));
5448 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005449
5450 const char *Exec =
5451 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5452 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005453}
5454
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005455void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005456 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005457 const InputInfoList &Inputs,
5458 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005459 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005460 ArgStringList CmdArgs;
5461
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005462 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5463 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005464 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005465 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005466 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005467 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005468 else if (getToolChain().getArch() == llvm::Triple::mips ||
5469 getToolChain().getArch() == llvm::Triple::mipsel ||
5470 getToolChain().getArch() == llvm::Triple::mips64 ||
5471 getToolChain().getArch() == llvm::Triple::mips64el) {
5472 StringRef CPUName;
5473 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00005474 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005475
Eric Christopherc55da4b2012-09-05 21:32:44 +00005476 CmdArgs.push_back("-march");
5477 CmdArgs.push_back(CPUName.data());
5478
Eric Christopherc55da4b2012-09-05 21:32:44 +00005479 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005480 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005481
5482 if (getToolChain().getArch() == llvm::Triple::mips ||
5483 getToolChain().getArch() == llvm::Triple::mips64)
5484 CmdArgs.push_back("-EB");
5485 else
5486 CmdArgs.push_back("-EL");
5487
5488 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5489 options::OPT_fpic, options::OPT_fno_pic,
5490 options::OPT_fPIE, options::OPT_fno_PIE,
5491 options::OPT_fpie, options::OPT_fno_pie);
5492 if (LastPICArg &&
5493 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5494 LastPICArg->getOption().matches(options::OPT_fpic) ||
5495 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5496 LastPICArg->getOption().matches(options::OPT_fpie))) {
5497 CmdArgs.push_back("-KPIC");
5498 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005499 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5500 getToolChain().getArch() == llvm::Triple::thumb) {
5501 CmdArgs.push_back("-mfpu=softvfp");
5502 switch(getToolChain().getTriple().getEnvironment()) {
5503 case llvm::Triple::GNUEABI:
5504 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005505 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005506 break;
5507
5508 default:
5509 CmdArgs.push_back("-matpcs");
5510 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005511 }
Eric Christophered734732010-03-02 02:41:08 +00005512
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005513 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5514 options::OPT_Xassembler);
5515
5516 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005517 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005518
5519 for (InputInfoList::const_iterator
5520 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5521 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005522 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005523 }
5524
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005525 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005526 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005527 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005528}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005529
5530void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005531 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005532 const InputInfoList &Inputs,
5533 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005534 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005535 const toolchains::FreeBSD& ToolChain =
5536 static_cast<const toolchains::FreeBSD&>(getToolChain());
5537 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005538 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005539
5540 // Silence warning for "clang -g foo.o -o foo"
5541 Args.ClaimAllArgs(options::OPT_g_Group);
5542 // and "clang -emit-llvm foo.o -o foo"
5543 Args.ClaimAllArgs(options::OPT_emit_llvm);
5544 // and for "clang -w foo.o -o foo". Other warning options are already
5545 // handled somewhere else.
5546 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005547
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005548 if (!D.SysRoot.empty())
5549 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5550
Roman Divacky94380162012-08-28 15:09:03 +00005551 if (Args.hasArg(options::OPT_pie))
5552 CmdArgs.push_back("-pie");
5553
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005554 if (Args.hasArg(options::OPT_static)) {
5555 CmdArgs.push_back("-Bstatic");
5556 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005557 if (Args.hasArg(options::OPT_rdynamic))
5558 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005559 CmdArgs.push_back("--eh-frame-hdr");
5560 if (Args.hasArg(options::OPT_shared)) {
5561 CmdArgs.push_back("-Bshareable");
5562 } else {
5563 CmdArgs.push_back("-dynamic-linker");
5564 CmdArgs.push_back("/libexec/ld-elf.so.1");
5565 }
Roman Divacky94380162012-08-28 15:09:03 +00005566 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5567 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005568 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5569 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5570 CmdArgs.push_back("--hash-style=both");
5571 }
5572 }
5573 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005574 }
5575
5576 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5577 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005578 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005579 CmdArgs.push_back("-m");
5580 CmdArgs.push_back("elf_i386_fbsd");
5581 }
5582
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005583 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005584 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005585 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005586 }
5587
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005588 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005589 CmdArgs.push_back("-o");
5590 CmdArgs.push_back(Output.getFilename());
5591 } else {
5592 assert(Output.isNothing() && "Invalid output.");
5593 }
5594
5595 if (!Args.hasArg(options::OPT_nostdlib) &&
5596 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005597 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005598 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005599 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005600 crt1 = "gcrt1.o";
5601 else if (Args.hasArg(options::OPT_pie))
5602 crt1 = "Scrt1.o";
5603 else
5604 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005605 }
Roman Divacky94380162012-08-28 15:09:03 +00005606 if (crt1)
5607 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5608
5609 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5610
5611 const char *crtbegin = NULL;
5612 if (Args.hasArg(options::OPT_static))
5613 crtbegin = "crtbeginT.o";
5614 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5615 crtbegin = "crtbeginS.o";
5616 else
5617 crtbegin = "crtbegin.o";
5618
5619 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005620 }
5621
5622 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005623 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005624 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5625 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005626 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005627 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5628 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005629 Args.AddAllArgs(CmdArgs, options::OPT_s);
5630 Args.AddAllArgs(CmdArgs, options::OPT_t);
5631 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5632 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005633
Roman Divacky94380162012-08-28 15:09:03 +00005634 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005635
5636 if (!Args.hasArg(options::OPT_nostdlib) &&
5637 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005638 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00005639 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005640 if (Args.hasArg(options::OPT_pg))
5641 CmdArgs.push_back("-lm_p");
5642 else
5643 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005644 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005645 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5646 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005647 if (Args.hasArg(options::OPT_pg))
5648 CmdArgs.push_back("-lgcc_p");
5649 else
5650 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005651 if (Args.hasArg(options::OPT_static)) {
5652 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005653 } else if (Args.hasArg(options::OPT_pg)) {
5654 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005655 } else {
5656 CmdArgs.push_back("--as-needed");
5657 CmdArgs.push_back("-lgcc_s");
5658 CmdArgs.push_back("--no-as-needed");
5659 }
5660
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005661 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005662 if (Args.hasArg(options::OPT_pg))
5663 CmdArgs.push_back("-lpthread_p");
5664 else
5665 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005666 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005667
Roman Divackyc16bb762011-02-10 16:59:40 +00005668 if (Args.hasArg(options::OPT_pg)) {
5669 if (Args.hasArg(options::OPT_shared))
5670 CmdArgs.push_back("-lc");
5671 else
5672 CmdArgs.push_back("-lc_p");
5673 CmdArgs.push_back("-lgcc_p");
5674 } else {
5675 CmdArgs.push_back("-lc");
5676 CmdArgs.push_back("-lgcc");
5677 }
5678
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005679 if (Args.hasArg(options::OPT_static)) {
5680 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005681 } else if (Args.hasArg(options::OPT_pg)) {
5682 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005683 } else {
5684 CmdArgs.push_back("--as-needed");
5685 CmdArgs.push_back("-lgcc_s");
5686 CmdArgs.push_back("--no-as-needed");
5687 }
5688 }
5689
5690 if (!Args.hasArg(options::OPT_nostdlib) &&
5691 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005692 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005693 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005694 else
5695 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005696 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005697 }
5698
Roman Divacky94380162012-08-28 15:09:03 +00005699 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005700
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005701 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005702 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005703 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005704}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005705
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005706void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5707 const InputInfo &Output,
5708 const InputInfoList &Inputs,
5709 const ArgList &Args,
5710 const char *LinkingOutput) const {
5711 ArgStringList CmdArgs;
5712
5713 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5714 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005715 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005716 CmdArgs.push_back("--32");
5717
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005718 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005719 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005720 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005721 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005722 CmdArgs.push_back("-EL");
5723
5724 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5725 options::OPT_Xassembler);
5726
5727 CmdArgs.push_back("-o");
5728 CmdArgs.push_back(Output.getFilename());
5729
5730 for (InputInfoList::const_iterator
5731 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5732 const InputInfo &II = *it;
5733 CmdArgs.push_back(II.getFilename());
5734 }
5735
David Chisnall5adcec12011-09-27 22:03:18 +00005736 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005737 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5738}
5739
5740void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5741 const InputInfo &Output,
5742 const InputInfoList &Inputs,
5743 const ArgList &Args,
5744 const char *LinkingOutput) const {
5745 const Driver &D = getToolChain().getDriver();
5746 ArgStringList CmdArgs;
5747
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005748 if (!D.SysRoot.empty())
5749 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5750
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005751 if (Args.hasArg(options::OPT_static)) {
5752 CmdArgs.push_back("-Bstatic");
5753 } else {
5754 if (Args.hasArg(options::OPT_rdynamic))
5755 CmdArgs.push_back("-export-dynamic");
5756 CmdArgs.push_back("--eh-frame-hdr");
5757 if (Args.hasArg(options::OPT_shared)) {
5758 CmdArgs.push_back("-Bshareable");
5759 } else {
5760 CmdArgs.push_back("-dynamic-linker");
5761 CmdArgs.push_back("/libexec/ld.elf_so");
5762 }
5763 }
5764
5765 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5766 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005767 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005768 CmdArgs.push_back("-m");
5769 CmdArgs.push_back("elf_i386");
5770 }
5771
5772 if (Output.isFilename()) {
5773 CmdArgs.push_back("-o");
5774 CmdArgs.push_back(Output.getFilename());
5775 } else {
5776 assert(Output.isNothing() && "Invalid output.");
5777 }
5778
5779 if (!Args.hasArg(options::OPT_nostdlib) &&
5780 !Args.hasArg(options::OPT_nostartfiles)) {
5781 if (!Args.hasArg(options::OPT_shared)) {
5782 CmdArgs.push_back(Args.MakeArgString(
5783 getToolChain().GetFilePath("crt0.o")));
5784 CmdArgs.push_back(Args.MakeArgString(
5785 getToolChain().GetFilePath("crti.o")));
5786 CmdArgs.push_back(Args.MakeArgString(
5787 getToolChain().GetFilePath("crtbegin.o")));
5788 } else {
5789 CmdArgs.push_back(Args.MakeArgString(
5790 getToolChain().GetFilePath("crti.o")));
5791 CmdArgs.push_back(Args.MakeArgString(
5792 getToolChain().GetFilePath("crtbeginS.o")));
5793 }
5794 }
5795
5796 Args.AddAllArgs(CmdArgs, options::OPT_L);
5797 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5798 Args.AddAllArgs(CmdArgs, options::OPT_e);
5799 Args.AddAllArgs(CmdArgs, options::OPT_s);
5800 Args.AddAllArgs(CmdArgs, options::OPT_t);
5801 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5802 Args.AddAllArgs(CmdArgs, options::OPT_r);
5803
5804 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5805
5806 if (!Args.hasArg(options::OPT_nostdlib) &&
5807 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005808 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005809 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5810 CmdArgs.push_back("-lm");
5811 }
5812 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5813 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005814 if (Args.hasArg(options::OPT_static)) {
5815 CmdArgs.push_back("-lgcc_eh");
5816 } else {
5817 CmdArgs.push_back("--as-needed");
5818 CmdArgs.push_back("-lgcc_s");
5819 CmdArgs.push_back("--no-as-needed");
5820 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005821 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005822
5823 if (Args.hasArg(options::OPT_pthread))
5824 CmdArgs.push_back("-lpthread");
5825 CmdArgs.push_back("-lc");
5826
5827 CmdArgs.push_back("-lgcc");
5828 if (Args.hasArg(options::OPT_static)) {
5829 CmdArgs.push_back("-lgcc_eh");
5830 } else {
5831 CmdArgs.push_back("--as-needed");
5832 CmdArgs.push_back("-lgcc_s");
5833 CmdArgs.push_back("--no-as-needed");
5834 }
5835 }
5836
5837 if (!Args.hasArg(options::OPT_nostdlib) &&
5838 !Args.hasArg(options::OPT_nostartfiles)) {
5839 if (!Args.hasArg(options::OPT_shared))
5840 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5841 "crtend.o")));
5842 else
5843 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5844 "crtendS.o")));
5845 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5846 "crtn.o")));
5847 }
5848
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005849 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005850
David Chisnall5adcec12011-09-27 22:03:18 +00005851 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005852 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5853}
5854
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005855void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5856 const InputInfo &Output,
5857 const InputInfoList &Inputs,
5858 const ArgList &Args,
5859 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005860 ArgStringList CmdArgs;
5861
5862 // Add --32/--64 to make sure we get the format we want.
5863 // This is incomplete
5864 if (getToolChain().getArch() == llvm::Triple::x86) {
5865 CmdArgs.push_back("--32");
5866 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5867 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005868 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5869 CmdArgs.push_back("-a32");
5870 CmdArgs.push_back("-mppc");
5871 CmdArgs.push_back("-many");
5872 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5873 CmdArgs.push_back("-a64");
5874 CmdArgs.push_back("-mppc64");
5875 CmdArgs.push_back("-many");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005876 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5877 CmdArgs.push_back("-a64");
5878 CmdArgs.push_back("-mppc64le");
5879 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005880 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005881 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005882 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5883 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005884
5885 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5886 getToolChain().getTriple());
5887 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005888
5889 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5890 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5891 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005892 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5893 getToolChain().getArch() == llvm::Triple::mipsel ||
5894 getToolChain().getArch() == llvm::Triple::mips64 ||
5895 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005896 StringRef CPUName;
5897 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00005898 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005899
Simon Atanasyan073a7802012-04-07 22:31:29 +00005900 CmdArgs.push_back("-march");
5901 CmdArgs.push_back(CPUName.data());
5902
Simon Atanasyan073a7802012-04-07 22:31:29 +00005903 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005904 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005905
5906 if (getToolChain().getArch() == llvm::Triple::mips ||
5907 getToolChain().getArch() == llvm::Triple::mips64)
5908 CmdArgs.push_back("-EB");
5909 else
5910 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005911
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00005912 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
5913 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
5914 options::OPT_mno_micromips);
5915 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
5916 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
5917
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005918 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5919 options::OPT_fpic, options::OPT_fno_pic,
5920 options::OPT_fPIE, options::OPT_fno_PIE,
5921 options::OPT_fpie, options::OPT_fno_pie);
5922 if (LastPICArg &&
5923 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5924 LastPICArg->getOption().matches(options::OPT_fpic) ||
5925 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5926 LastPICArg->getOption().matches(options::OPT_fpie))) {
5927 CmdArgs.push_back("-KPIC");
5928 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00005929 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00005930 // Always pass an -march option, since our default of z10 is later
5931 // than the GNU assembler's default.
5932 StringRef CPUName = getSystemZTargetCPU(Args);
5933 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005934 }
5935
5936 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5937 options::OPT_Xassembler);
5938
5939 CmdArgs.push_back("-o");
5940 CmdArgs.push_back(Output.getFilename());
5941
5942 for (InputInfoList::const_iterator
5943 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5944 const InputInfo &II = *it;
5945 CmdArgs.push_back(II.getFilename());
5946 }
5947
5948 const char *Exec =
5949 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5950 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00005951
5952 // Handle the debug info splitting at object creation time if we're
5953 // creating an object.
5954 // TODO: Currently only works on linux with newer objcopy.
5955 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
5956 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
5957 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5958 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005959}
5960
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005961static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5962 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005963 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00005964 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5965 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00005966 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005967 CmdArgs.push_back("-lgcc");
5968
Logan Chien529a73d2012-11-19 12:04:11 +00005969 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005970 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005971 CmdArgs.push_back("-lgcc");
5972 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005973 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005974 CmdArgs.push_back("--as-needed");
5975 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00005976 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005977 CmdArgs.push_back("--no-as-needed");
5978 }
5979
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005980 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005981 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00005982 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005983 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00005984
5985 // According to Android ABI, we have to link with libdl if we are
5986 // linking with non-static libgcc.
5987 //
5988 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5989 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5990 if (isAndroid && !StaticLibgcc)
5991 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005992}
5993
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005994static bool hasMipsN32ABIArg(const ArgList &Args) {
5995 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00005996 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005997}
5998
Peter Collingbournebdaa1342013-05-27 21:40:20 +00005999static StringRef getLinuxDynamicLinker(const ArgList &Args,
6000 const toolchains::Linux &ToolChain) {
6001 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6002 return "/system/bin/linker";
6003 else if (ToolChain.getArch() == llvm::Triple::x86)
6004 return "/lib/ld-linux.so.2";
6005 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6006 return "/lib/ld-linux-aarch64.so.1";
6007 else if (ToolChain.getArch() == llvm::Triple::arm ||
6008 ToolChain.getArch() == llvm::Triple::thumb) {
6009 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6010 return "/lib/ld-linux-armhf.so.3";
6011 else
6012 return "/lib/ld-linux.so.3";
6013 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6014 ToolChain.getArch() == llvm::Triple::mipsel)
6015 return "/lib/ld.so.1";
6016 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6017 ToolChain.getArch() == llvm::Triple::mips64el) {
6018 if (hasMipsN32ABIArg(Args))
6019 return "/lib32/ld.so.1";
6020 else
6021 return "/lib64/ld.so.1";
6022 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6023 return "/lib/ld.so.1";
6024 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006025 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006026 ToolChain.getArch() == llvm::Triple::systemz)
6027 return "/lib64/ld64.so.1";
6028 else
6029 return "/lib64/ld-linux-x86-64.so.2";
6030}
6031
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006032void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6033 const InputInfo &Output,
6034 const InputInfoList &Inputs,
6035 const ArgList &Args,
6036 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00006037 const toolchains::Linux& ToolChain =
6038 static_cast<const toolchains::Linux&>(getToolChain());
6039 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00006040 const bool isAndroid =
6041 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00006042 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006043 const bool IsPIE =
6044 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00006045 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006046
Rafael Espindolac1da9812010-11-07 20:14:31 +00006047 ArgStringList CmdArgs;
6048
Rafael Espindola26f14c32010-11-15 18:28:16 +00006049 // Silence warning for "clang -g foo.o -o foo"
6050 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006051 // and "clang -emit-llvm foo.o -o foo"
6052 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00006053 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00006054 // handled somewhere else.
6055 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00006056
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006057 if (!D.SysRoot.empty())
6058 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006059
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006060 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00006061 CmdArgs.push_back("-pie");
6062
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00006063 if (Args.hasArg(options::OPT_rdynamic))
6064 CmdArgs.push_back("-export-dynamic");
6065
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00006066 if (Args.hasArg(options::OPT_s))
6067 CmdArgs.push_back("-s");
6068
Rafael Espindolac1da9812010-11-07 20:14:31 +00006069 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6070 e = ToolChain.ExtraOpts.end();
6071 i != e; ++i)
6072 CmdArgs.push_back(i->c_str());
6073
6074 if (!Args.hasArg(options::OPT_static)) {
6075 CmdArgs.push_back("--eh-frame-hdr");
6076 }
6077
6078 CmdArgs.push_back("-m");
6079 if (ToolChain.getArch() == llvm::Triple::x86)
6080 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00006081 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6082 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00006083 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00006084 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006085 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00006086 else if (ToolChain.getArch() == llvm::Triple::ppc)
6087 CmdArgs.push_back("elf32ppclinux");
6088 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6089 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00006090 else if (ToolChain.getArch() == llvm::Triple::mips)
6091 CmdArgs.push_back("elf32btsmip");
6092 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6093 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006094 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6095 if (hasMipsN32ABIArg(Args))
6096 CmdArgs.push_back("elf32btsmipn32");
6097 else
6098 CmdArgs.push_back("elf64btsmip");
6099 }
6100 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6101 if (hasMipsN32ABIArg(Args))
6102 CmdArgs.push_back("elf32ltsmipn32");
6103 else
6104 CmdArgs.push_back("elf64ltsmip");
6105 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006106 else if (ToolChain.getArch() == llvm::Triple::systemz)
6107 CmdArgs.push_back("elf64_s390");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006108 else
6109 CmdArgs.push_back("elf_x86_64");
6110
6111 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00006112 if (ToolChain.getArch() == llvm::Triple::arm
6113 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006114 CmdArgs.push_back("-Bstatic");
6115 else
6116 CmdArgs.push_back("-static");
6117 } else if (Args.hasArg(options::OPT_shared)) {
6118 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00006119 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006120 CmdArgs.push_back("-Bsymbolic");
6121 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006122 }
6123
6124 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00006125 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00006126 (!Args.hasArg(options::OPT_static) &&
6127 !Args.hasArg(options::OPT_shared))) {
6128 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006129 CmdArgs.push_back(Args.MakeArgString(
6130 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006131 }
6132
6133 CmdArgs.push_back("-o");
6134 CmdArgs.push_back(Output.getFilename());
6135
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006136 if (!Args.hasArg(options::OPT_nostdlib) &&
6137 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006138 if (!isAndroid) {
6139 const char *crt1 = NULL;
6140 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00006141 if (Args.hasArg(options::OPT_pg))
6142 crt1 = "gcrt1.o";
6143 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006144 crt1 = "Scrt1.o";
6145 else
6146 crt1 = "crt1.o";
6147 }
6148 if (crt1)
6149 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006150
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006151 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6152 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006153
Rafael Espindola89414b32010-11-12 03:00:39 +00006154 const char *crtbegin;
6155 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006156 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006157 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006158 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006159 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006160 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006161 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006162 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006163 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00006164
6165 // Add crtfastmath.o if available and fast math is enabled.
6166 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00006167 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006168
6169 Args.AddAllArgs(CmdArgs, options::OPT_L);
6170
6171 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6172
Roman Divacky58e5ac92011-03-01 17:53:14 +00006173 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6174 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006175 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006176
Rafael Espindolac5151542012-04-09 23:53:34 +00006177 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6178 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6179 // forward.
6180 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6181 CmdArgs.push_back("-plugin");
6182 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6183 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006184
6185 // Try to pass driver level flags relevant to LTO code generation down to
6186 // the plugin.
6187
Rafael Espindolab330e402013-08-20 22:12:08 +00006188 // Handle flags for selecting CPU variants.
6189 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6190 if (!CPU.empty()) {
Chandler Carruth700d4e42013-01-13 11:46:33 +00006191 CmdArgs.push_back(
Rafael Espindolab330e402013-08-20 22:12:08 +00006192 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6193 CPU));
6194 }
Rafael Espindolac5151542012-04-09 23:53:34 +00006195 }
6196
Chandler Carruth700d4e42013-01-13 11:46:33 +00006197
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006198 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6199 CmdArgs.push_back("--no-demangle");
6200
Rafael Espindolac1da9812010-11-07 20:14:31 +00006201 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6202
Eric Christopher6716d942012-11-29 18:51:05 +00006203 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006204 if (Sanitize.needsUbsanRt())
Hans Wennborg76b86c22013-07-18 20:29:38 +00006205 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smith61a574f2013-03-20 23:49:07 +00006206 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev050309f2013-05-27 11:17:01 +00006207 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006208 if (Sanitize.needsAsanRt())
6209 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6210 if (Sanitize.needsTsanRt())
6211 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006212 if (Sanitize.needsMsanRt())
6213 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev050309f2013-05-27 11:17:01 +00006214 if (Sanitize.needsLsanRt())
6215 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbourne2eeed712013-08-07 22:47:34 +00006216 if (Sanitize.needsDfsanRt())
6217 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006218
Chandler Carruth80a393e2013-06-24 09:38:45 +00006219 // The profile runtime also needs access to system libraries.
6220 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6221
Hans Wennborg76b86c22013-07-18 20:29:38 +00006222 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006223 !Args.hasArg(options::OPT_nostdlib) &&
6224 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006225 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6226 !Args.hasArg(options::OPT_static);
6227 if (OnlyLibstdcxxStatic)
6228 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006229 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006230 if (OnlyLibstdcxxStatic)
6231 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006232 CmdArgs.push_back("-lm");
6233 }
6234
Rafael Espindola89414b32010-11-12 03:00:39 +00006235 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006236 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6237 if (Args.hasArg(options::OPT_static))
6238 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006239
Chandler Carruthdf96e022013-01-17 13:19:29 +00006240 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6241 if (OpenMP) {
6242 CmdArgs.push_back("-lgomp");
6243
6244 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6245 // librt. Most modern Linux platfroms require it, but some may not.
6246 CmdArgs.push_back("-lrt");
6247 }
6248
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006249 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006250
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006251 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006252 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006253 CmdArgs.push_back("-lpthread");
6254
6255 CmdArgs.push_back("-lc");
6256
6257 if (Args.hasArg(options::OPT_static))
6258 CmdArgs.push_back("--end-group");
6259 else
6260 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6261 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006262
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006263 if (!Args.hasArg(options::OPT_nostartfiles)) {
6264 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006265 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006266 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006267 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006268 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006269 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006270 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006271
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006272 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006273 if (!isAndroid)
6274 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006275 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006276 }
6277
Rafael Espindolac1da9812010-11-07 20:14:31 +00006278 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6279}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006280
Chris Lattner38e317d2010-07-07 16:01:42 +00006281void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006282 const InputInfo &Output,
6283 const InputInfoList &Inputs,
6284 const ArgList &Args,
6285 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006286 ArgStringList CmdArgs;
6287
6288 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6289 options::OPT_Xassembler);
6290
6291 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006292 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006293
6294 for (InputInfoList::const_iterator
6295 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6296 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006297 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006298 }
6299
6300 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006301 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006302 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006303}
6304
6305void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006306 const InputInfo &Output,
6307 const InputInfoList &Inputs,
6308 const ArgList &Args,
6309 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006310 const Driver &D = getToolChain().getDriver();
6311 ArgStringList CmdArgs;
6312
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006313 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006314 CmdArgs.push_back("-o");
6315 CmdArgs.push_back(Output.getFilename());
6316 } else {
6317 assert(Output.isNothing() && "Invalid output.");
6318 }
6319
6320 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006321 !Args.hasArg(options::OPT_nostartfiles)) {
6322 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6323 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6324 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6325 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6326 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006327
6328 Args.AddAllArgs(CmdArgs, options::OPT_L);
6329 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6330 Args.AddAllArgs(CmdArgs, options::OPT_e);
6331
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006332 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006333
Eli Friedman6d402dc2011-12-08 23:54:21 +00006334 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6335
Chris Lattner38e317d2010-07-07 16:01:42 +00006336 if (!Args.hasArg(options::OPT_nostdlib) &&
6337 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006338 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006339 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006340 CmdArgs.push_back("-lm");
6341 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006342 }
6343
6344 if (!Args.hasArg(options::OPT_nostdlib) &&
6345 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006346 if (Args.hasArg(options::OPT_pthread))
6347 CmdArgs.push_back("-lpthread");
6348 CmdArgs.push_back("-lc");
6349 CmdArgs.push_back("-lCompilerRT-Generic");
6350 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6351 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006352 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006353 }
6354
Eli Friedman6d402dc2011-12-08 23:54:21 +00006355 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006356 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006357}
6358
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006359/// DragonFly Tools
6360
6361// For now, DragonFly Assemble does just about the same as for
6362// FreeBSD, but this may change soon.
6363void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006364 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006365 const InputInfoList &Inputs,
6366 const ArgList &Args,
6367 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006368 ArgStringList CmdArgs;
6369
6370 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6371 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006372 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006373 CmdArgs.push_back("--32");
6374
6375 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6376 options::OPT_Xassembler);
6377
6378 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006379 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006380
6381 for (InputInfoList::const_iterator
6382 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6383 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006384 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006385 }
6386
6387 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006388 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006389 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006390}
6391
6392void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006393 const InputInfo &Output,
6394 const InputInfoList &Inputs,
6395 const ArgList &Args,
6396 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006397 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006398 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006399 ArgStringList CmdArgs;
6400
John McCall8cfb7202013-04-11 22:55:55 +00006401 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6402 UseGCC47 = false;
6403
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006404 if (!D.SysRoot.empty())
6405 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6406
John McCall8cfb7202013-04-11 22:55:55 +00006407 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006408 if (Args.hasArg(options::OPT_static)) {
6409 CmdArgs.push_back("-Bstatic");
6410 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006411 if (Args.hasArg(options::OPT_rdynamic))
6412 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006413 if (Args.hasArg(options::OPT_shared))
6414 CmdArgs.push_back("-Bshareable");
6415 else {
6416 CmdArgs.push_back("-dynamic-linker");
6417 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6418 }
John McCall8cfb7202013-04-11 22:55:55 +00006419 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006420 }
6421
6422 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6423 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006424 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006425 CmdArgs.push_back("-m");
6426 CmdArgs.push_back("elf_i386");
6427 }
6428
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006429 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006430 CmdArgs.push_back("-o");
6431 CmdArgs.push_back(Output.getFilename());
6432 } else {
6433 assert(Output.isNothing() && "Invalid output.");
6434 }
6435
6436 if (!Args.hasArg(options::OPT_nostdlib) &&
6437 !Args.hasArg(options::OPT_nostartfiles)) {
6438 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006439 if (Args.hasArg(options::OPT_pg))
6440 CmdArgs.push_back(Args.MakeArgString(
6441 getToolChain().GetFilePath("gcrt1.o")));
6442 else {
6443 if (Args.hasArg(options::OPT_pie))
6444 CmdArgs.push_back(Args.MakeArgString(
6445 getToolChain().GetFilePath("Scrt1.o")));
6446 else
6447 CmdArgs.push_back(Args.MakeArgString(
6448 getToolChain().GetFilePath("crt1.o")));
6449 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006450 }
John McCall8cfb7202013-04-11 22:55:55 +00006451 CmdArgs.push_back(Args.MakeArgString(
6452 getToolChain().GetFilePath("crti.o")));
6453 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6454 CmdArgs.push_back(Args.MakeArgString(
6455 getToolChain().GetFilePath("crtbeginS.o")));
6456 else
6457 CmdArgs.push_back(Args.MakeArgString(
6458 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006459 }
6460
6461 Args.AddAllArgs(CmdArgs, options::OPT_L);
6462 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6463 Args.AddAllArgs(CmdArgs, options::OPT_e);
6464
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006465 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006466
6467 if (!Args.hasArg(options::OPT_nostdlib) &&
6468 !Args.hasArg(options::OPT_nodefaultlibs)) {
6469 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6470 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006471 if (UseGCC47)
6472 CmdArgs.push_back("-L/usr/lib/gcc47");
6473 else
6474 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006475
6476 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006477 if (UseGCC47) {
6478 CmdArgs.push_back("-rpath");
6479 CmdArgs.push_back("/usr/lib/gcc47");
6480 } else {
6481 CmdArgs.push_back("-rpath");
6482 CmdArgs.push_back("/usr/lib/gcc44");
6483 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006484 }
6485
Hans Wennborg76b86c22013-07-18 20:29:38 +00006486 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006487 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006488 CmdArgs.push_back("-lm");
6489 }
6490
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006491 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006492 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006493
6494 if (!Args.hasArg(options::OPT_nolibc)) {
6495 CmdArgs.push_back("-lc");
6496 }
6497
John McCall8cfb7202013-04-11 22:55:55 +00006498 if (UseGCC47) {
6499 if (Args.hasArg(options::OPT_static) ||
6500 Args.hasArg(options::OPT_static_libgcc)) {
6501 CmdArgs.push_back("-lgcc");
6502 CmdArgs.push_back("-lgcc_eh");
6503 } else {
6504 if (Args.hasArg(options::OPT_shared_libgcc)) {
6505 CmdArgs.push_back("-lgcc_pic");
6506 if (!Args.hasArg(options::OPT_shared))
6507 CmdArgs.push_back("-lgcc");
6508 } else {
6509 CmdArgs.push_back("-lgcc");
6510 CmdArgs.push_back("--as-needed");
6511 CmdArgs.push_back("-lgcc_pic");
6512 CmdArgs.push_back("--no-as-needed");
6513 }
6514 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006515 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006516 if (Args.hasArg(options::OPT_shared)) {
6517 CmdArgs.push_back("-lgcc_pic");
6518 } else {
6519 CmdArgs.push_back("-lgcc");
6520 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006521 }
6522 }
6523
6524 if (!Args.hasArg(options::OPT_nostdlib) &&
6525 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006526 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006527 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006528 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006529 else
6530 CmdArgs.push_back(Args.MakeArgString(
6531 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006532 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006533 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006534 }
6535
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006536 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006537
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006538 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006539 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006540 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006541}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006542
6543void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6544 const InputInfo &Output,
6545 const InputInfoList &Inputs,
6546 const ArgList &Args,
6547 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006548 ArgStringList CmdArgs;
6549
6550 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006551 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6552 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006553 } else {
6554 assert(Output.isNothing() && "Invalid output.");
6555 }
6556
6557 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg746974d2013-08-09 17:38:42 +00006558 !Args.hasArg(options::OPT_nostartfiles) &&
6559 !C.getDriver().IsCLMode()) {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006560 CmdArgs.push_back("-defaultlib:libcmt");
6561 }
6562
6563 CmdArgs.push_back("-nologo");
6564
Michael J. Spencera2284f52012-06-18 16:56:04 +00006565 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg5db95272013-08-13 23:38:57 +00006566 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006567
6568 // Add filenames immediately.
6569 for (InputInfoList::const_iterator
6570 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6571 if (it->isFilename())
6572 CmdArgs.push_back(it->getFilename());
Hans Wennborg2388b772013-08-14 01:24:35 +00006573 else
6574 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006575 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006576
6577 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006578 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006579 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6580}