blob: 97b3c4e943cbca871c5b36d1d2458e69ef8d8732 [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"
11
Daniel Dunbar1d460332009-03-18 10:01:51 +000012#include "clang/Driver/Action.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000013#include "clang/Driver/Arg.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000014#include "clang/Driver/ArgList.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000015#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000017#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000019#include "clang/Driver/Option.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000021#include "clang/Driver/ToolChain.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000022#include "clang/Driver/Util.h"
John McCall260611a2012-06-20 06:18:46 +000023#include "clang/Basic/ObjCRuntime.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000024
Daniel Dunbar88137642009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Douglas Gregor55d3f7a2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar5b750fe2009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Daniel Dunbar02633b52009-03-26 16:23:12 +000029#include "llvm/Support/Format.h"
30#include "llvm/Support/raw_ostream.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000031#include "llvm/Support/Host.h"
32#include "llvm/Support/Process.h"
John McCallf85e1932011-06-15 23:02:42 +000033#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000034
35#include "InputInfo.h"
Daniel Dunbar02633b52009-03-26 16:23:12 +000036#include "ToolChains.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000037
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000038using namespace clang::driver;
39using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000040using namespace clang;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000041
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000042/// CheckPreprocessingOptions - Perform some validation of preprocessing
43/// arguments that is shared with gcc.
44static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
45 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +000046 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner5f9e2722011-07-23 10:55:15 +000047 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000048 << A->getAsString(Args) << "-E";
49}
50
Daniel Dunbare2fd6642009-09-10 01:21:12 +000051/// CheckCodeGenerationOptions - Perform some validation of code generation
52/// arguments that is shared with gcc.
53static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54 // In gcc, only ARM checks this, but it seems reasonable to check universally.
55 if (Args.hasArg(options::OPT_static))
56 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57 options::OPT_mdynamic_no_pic))
Chris Lattner5f9e2722011-07-23 10:55:15 +000058 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbare2fd6642009-09-10 01:21:12 +000059 << A->getAsString(Args) << "-static";
60}
61
Chris Lattner3edbeb72010-03-29 17:55:58 +000062// Quote target names for inclusion in GNU Make dependency files.
63// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner5f9e2722011-07-23 10:55:15 +000064static void QuoteTarget(StringRef Target,
65 SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +000066 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
67 switch (Target[i]) {
68 case ' ':
69 case '\t':
70 // Escape the preceding backslashes
71 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
72 Res.push_back('\\');
73
74 // Escape the space/tab
75 Res.push_back('\\');
76 break;
77 case '$':
78 Res.push_back('$');
79 break;
80 case '#':
81 Res.push_back('\\');
82 break;
83 default:
84 break;
85 }
86
87 Res.push_back(Target[i]);
88 }
89}
90
Bill Wendling3d717152012-03-12 22:10:06 +000091static void addDirectoryList(const ArgList &Args,
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000092 ArgStringList &CmdArgs,
93 const char *ArgName,
Bill Wendling3d717152012-03-12 22:10:06 +000094 const char *EnvVar) {
95 const char *DirList = ::getenv(EnvVar);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000096 if (!DirList)
97 return; // Nothing to do.
98
99 StringRef Dirs(DirList);
100 if (Dirs.empty()) // Empty string should not add '.'.
101 return;
102
103 StringRef::size_type Delim;
104 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105 if (Delim == 0) { // Leading colon.
106 CmdArgs.push_back(ArgName);
107 CmdArgs.push_back(".");
108 } else {
109 CmdArgs.push_back(ArgName);
Nico Weber09c5c392012-03-19 15:00:03 +0000110 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000111 }
Nico Weber09c5c392012-03-19 15:00:03 +0000112 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000113 }
114
115 if (Dirs.empty()) { // Trailing colon.
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 } else { // Add the last path.
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(Args.MakeArgString(Dirs));
121 }
122}
123
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000124static void AddLinkerInputs(const ToolChain &TC,
125 const InputInfoList &Inputs, const ArgList &Args,
126 ArgStringList &CmdArgs) {
127 const Driver &D = TC.getDriver();
128
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000129 // Add extra linker input arguments which are not treated as inputs
130 // (constructed via -Xarch_).
131 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
132
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000133 for (InputInfoList::const_iterator
134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
135 const InputInfo &II = *it;
136
137 if (!TC.HasNativeLLVMSupport()) {
138 // Don't try to pass LLVM inputs unless we have native support.
139 if (II.getType() == types::TY_LLVM_IR ||
140 II.getType() == types::TY_LTO_IR ||
141 II.getType() == types::TY_LLVM_BC ||
142 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000143 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000144 << TC.getTripleString();
145 }
146
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000147 // Add filenames immediately.
148 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000149 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000150 continue;
151 }
152
153 // Otherwise, this is a linker input argument.
154 const Arg &A = II.getInputArg();
155
156 // Handle reserved library options.
157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000158 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Sen7433fed2010-09-17 18:39:08 +0000159 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
160 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000161 } else
162 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000163 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000164
165 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendling3d717152012-03-12 22:10:06 +0000166 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000167}
168
John McCallf85e1932011-06-15 23:02:42 +0000169/// \brief Determine whether Objective-C automated reference counting is
170/// enabled.
171static bool isObjCAutoRefCount(const ArgList &Args) {
172 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173}
174
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000175/// \brief Determine whether we are linking the ObjC runtime.
176static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000177 if (isObjCAutoRefCount(Args)) {
178 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000179 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000180 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000181 return Args.hasArg(options::OPT_fobjc_link_runtime);
182}
183
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000184static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000185 ArgStringList &CmdArgs,
186 llvm::Triple Triple) {
187 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
188 Args.hasArg(options::OPT_fprofile_generate) ||
189 Args.hasArg(options::OPT_fcreate_profile) ||
190 Args.hasArg(options::OPT_coverage)))
191 return;
192
193 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
194 // the link line. We cannot do the same thing because unlike gcov there is a
195 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
196 // not supported by old linkers.
Benjamin Kramerf2db04c2011-11-07 16:02:25 +0000197 std::string ProfileRT =
198 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000199
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000200 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000201}
202
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000203void Clang::AddPreprocessingOptions(Compilation &C,
204 const Driver &D,
Douglas Gregordf91ef32009-04-18 00:34:01 +0000205 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000206 ArgStringList &CmdArgs,
207 const InputInfo &Output,
208 const InputInfoList &Inputs) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000209 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000210
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000211 CheckPreprocessingOptions(D, Args);
212
213 Args.AddLastArg(CmdArgs, options::OPT_C);
214 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000215
216 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000217 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000218 (A = Args.getLastArg(options::OPT_MD)) ||
219 (A = Args.getLastArg(options::OPT_MMD))) {
220 // Determine the output location.
221 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000222 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000223 DepFile = MF->getValue(Args);
Peter Collingbourne5d4d9802011-11-21 00:01:05 +0000224 C.addFailureResultFile(DepFile);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000225 } else if (Output.getType() == types::TY_Dependencies) {
226 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000227 } else if (A->getOption().matches(options::OPT_M) ||
228 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000229 DepFile = "-";
230 } else {
231 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne5d4d9802011-11-21 00:01:05 +0000232 C.addFailureResultFile(DepFile);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000233 }
234 CmdArgs.push_back("-dependency-file");
235 CmdArgs.push_back(DepFile);
236
Chris Lattner3edbeb72010-03-29 17:55:58 +0000237 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000238 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
239 const char *DepTarget;
240
241 // If user provided -o, that is the dependency target, except
242 // when we are only generating a dependency file.
243 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
244 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
245 DepTarget = OutputOpt->getValue(Args);
246 } else {
247 // Otherwise derive from the base input.
248 //
249 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000250 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000251 llvm::sys::path::replace_extension(P, "o");
252 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000253 }
254
255 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000256 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000257 QuoteTarget(DepTarget, Quoted);
258 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000259 }
260
Daniel Dunbarb827a052009-11-19 03:26:40 +0000261 if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000263 CmdArgs.push_back("-sys-header-deps");
264 }
265
Peter Collingbournebb527862011-07-12 19:35:15 +0000266 if (Args.hasArg(options::OPT_MG)) {
267 if (!A || A->getOption().matches(options::OPT_MD) ||
268 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000269 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000270 CmdArgs.push_back("-MG");
271 }
272
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000273 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000274
275 // Convert all -MQ <target> args to -MT <quoted target>
276 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
277 options::OPT_MQ),
278 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000279 const Arg *A = *it;
280 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000281
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000282 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000283 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000285 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000286 CmdArgs.push_back(Args.MakeArgString(Quoted));
287
288 // -MT flag - no change
289 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000290 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000291 }
292 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000293
Douglas Gregordf91ef32009-04-18 00:34:01 +0000294 // Add -i* options, and automatically translate to
295 // -include-pch/-include-pth for transparent PCH support. It's
296 // wonky, but we include looking for .gch so we can support seamless
297 // replacement into a build system already set up to be generating
298 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000299 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000300 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
301 ie = Args.filtered_end(); it != ie; ++it) {
302 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000303
304 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000305 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
306 RenderedImplicitInclude = true;
307
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000308 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000309 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000310
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000311 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000312 bool FoundPCH = false;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000313 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000314 bool Exists;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000315 if (UsePCH) {
Douglas Gregordf91ef32009-04-18 00:34:01 +0000316 P.appendSuffix("pch");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000317 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregordf91ef32009-04-18 00:34:01 +0000318 FoundPCH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000319 else
Douglas Gregordf91ef32009-04-18 00:34:01 +0000320 P.eraseSuffix();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000321 }
322
Douglas Gregordf91ef32009-04-18 00:34:01 +0000323 if (!FoundPCH) {
324 P.appendSuffix("pth");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000325 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregordf91ef32009-04-18 00:34:01 +0000326 FoundPTH = true;
327 else
328 P.eraseSuffix();
Mike Stump1eb44332009-09-09 15:08:12 +0000329 }
330
Douglas Gregordf91ef32009-04-18 00:34:01 +0000331 if (!FoundPCH && !FoundPTH) {
332 P.appendSuffix("gch");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000333 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000334 FoundPCH = UsePCH;
335 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000336 }
Mike Stump1eb44332009-09-09 15:08:12 +0000337 else
Douglas Gregordf91ef32009-04-18 00:34:01 +0000338 P.eraseSuffix();
339 }
340
341 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000342 if (IsFirstImplicitInclude) {
343 A->claim();
344 if (UsePCH)
345 CmdArgs.push_back("-include-pch");
346 else
347 CmdArgs.push_back("-include-pth");
348 CmdArgs.push_back(Args.MakeArgString(P.str()));
349 continue;
350 } else {
351 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000352 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000353 << P.str() << A->getAsString(Args);
354 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000355 }
356 }
357
358 // Not translated, render as usual.
359 A->claim();
360 A->render(Args, CmdArgs);
361 }
362
363 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000364 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
365 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000366
367 // Add -Wp, and -Xassembler if using the preprocessor.
368
369 // FIXME: There is a very unfortunate problem here, some troubled
370 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
371 // really support that we would have to parse and then translate
372 // those options. :(
373 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
374 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000375
376 // -I- is a deprecated GCC feature, reject it.
377 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000378 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000379
380 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
381 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000382 StringRef sysroot = C.getSysRoot();
383 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000384 if (!Args.hasArg(options::OPT_isysroot)) {
385 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000386 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000387 }
388 }
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000389
390 // If a module path was provided, pass it along. Otherwise, use a temporary
391 // directory.
392 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000393 A->claim();
394 A->render(Args, CmdArgs);
395 } else {
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000396 SmallString<128> DefaultModuleCache;
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000397 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
398 DefaultModuleCache);
399 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
400 CmdArgs.push_back("-fmodule-cache-path");
401 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
402 }
Douglas Gregorfba18aa2011-09-15 22:00:41 +0000403
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000404 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000405 // FIXME: We should probably sink the logic for handling these from the
406 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000407 // CPATH - included following the user specified includes (but prior to
408 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000409 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000410 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000411 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000412 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000413 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000414 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000416 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000417 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000418
Chandler Carruth88491fc2011-11-04 07:12:53 +0000419 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000420 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000421 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000422
423 // Add system include arguments.
424 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000425}
426
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000427/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000428/// CPU.
429//
430// FIXME: This is redundant with -mcpu, why does LLVM use this.
431// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000432static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000433 return llvm::StringSwitch<const char *>(CPU)
434 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
435 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
436 .Cases("arm920", "arm920t", "arm922t", "v4t")
437 .Cases("arm940t", "ep9312","v4t")
438 .Cases("arm10tdmi", "arm1020t", "v5")
439 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
440 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
441 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
442 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
443 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
444 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Silviu Baranga2df67ea2012-09-13 15:06:00 +0000445 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "v7")
Bob Wilson57f6d192012-03-21 17:19:12 +0000446 .Case("cortex-m3", "v7m")
Jim Grosbach69033132012-03-29 19:53:34 +0000447 .Case("cortex-m4", "v7m")
Bob Wilson57f6d192012-03-21 17:19:12 +0000448 .Case("cortex-m0", "v6m")
Bob Wilson336bfa32012-09-29 23:52:50 +0000449 .Case("cortex-a9-mp", "v7f")
450 .Case("swift", "v7s")
Chad Rosierae1aee62011-10-07 17:48:56 +0000451 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000452}
453
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000454/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
455//
456// FIXME: tblgen this.
457static std::string getARMTargetCPU(const ArgList &Args,
458 const llvm::Triple &Triple) {
459 // FIXME: Warn on inconsistent use of -mcpu and -march.
460
461 // If we have -mcpu=, use that.
462 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
463 StringRef MCPU = A->getValue(Args);
464 // Handle -mcpu=native.
465 if (MCPU == "native")
466 return llvm::sys::getHostCPUName();
467 else
468 return MCPU;
469 }
470
471 StringRef MArch;
472 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
473 // Otherwise, if we have -march= choose the base CPU for that arch.
474 MArch = A->getValue(Args);
475 } else {
476 // Otherwise, use the Arch from the triple.
477 MArch = Triple.getArchName();
478 }
479
480 // Handle -march=native.
481 std::string NativeMArch;
482 if (MArch == "native") {
483 std::string CPU = llvm::sys::getHostCPUName();
484 if (CPU != "generic") {
485 // Translate the native cpu into the architecture. The switch below will
486 // then chose the minimum cpu for that arch.
487 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
488 MArch = NativeMArch;
489 }
490 }
491
492 return llvm::StringSwitch<const char *>(MArch)
493 .Cases("armv2", "armv2a","arm2")
494 .Case("armv3", "arm6")
495 .Case("armv3m", "arm7m")
496 .Cases("armv4", "armv4t", "arm7tdmi")
497 .Cases("armv5", "armv5t", "arm10tdmi")
498 .Cases("armv5e", "armv5te", "arm1022e")
499 .Case("armv5tej", "arm926ej-s")
500 .Cases("armv6", "armv6k", "arm1136jf-s")
501 .Case("armv6j", "arm1136j-s")
502 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
503 .Case("armv6t2", "arm1156t2-s")
504 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson336bfa32012-09-29 23:52:50 +0000505 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
506 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000507 .Cases("armv7r", "armv7-r", "cortex-r4")
508 .Cases("armv7m", "armv7-m", "cortex-m3")
509 .Case("ep9312", "ep9312")
510 .Case("iwmmxt", "iwmmxt")
511 .Case("xscale", "xscale")
512 .Cases("armv6m", "armv6-m", "cortex-m0")
513 // If all else failed, return the most base CPU LLVM supports.
514 .Default("arm7tdmi");
515}
516
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000517// FIXME: Move to target hook.
518static bool isSignedCharDefault(const llvm::Triple &Triple) {
519 switch (Triple.getArch()) {
520 default:
521 return true;
522
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000523 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000524 case llvm::Triple::ppc:
525 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000526 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000527 return true;
528 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000529 }
530}
531
Chad Rosier99317272012-04-04 20:51:35 +0000532// Handle -mfpu=.
533//
534// FIXME: Centralize feature selection, defaulting shouldn't be also in the
535// frontend target.
536static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
537 ArgStringList &CmdArgs) {
538 StringRef FPU = A->getValue(Args);
539
540 // Set the target features based on the FPU.
541 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
542 // Disable any default FPU support.
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-vfp2");
545 CmdArgs.push_back("-target-feature");
546 CmdArgs.push_back("-vfp3");
547 CmdArgs.push_back("-target-feature");
548 CmdArgs.push_back("-neon");
549 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("+vfp3");
552 CmdArgs.push_back("-target-feature");
553 CmdArgs.push_back("+d16");
554 CmdArgs.push_back("-target-feature");
555 CmdArgs.push_back("-neon");
556 } else if (FPU == "vfp") {
557 CmdArgs.push_back("-target-feature");
558 CmdArgs.push_back("+vfp2");
559 CmdArgs.push_back("-target-feature");
560 CmdArgs.push_back("-neon");
561 } else if (FPU == "vfp3" || FPU == "vfpv3") {
562 CmdArgs.push_back("-target-feature");
563 CmdArgs.push_back("+vfp3");
564 CmdArgs.push_back("-target-feature");
565 CmdArgs.push_back("-neon");
566 } else if (FPU == "neon") {
567 CmdArgs.push_back("-target-feature");
568 CmdArgs.push_back("+neon");
569 } else
570 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
571}
572
Chad Rosier7a938fa2012-04-04 20:39:32 +0000573// Handle -mfpmath=.
574static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000575 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier7a938fa2012-04-04 20:39:32 +0000576 StringRef FPMath = A->getValue(Args);
577
578 // Set the target features based on the FPMath.
579 if (FPMath == "neon") {
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000582
Silviu Baranga2df67ea2012-09-13 15:06:00 +0000583 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
584 CPU != "cortex-a15")
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000585 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
586
Chad Rosier7a938fa2012-04-04 20:39:32 +0000587 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
588 FPMath == "vfp4") {
589 CmdArgs.push_back("-target-feature");
590 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000591
592 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000593 } else
594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
596
Anton Korobeynikove2571792012-04-09 13:38:30 +0000597// Select the float ABI as determined by -msoft-float, -mhard-float, and
598// -mfloat-abi=.
599static StringRef getARMFloatABI(const Driver &D,
600 const ArgList &Args,
601 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000602 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000603 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
604 options::OPT_mhard_float,
605 options::OPT_mfloat_abi_EQ)) {
606 if (A->getOption().matches(options::OPT_msoft_float))
607 FloatABI = "soft";
608 else if (A->getOption().matches(options::OPT_mhard_float))
609 FloatABI = "hard";
610 else {
611 FloatABI = A->getValue(Args);
612 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000613 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000614 << A->getAsString(Args);
615 FloatABI = "soft";
616 }
617 }
618 }
619
620 // If unspecified, choose the default based on the platform.
621 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000622 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000623 case llvm::Triple::Darwin:
624 case llvm::Triple::MacOSX:
625 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000626 // Darwin defaults to "softfp" for v6 and v7.
627 //
628 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000629 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000630 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000631 if (StringRef(ArchName).startswith("v6") ||
632 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000633 FloatABI = "softfp";
634 else
635 FloatABI = "soft";
636 break;
637 }
638
639 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000640 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000641 case llvm::Triple::GNUEABIHF:
642 FloatABI = "hard";
643 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000644 case llvm::Triple::GNUEABI:
645 FloatABI = "softfp";
646 break;
647 case llvm::Triple::EABI:
648 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
649 FloatABI = "softfp";
650 break;
Logan Chien94a71422012-09-02 09:30:11 +0000651 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000652 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000653 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000654 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000655 FloatABI = "softfp";
656 else
657 FloatABI = "soft";
658 break;
659 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000660 default:
661 // Assume "soft", but warn the user we are guessing.
662 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000663 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000664 break;
665 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000666 }
667 }
668
Anton Korobeynikove2571792012-04-09 13:38:30 +0000669 return FloatABI;
670}
671
672
673void Clang::AddARMTargetArgs(const ArgList &Args,
674 ArgStringList &CmdArgs,
675 bool KernelOrKext) const {
676 const Driver &D = getToolChain().getDriver();
Bob Wilsonf2f3ce52012-09-29 23:52:58 +0000677 // Get the effective triple, which takes into account the deployment target.
678 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
679 llvm::Triple Triple(TripleStr);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000680
681 // Select the ABI to use.
682 //
683 // FIXME: Support -meabi.
684 const char *ABIName = 0;
685 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
686 ABIName = A->getValue(Args);
687 } else {
688 // Select the default based on the platform.
689 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000690 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000691 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000692 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000693 ABIName = "aapcs-linux";
694 break;
695 case llvm::Triple::EABI:
696 ABIName = "aapcs";
697 break;
698 default:
699 ABIName = "apcs-gnu";
700 }
701 }
702 CmdArgs.push_back("-target-abi");
703 CmdArgs.push_back(ABIName);
704
705 // Set the CPU based on -march= and -mcpu=.
706 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000707 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikove2571792012-04-09 13:38:30 +0000708
709 // Determine floating point ABI from the options & target defaults.
710 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000711 if (FloatABI == "soft") {
712 // Floating point operations and argument passing are soft.
713 //
714 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000715 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000716 CmdArgs.push_back("-mfloat-abi");
717 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000718 } else if (FloatABI == "softfp") {
719 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000720 CmdArgs.push_back("-mfloat-abi");
721 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000722 } else {
723 // Floating point operations and argument passing are hard.
724 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000725 CmdArgs.push_back("-mfloat-abi");
726 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000727 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000728
729 // Set appropriate target features for floating point mode.
730 //
731 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
732 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
733 // stripped out by the ARM target.
734
735 // Use software floating point operations?
736 if (FloatABI == "soft") {
737 CmdArgs.push_back("-target-feature");
738 CmdArgs.push_back("+soft-float");
739 }
740
741 // Use software floating point argument passing?
742 if (FloatABI != "hard") {
743 CmdArgs.push_back("-target-feature");
744 CmdArgs.push_back("+soft-float-abi");
745 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000746
747 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000748 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000749 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000750
Chad Rosier7a938fa2012-04-04 20:39:32 +0000751 // Honor -mfpmath=.
752 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000753 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000754
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000755 // Setting -msoft-float effectively disables NEON because of the GCC
756 // implementation, although the same isn't true of VFP or VFP3.
757 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000758 CmdArgs.push_back("-target-feature");
759 CmdArgs.push_back("-neon");
760 }
761
762 // Kernel code has more strict alignment requirements.
763 if (KernelOrKext) {
Bob Wilsonf2f3ce52012-09-29 23:52:58 +0000764 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
765 CmdArgs.push_back("-backend-option");
766 CmdArgs.push_back("-arm-long-calls");
767 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000768
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000769 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000770 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000771
772 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000773 CmdArgs.push_back("-backend-option");
774 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000775 }
Chad Rosier1b906052011-08-26 00:26:29 +0000776
777 // Setting -mno-global-merge disables the codegen global merge pass. Setting
778 // -mglobal-merge has no effect as the pass is enabled by default.
779 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
780 options::OPT_mno_global_merge)) {
781 if (A->getOption().matches(options::OPT_mno_global_merge))
782 CmdArgs.push_back("-mno-global-merge");
783 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000784
Chad Rosier005af272012-05-16 21:19:55 +0000785 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000786 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000787}
788
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000789// Translate MIPS CPU name alias option to CPU name.
790static StringRef getMipsCPUFromAlias(const Arg &A) {
791 if (A.getOption().matches(options::OPT_mips32))
792 return "mips32";
793 if (A.getOption().matches(options::OPT_mips32r2))
794 return "mips32r2";
795 if (A.getOption().matches(options::OPT_mips64))
796 return "mips64";
797 if (A.getOption().matches(options::OPT_mips64r2))
798 return "mips64r2";
799 llvm_unreachable("Unexpected option");
800 return "";
801}
802
Simon Atanasyana2768be2012-04-07 22:09:23 +0000803// Get CPU and ABI names. They are not independent
804// so we have to calculate them together.
805static void getMipsCPUAndABI(const ArgList &Args,
806 const ToolChain &TC,
807 StringRef &CPUName,
808 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000809 const char *DefMips32CPU = "mips32";
810 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000811
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000812 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000813 options::OPT_mcpu_EQ,
814 options::OPT_mips_CPUs_Group)) {
815 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
816 CPUName = getMipsCPUFromAlias(*A);
817 else
818 CPUName = A->getValue(Args);
819 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000820
Akira Hatanaka9f360622011-09-26 21:07:52 +0000821 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christophered734732010-03-02 02:41:08 +0000822 ABIName = A->getValue(Args);
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000823
824 // Setup default CPU and ABI names.
825 if (CPUName.empty() && ABIName.empty()) {
826 switch (TC.getTriple().getArch()) {
827 default:
828 llvm_unreachable("Unexpected triple arch name");
829 case llvm::Triple::mips:
830 case llvm::Triple::mipsel:
831 CPUName = DefMips32CPU;
832 break;
833 case llvm::Triple::mips64:
834 case llvm::Triple::mips64el:
835 CPUName = DefMips64CPU;
836 break;
837 }
838 }
839
840 if (!ABIName.empty()) {
841 // Deduce CPU name from ABI name.
842 CPUName = llvm::StringSwitch<const char *>(ABIName)
843 .Cases("o32", "eabi", DefMips32CPU)
844 .Cases("n32", "n64", DefMips64CPU)
845 .Default("");
846 }
847 else if (!CPUName.empty()) {
848 // Deduce ABI name from CPU name.
849 ABIName = llvm::StringSwitch<const char *>(CPUName)
850 .Cases("mips32", "mips32r2", "o32")
851 .Cases("mips64", "mips64r2", "n64")
852 .Default("");
853 }
854
855 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000856}
857
Simon Atanasyan5e627792012-06-02 15:06:29 +0000858// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
859// and -mfloat-abi=.
860static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000861 // Select the float ABI as determined by -msoft-float, -mhard-float,
862 // and -mfloat-abi=.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000863 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000864 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000865 options::OPT_mhard_float,
866 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000867 if (A->getOption().matches(options::OPT_msoft_float))
868 FloatABI = "soft";
869 else if (A->getOption().matches(options::OPT_mhard_float))
870 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000871 else {
872 FloatABI = A->getValue(Args);
873 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000874 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000875 FloatABI = "hard";
876 }
877 }
Eric Christophered734732010-03-02 02:41:08 +0000878 }
879
880 // If unspecified, choose the default based on the platform.
881 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000882 // Assume "hard", because it's a default value used by gcc.
883 // When we start to recognize specific target MIPS processors,
884 // we will be able to select the default more correctly.
885 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000886 }
887
Simon Atanasyan5e627792012-06-02 15:06:29 +0000888 return FloatABI;
889}
890
Simon Atanasyandc536f52012-07-05 18:51:43 +0000891static void AddTargetFeature(const ArgList &Args,
892 ArgStringList &CmdArgs,
893 OptSpecifier OnOpt,
894 OptSpecifier OffOpt,
895 StringRef FeatureName) {
896 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
897 CmdArgs.push_back("-target-feature");
898 if (A->getOption().matches(OnOpt))
899 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
900 else
901 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
902 }
903}
904
Simon Atanasyan5e627792012-06-02 15:06:29 +0000905void Clang::AddMIPSTargetArgs(const ArgList &Args,
906 ArgStringList &CmdArgs) const {
907 const Driver &D = getToolChain().getDriver();
908 StringRef CPUName;
909 StringRef ABIName;
910 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
911
912 CmdArgs.push_back("-target-cpu");
913 CmdArgs.push_back(CPUName.data());
914
915 CmdArgs.push_back("-target-abi");
916 CmdArgs.push_back(ABIName.data());
917
918 StringRef FloatABI = getMipsFloatABI(D, Args);
919
Eric Christophered734732010-03-02 02:41:08 +0000920 if (FloatABI == "soft") {
921 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000922 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000923 CmdArgs.push_back("-mfloat-abi");
924 CmdArgs.push_back("soft");
925
926 // FIXME: Note, this is a hack. We need to pass the selected float
927 // mode to the MipsTargetInfoBase to define appropriate macros there.
928 // Now it is the only method.
929 CmdArgs.push_back("-target-feature");
930 CmdArgs.push_back("+soft-float");
931 }
932 else if (FloatABI == "single") {
933 // Restrict the use of hardware floating-point
934 // instructions to 32-bit operations.
935 CmdArgs.push_back("-target-feature");
936 CmdArgs.push_back("+single-float");
937 }
938 else {
939 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +0000940 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000941 CmdArgs.push_back("-mfloat-abi");
942 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +0000943 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +0000944
Simon Atanasyandc536f52012-07-05 18:51:43 +0000945 AddTargetFeature(Args, CmdArgs,
946 options::OPT_mips16, options::OPT_mno_mips16,
947 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +0000948 AddTargetFeature(Args, CmdArgs,
949 options::OPT_mdsp, options::OPT_mno_dsp,
950 "dsp");
951 AddTargetFeature(Args, CmdArgs,
952 options::OPT_mdspr2, options::OPT_mno_dspr2,
953 "dspr2");
Simon Atanasyan9804b762012-08-27 20:55:56 +0000954
955 if (Arg *A = Args.getLastArg(options::OPT_G)) {
956 StringRef v = A->getValue(Args);
957 CmdArgs.push_back("-mllvm");
958 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
959 A->claim();
960 }
Eric Christophered734732010-03-02 02:41:08 +0000961}
962
Hal Finkel02a84272012-06-11 22:35:19 +0000963/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
964static std::string getPPCTargetCPU(const ArgList &Args) {
965 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
966 StringRef CPUName = A->getValue(Args);
967
968 if (CPUName == "native") {
969 std::string CPU = llvm::sys::getHostCPUName();
970 if (!CPU.empty() && CPU != "generic")
971 return CPU;
972 else
973 return "";
974 }
975
976 return llvm::StringSwitch<const char *>(CPUName)
977 .Case("common", "generic")
978 .Case("440", "440")
979 .Case("440fp", "440")
980 .Case("450", "450")
981 .Case("601", "601")
982 .Case("602", "602")
983 .Case("603", "603")
984 .Case("603e", "603e")
985 .Case("603ev", "603ev")
986 .Case("604", "604")
987 .Case("604e", "604e")
988 .Case("620", "620")
989 .Case("G3", "g3")
990 .Case("7400", "7400")
991 .Case("G4", "g4")
992 .Case("7450", "7450")
993 .Case("G4+", "g4+")
994 .Case("750", "750")
995 .Case("970", "970")
996 .Case("G5", "g5")
997 .Case("a2", "a2")
Hal Finkel7de32962012-09-18 22:25:03 +0000998 .Case("e500mc", "e500mc")
999 .Case("e5500", "e5500")
Hal Finkel02a84272012-06-11 22:35:19 +00001000 .Case("power6", "pwr6")
1001 .Case("power7", "pwr7")
1002 .Case("powerpc", "ppc")
1003 .Case("powerpc64", "ppc64")
1004 .Default("");
1005 }
1006
1007 return "";
1008}
1009
1010void Clang::AddPPCTargetArgs(const ArgList &Args,
1011 ArgStringList &CmdArgs) const {
1012 std::string TargetCPUName = getPPCTargetCPU(Args);
1013
1014 // LLVM may default to generating code for the native CPU,
1015 // but, like gcc, we default to a more generic option for
1016 // each architecture. (except on Darwin)
1017 llvm::Triple Triple = getToolChain().getTriple();
1018 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1019 if (Triple.getArch() == llvm::Triple::ppc64)
1020 TargetCPUName = "ppc64";
1021 else
1022 TargetCPUName = "ppc";
1023 }
1024
1025 if (!TargetCPUName.empty()) {
1026 CmdArgs.push_back("-target-cpu");
1027 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1028 }
1029}
1030
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001031void Clang::AddSparcTargetArgs(const ArgList &Args,
1032 ArgStringList &CmdArgs) const {
1033 const Driver &D = getToolChain().getDriver();
1034
1035 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001036 CmdArgs.push_back("-target-cpu");
Benjamin Kramera11d3092011-12-26 14:18:37 +00001037 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001038 }
1039
1040 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001041 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001042 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1043 options::OPT_mhard_float)) {
1044 if (A->getOption().matches(options::OPT_msoft_float))
1045 FloatABI = "soft";
1046 else if (A->getOption().matches(options::OPT_mhard_float))
1047 FloatABI = "hard";
1048 }
1049
1050 // If unspecified, choose the default based on the platform.
1051 if (FloatABI.empty()) {
1052 switch (getToolChain().getTriple().getOS()) {
1053 default:
1054 // Assume "soft", but warn the user we are guessing.
1055 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +00001056 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001057 break;
1058 }
1059 }
1060
1061 if (FloatABI == "soft") {
1062 // Floating point operations and argument passing are soft.
1063 //
1064 // FIXME: This changes CPP defines, we need -target-soft-float.
1065 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001066 CmdArgs.push_back("-target-feature");
1067 CmdArgs.push_back("+soft-float");
1068 } else {
1069 assert(FloatABI == "hard" && "Invalid float abi!");
1070 CmdArgs.push_back("-mhard-float");
1071 }
1072}
1073
Daniel Dunbar6acda162009-09-09 22:33:08 +00001074void Clang::AddX86TargetArgs(const ArgList &Args,
1075 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001076 if (!Args.hasFlag(options::OPT_mred_zone,
1077 options::OPT_mno_red_zone,
1078 true) ||
1079 Args.hasArg(options::OPT_mkernel) ||
1080 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001081 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001082
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001083 if (Args.hasFlag(options::OPT_msoft_float,
1084 options::OPT_mno_soft_float,
1085 false))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001086 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001087
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001088 const char *CPUName = 0;
Daniel Dunbar6acda162009-09-09 22:33:08 +00001089 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001090 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001091 // FIXME: Reject attempts to use -march=native unless the target matches
1092 // the host.
1093 //
1094 // FIXME: We should also incorporate the detected target features for use
1095 // with -native.
1096 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone0cc3092012-05-09 17:53:10 +00001097 if (!CPU.empty() && CPU != "generic")
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001098 CPUName = Args.MakeArgString(CPU);
1099 } else
1100 CPUName = A->getValue(Args);
1101 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001102
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001103 // Select the default CPU if none was given (or detection failed).
1104 if (!CPUName) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00001105 // FIXME: Need target hooks.
Bob Wilson905c45f2011-10-14 05:03:44 +00001106 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001107 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001108 CPUName = "core2";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001109 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001110 CPUName = "yonah";
Chris Lattner86ed3a32010-04-11 19:29:39 +00001111 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001112 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001113 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001114 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001115 CPUName = "i586";
Daniel Dunbar95c04572010-08-01 23:13:54 +00001116 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001117 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001118 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001119 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001120 CPUName = "i486";
Eli Friedman42f74f22012-08-08 23:57:20 +00001121 } else if (getToolChain().getOS().startswith("bitrig")) {
1122 if (getToolChain().getArch() == llvm::Triple::x86_64)
1123 CPUName = "x86-64";
1124 else if (getToolChain().getArch() == llvm::Triple::x86)
1125 CPUName = "i686";
Roman Divacky451f8ca2011-03-01 18:11:37 +00001126 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001127 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001128 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001129 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001130 CPUName = "i486";
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001131 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001132 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001133 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001134 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001135 CPUName = "i486";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001136 } else {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001137 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001138 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001139 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001140 CPUName = "pentium4";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001141 }
1142 }
1143
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001144 if (CPUName) {
Daniel Dunbar38b48af2009-12-18 06:30:12 +00001145 CmdArgs.push_back("-target-cpu");
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001146 CmdArgs.push_back(CPUName);
1147 }
1148
Eli Friedmand18eeca2011-07-02 00:34:19 +00001149 // The required algorithm here is slightly strange: the options are applied
1150 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1151 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1152 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1153 // former correctly, but not the latter; handle directly-overridden
1154 // attributes here.
1155 llvm::StringMap<unsigned> PrevFeature;
1156 std::vector<const char*> Features;
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001157 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1158 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001159 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001160 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001161
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001162 // Skip over "-m".
1163 assert(Name.startswith("-m") && "Invalid feature name.");
1164 Name = Name.substr(2);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001165
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001166 bool IsNegative = Name.startswith("no-");
1167 if (IsNegative)
1168 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001169
Eli Friedmand18eeca2011-07-02 00:34:19 +00001170 unsigned& Prev = PrevFeature[Name];
1171 if (Prev)
1172 Features[Prev - 1] = 0;
1173 Prev = Features.size() + 1;
1174 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1175 }
1176 for (unsigned i = 0; i < Features.size(); i++) {
1177 if (Features[i]) {
1178 CmdArgs.push_back("-target-feature");
1179 CmdArgs.push_back(Features[i]);
1180 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001181 }
1182}
1183
Tony Linthicum96319392011-12-12 21:14:55 +00001184static Arg* getLastHexagonArchArg (const ArgList &Args)
1185{
1186 Arg * A = NULL;
1187
Sebastian Pop43115d42012-01-13 20:37:10 +00001188 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1189 it != ie; ++it) {
1190 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum96319392011-12-12 21:14:55 +00001191 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1192 A = *it;
1193 A->claim();
1194 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001195 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1196 StringRef Value = (*it)->getValue(Args,0);
1197 if (Value.startswith("v")) {
1198 A = *it;
1199 A->claim();
1200 }
1201 }
Tony Linthicum96319392011-12-12 21:14:55 +00001202 }
1203 return A;
1204}
1205
Sebastian Pop43115d42012-01-13 20:37:10 +00001206static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum96319392011-12-12 21:14:55 +00001207{
1208 Arg *A;
1209 llvm::StringRef WhichHexagon;
1210
Sebastian Pop43115d42012-01-13 20:37:10 +00001211 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum96319392011-12-12 21:14:55 +00001212 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop43115d42012-01-13 20:37:10 +00001213 WhichHexagon = A->getValue(Args);
1214 if (WhichHexagon == "")
1215 return "v4";
1216 else
1217 return WhichHexagon;
Tony Linthicum96319392011-12-12 21:14:55 +00001218 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001219 else
1220 return "v4";
Tony Linthicum96319392011-12-12 21:14:55 +00001221}
1222
1223void Clang::AddHexagonTargetArgs(const ArgList &Args,
1224 ArgStringList &CmdArgs) const {
1225 llvm::Triple Triple = getToolChain().getTriple();
1226
1227 CmdArgs.push_back("-target-cpu");
Sebastian Pop43115d42012-01-13 20:37:10 +00001228 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00001229 CmdArgs.push_back("-fno-signed-char");
1230 CmdArgs.push_back("-nobuiltininc");
1231
Sirish Pande5f9688b2012-05-10 20:19:54 +00001232 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum96319392011-12-12 21:14:55 +00001233 CmdArgs.push_back("-mqdsp6-compat");
1234
1235 if (Arg *A = Args.getLastArg(options::OPT_G,
1236 options::OPT_msmall_data_threshold_EQ)) {
1237 std::string SmallDataThreshold="-small-data-threshold=";
1238 SmallDataThreshold += A->getValue(Args);
1239 CmdArgs.push_back ("-mllvm");
1240 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1241 A->claim();
1242 }
1243
Sirish Pande5f9688b2012-05-10 20:19:54 +00001244 if (!Args.hasArg(options::OPT_fno_short_enums))
1245 CmdArgs.push_back("-fshort-enums");
1246 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1247 CmdArgs.push_back ("-mllvm");
1248 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1249 }
Tony Linthicum96319392011-12-12 21:14:55 +00001250 CmdArgs.push_back ("-mllvm");
1251 CmdArgs.push_back ("-machine-sink-split=0");
1252}
1253
Eric Christopher88b7cf02011-08-19 00:30:14 +00001254static bool
John McCall260611a2012-06-20 06:18:46 +00001255shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001256 const llvm::Triple &Triple) {
1257 // We use the zero-cost exception tables for Objective-C if the non-fragile
1258 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1259 // later.
John McCall260611a2012-06-20 06:18:46 +00001260 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001261 return true;
1262
Bob Wilson905c45f2011-10-14 05:03:44 +00001263 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001264 return false;
1265
Eric Christopheraa7333c2011-07-02 00:20:22 +00001266 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001267 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001268 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001269}
1270
Anders Carlsson15348ae2011-02-28 02:27:16 +00001271/// addExceptionArgs - Adds exception related arguments to the driver command
1272/// arguments. There's a master flag, -fexceptions and also language specific
1273/// flags to enable/disable C++ and Objective-C exceptions.
1274/// This makes it possible to for example disable C++ exceptions but enable
1275/// Objective-C exceptions.
1276static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1277 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001278 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001279 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001280 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001281 if (KernelOrKext) {
1282 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1283 // arguments now to avoid warnings about unused arguments.
1284 Args.ClaimAllArgs(options::OPT_fexceptions);
1285 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1286 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1287 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1288 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1289 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001290 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001291 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001292
1293 // Exceptions are enabled by default.
1294 bool ExceptionsEnabled = true;
1295
1296 // This keeps track of whether exceptions were explicitly turned on or off.
1297 bool DidHaveExplicitExceptionFlag = false;
1298
Rafael Espindolaf759df02009-10-01 13:33:33 +00001299 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1300 options::OPT_fno_exceptions)) {
1301 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001302 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001303 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001304 ExceptionsEnabled = false;
1305
1306 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001307 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001308
Anders Carlsson15348ae2011-02-28 02:27:16 +00001309 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001310
Anders Carlsson15348ae2011-02-28 02:27:16 +00001311 // Exception tables and cleanups can be enabled with -fexceptions even if the
1312 // language itself doesn't support exceptions.
1313 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1314 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001315
Daniel Dunbard47ea692011-03-17 23:28:31 +00001316 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1317 // is not necessarily sensible, but follows GCC.
1318 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001319 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001320 options::OPT_fno_objc_exceptions,
1321 true)) {
1322 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001323
Eric Christopher88b7cf02011-08-19 00:30:14 +00001324 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001325 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001326 }
1327
1328 if (types::isCXX(InputType)) {
1329 bool CXXExceptionsEnabled = ExceptionsEnabled;
1330
Eric Christopher88b7cf02011-08-19 00:30:14 +00001331 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1332 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001333 options::OPT_fexceptions,
1334 options::OPT_fno_exceptions)) {
1335 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1336 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001337 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001338 CXXExceptionsEnabled = false;
1339 }
1340
1341 if (CXXExceptionsEnabled) {
1342 CmdArgs.push_back("-fcxx-exceptions");
1343
1344 ShouldUseExceptionTables = true;
1345 }
1346 }
1347
1348 if (ShouldUseExceptionTables)
1349 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001350}
1351
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001352static bool ShouldDisableCFI(const ArgList &Args,
1353 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001354 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001355 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001356 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001357 // we disable them if we think the .s file will be passed to it.
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001358 Default = Args.hasFlag(options::OPT_integrated_as,
1359 options::OPT_no_integrated_as,
1360 TC.IsIntegratedAssemblerDefault());
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001361 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001362 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1363 options::OPT_fno_dwarf2_cfi_asm,
1364 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001365}
1366
Nick Lewyckyea523d72011-10-17 23:05:52 +00001367static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1368 const ToolChain &TC) {
1369 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1370 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1371 options::OPT_no_integrated_as,
1372 IsIADefault);
1373 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1374 options::OPT_fno_dwarf_directory_asm,
1375 UseIntegratedAs);
1376 return !UseDwarfDirectory;
1377}
1378
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001379/// \brief Check whether the given input tree contains any compilation actions.
1380static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001381 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001382 return true;
1383
1384 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1385 if (ContainsCompileAction(*it))
1386 return true;
1387
1388 return false;
1389}
1390
1391/// \brief Check if -relax-all should be passed to the internal assembler.
1392/// This is done by default when compiling non-assembler source with -O0.
1393static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1394 bool RelaxDefault = true;
1395
1396 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1397 RelaxDefault = A->getOption().matches(options::OPT_O0);
1398
1399 if (RelaxDefault) {
1400 RelaxDefault = false;
1401 for (ActionList::const_iterator it = C.getActions().begin(),
1402 ie = C.getActions().end(); it != ie; ++it) {
1403 if (ContainsCompileAction(*it)) {
1404 RelaxDefault = true;
1405 break;
1406 }
1407 }
1408 }
1409
1410 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1411 RelaxDefault);
1412}
1413
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001414/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1415/// This needs to be called before we add the C run-time (malloc, etc).
1416static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001417 ArgStringList &CmdArgs) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001418 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001419 options::OPT_fno_address_sanitizer, false))
1420 return;
Logan Chien94a71422012-09-02 09:30:11 +00001421 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001422 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanov83738622012-06-04 11:15:05 +00001423 if (!Args.hasArg(options::OPT_pie))
1424 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001425 }
Daniel Dunbar8cd0d252011-12-07 23:22:17 +00001426
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001427 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1428 llvm::sys::path::append(LibAsan, "lib", "linux",
1429 (Twine("libclang_rt.asan-") +
1430 TC.getArchName() + "-android.so"));
1431 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001432 } else {
1433 if (!Args.hasArg(options::OPT_shared)) {
1434 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1435 // resource directory.
1436 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1437 llvm::sys::path::append(LibAsan, "lib", "linux",
1438 (Twine("libclang_rt.asan-") +
1439 TC.getArchName() + ".a"));
1440 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1441 CmdArgs.push_back("-lpthread");
1442 CmdArgs.push_back("-ldl");
1443 CmdArgs.push_back("-export-dynamic");
1444 }
1445 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001446}
1447
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001448/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1449/// This needs to be called before we add the C run-time (malloc, etc).
1450static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1451 ArgStringList &CmdArgs) {
1452 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1453 options::OPT_fno_thread_sanitizer, false))
1454 return;
1455 if (!Args.hasArg(options::OPT_shared)) {
1456 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1457 // resource directory.
1458 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1459 llvm::sys::path::append(LibTsan, "lib", "linux",
1460 (Twine("libclang_rt.tsan-") +
1461 TC.getArchName() + ".a"));
1462 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1463 CmdArgs.push_back("-lpthread");
1464 CmdArgs.push_back("-ldl");
1465 CmdArgs.push_back("-export-dynamic");
1466 }
1467}
1468
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001469static bool shouldUseFramePointer(const ArgList &Args,
1470 const llvm::Triple &Triple) {
1471 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1472 options::OPT_fomit_frame_pointer))
1473 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1474
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001475 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001476 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1477 Triple.getArch() == llvm::Triple::x86) &&
1478 Triple.getOS() == llvm::Triple::Linux) {
1479 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1480 if (!A->getOption().matches(options::OPT_O0))
1481 return false;
1482 }
1483
1484 return true;
1485}
1486
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001487void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001488 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001489 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001490 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001491 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001492 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1493 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001494 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001495 ArgStringList CmdArgs;
1496
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001497 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1498
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001499 // Invoke ourselves in -cc1 mode.
1500 //
1501 // FIXME: Implement custom jobs for internal actions.
1502 CmdArgs.push_back("-cc1");
1503
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001504 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001505 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001506 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001507 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001508
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001509 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001510 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001511
Daniel Dunbar1d460332009-03-18 10:01:51 +00001512 if (isa<AnalyzeJobAction>(JA)) {
1513 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1514 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001515 } else if (isa<MigrateJobAction>(JA)) {
1516 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001517 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001518 if (Output.getType() == types::TY_Dependencies)
1519 CmdArgs.push_back("-Eonly");
1520 else
1521 CmdArgs.push_back("-E");
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001522 } else if (isa<AssembleJobAction>(JA)) {
1523 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001524
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001525 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001526 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001527
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001528 // When using an integrated assembler, translate -Wa, and -Xassembler
1529 // options.
1530 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1531 options::OPT_Xassembler),
1532 ie = Args.filtered_end(); it != ie; ++it) {
1533 const Arg *A = *it;
1534 A->claim();
1535
1536 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001537 StringRef Value = A->getValue(Args, i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001538
1539 if (Value == "-force_cpusubtype_ALL") {
1540 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001541 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001542 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001543 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001544 CmdArgs.push_back("-mllvm");
1545 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001546 } else if (Value == "--noexecstack") {
1547 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001548 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001549 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001550 << A->getOption().getName() << Value;
1551 }
1552 }
1553 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001554
1555 // Also ignore explicit -force_cpusubtype_ALL option.
1556 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001557 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001558 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001559 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001560
Aaron Ballman761322b2012-07-31 01:21:00 +00001561 if (JA.getType() == types::TY_Nothing)
1562 CmdArgs.push_back("-fsyntax-only");
1563 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001564 CmdArgs.push_back("-emit-pch");
1565 else
1566 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001567 } else {
1568 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001569
Daniel Dunbar1d460332009-03-18 10:01:51 +00001570 if (JA.getType() == types::TY_Nothing) {
1571 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001572 } else if (JA.getType() == types::TY_LLVM_IR ||
1573 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001574 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001575 } else if (JA.getType() == types::TY_LLVM_BC ||
1576 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001577 CmdArgs.push_back("-emit-llvm-bc");
1578 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001579 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001580 } else if (JA.getType() == types::TY_AST) {
1581 CmdArgs.push_back("-emit-pch");
Daniel Dunbar64952502010-02-11 03:16:21 +00001582 } else if (JA.getType() == types::TY_RewrittenObjC) {
1583 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001584 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001585 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1586 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001587 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001588 } else {
1589 assert(JA.getType() == types::TY_PP_Asm &&
1590 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001591 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001592 }
1593
Daniel Dunbar1d460332009-03-18 10:01:51 +00001594 // The make clang go fast button.
1595 CmdArgs.push_back("-disable-free");
1596
John McCallb689afb2010-02-13 03:50:24 +00001597 // Disable the verification pass in -asserts builds.
1598#ifdef NDEBUG
1599 CmdArgs.push_back("-disable-llvm-verifier");
1600#endif
1601
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001602 // Set the main file name, so that debug info works even with
1603 // -save-temps.
1604 CmdArgs.push_back("-main-file-name");
1605 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1606
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001607 // Some flags which affect the language (via preprocessor
1608 // defines). See darwin::CC1::AddCPPArgs.
1609 if (Args.hasArg(options::OPT_static))
1610 CmdArgs.push_back("-static-define");
1611
Daniel Dunbar1d460332009-03-18 10:01:51 +00001612 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001613 // Enable region store model by default.
1614 CmdArgs.push_back("-analyzer-store=region");
1615
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001616 // Treat blocks as analysis entry points.
1617 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1618
Ted Kremenek51885072011-03-24 00:28:47 +00001619 CmdArgs.push_back("-analyzer-eagerly-assume");
1620
Daniel Dunbar1d460332009-03-18 10:01:51 +00001621 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001622 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001623 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001624
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001625 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1626 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001627
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001628 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001629 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001630
1631 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001632
1633 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00001634 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1635 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1636 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1637 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1638 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1639 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001640 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001641
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001642 // Set the output format. The default is plist, for (lame) historical
1643 // reasons.
1644 CmdArgs.push_back("-analyzer-output");
1645 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1646 CmdArgs.push_back(A->getValue(Args));
1647 else
1648 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001649
Ted Kremenek0647a7b2010-03-22 22:32:05 +00001650 // Disable the presentation of standard compiler warnings when
1651 // using --analyze. We only want to show static analyzer diagnostics
1652 // or frontend errors.
1653 CmdArgs.push_back("-w");
1654
Daniel Dunbar1d460332009-03-18 10:01:51 +00001655 // Add -Xanalyzer arguments when running as analyzer.
1656 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00001657 }
1658
Daniel Dunbare2fd6642009-09-10 01:21:12 +00001659 CheckCodeGenerationOptions(D, Args);
1660
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001661 // Perform argument translation for LLVM backend. This
1662 // takes some care in reconciling with llvm-gcc. The
1663 // issue is that llvm-gcc translates these options based on
1664 // the values in cc1, whereas we are processing based on
1665 // the driver arguments.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001666
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001667 // This comes from the default translation the driver + cc1
1668 // would do to enable flag_pic.
Simon Atanasyan003ab662012-05-29 18:50:33 +00001669
1670 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1671 options::OPT_fpic, options::OPT_fno_pic,
1672 options::OPT_fPIE, options::OPT_fno_PIE,
1673 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001674 bool PICDisabled = false;
1675 bool PICEnabled = false;
1676 bool PICForPIE = false;
1677 if (LastPICArg) {
1678 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1679 LastPICArg->getOption().matches(options::OPT_fpie));
1680 PICEnabled = (PICForPIE ||
1681 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1682 LastPICArg->getOption().matches(options::OPT_fpic));
1683 PICDisabled = !PICEnabled;
1684 }
1685 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1686 // PIC or PIE options above, if these show up, PIC is disabled.
Bob Wilsonf2f3ce52012-09-29 23:52:58 +00001687 llvm::Triple Triple(TripleStr);
1688 if ((Args.hasArg(options::OPT_mkernel) ||
1689 Args.hasArg(options::OPT_fapple_kext)) &&
1690 (Triple.getOS() != llvm::Triple::IOS ||
1691 Triple.isOSVersionLT(6)))
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001692 PICDisabled = true;
1693 if (Args.hasArg(options::OPT_static))
1694 PICDisabled = true;
1695 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1696
1697 // Select the relocation model.
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001698 const char *Model = getToolChain().GetForcedPicModel();
1699 if (!Model) {
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001700 if (DynamicNoPIC)
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001701 Model = "dynamic-no-pic";
1702 else if (PICDisabled)
1703 Model = "static";
1704 else if (PICEnabled)
1705 Model = "pic";
Daniel Dunbar1d460332009-03-18 10:01:51 +00001706 else
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001707 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbar1d460332009-03-18 10:01:51 +00001708 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001709 StringRef ModelStr = Model ? Model : "";
1710 if (Model && ModelStr != "pic") {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001711 CmdArgs.push_back("-mrelocation-model");
1712 CmdArgs.push_back(Model);
1713 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001714
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001715 // Infer the __PIC__ and __PIE__ values.
1716 if (ModelStr == "pic" && PICForPIE) {
1717 CmdArgs.push_back("-pie-level");
1718 CmdArgs.push_back((LastPICArg &&
1719 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1720 "2" : "1");
1721 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar76743522009-11-29 02:39:08 +00001722 CmdArgs.push_back("-pic-level");
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001723 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1724 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1725 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001726 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001727
Tanya Lattner59876c22009-11-04 01:18:09 +00001728 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1729 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00001730 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001731
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001732 // LLVM Code Generator Options.
1733
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001734 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1735 CmdArgs.push_back("-mregparm");
1736 CmdArgs.push_back(A->getValue(Args));
1737 }
1738
Roman Divackycfe9af22011-03-01 17:40:53 +00001739 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1740 CmdArgs.push_back("-mrtd");
1741
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001742 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001743 CmdArgs.push_back("-mdisable-fp-elim");
1744 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1745 options::OPT_fno_zero_initialized_in_bss))
1746 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar398c6102011-02-04 02:20:39 +00001747 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1748 options::OPT_fno_strict_aliasing,
1749 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00001750 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00001751 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1752 false))
1753 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00001754 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1755 options::OPT_fno_optimize_sibling_calls))
1756 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001757
Chandler Carruthabf07a72012-01-02 14:19:45 +00001758 // Handle various floating point optimization flags, mapping them to the
1759 // appropriate LLVM code generation flags. The pattern for all of these is to
1760 // default off the codegen optimizations, and if any flag enables them and no
1761 // flag disables them after the flag enabling them, enable the codegen
1762 // optimization. This is complicated by several "umbrella" flags.
1763 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001764 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001765 options::OPT_ffinite_math_only,
1766 options::OPT_fno_finite_math_only,
1767 options::OPT_fhonor_infinities,
1768 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001769 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1770 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001771 A->getOption().getID() != options::OPT_fhonor_infinities)
1772 CmdArgs.push_back("-menable-no-infs");
1773 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001774 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001775 options::OPT_ffinite_math_only,
1776 options::OPT_fno_finite_math_only,
1777 options::OPT_fhonor_nans,
1778 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001779 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1780 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001781 A->getOption().getID() != options::OPT_fhonor_nans)
1782 CmdArgs.push_back("-menable-no-nans");
1783
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00001784 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1785 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruthabf07a72012-01-02 14:19:45 +00001786 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001787 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001788 options::OPT_fmath_errno,
Chandler Carruth4f50c502012-04-26 02:10:51 +00001789 options::OPT_fno_math_errno))
1790 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1791 if (MathErrno)
1792 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001793
1794 // There are several flags which require disabling very specific
1795 // optimizations. Any of these being disabled forces us to turn off the
1796 // entire set of LLVM optimizations, so collect them through all the flag
1797 // madness.
1798 bool AssociativeMath = false;
1799 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001800 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001801 options::OPT_funsafe_math_optimizations,
1802 options::OPT_fno_unsafe_math_optimizations,
1803 options::OPT_fassociative_math,
1804 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001805 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1806 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001807 A->getOption().getID() != options::OPT_fno_associative_math)
1808 AssociativeMath = true;
1809 bool ReciprocalMath = false;
1810 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001811 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001812 options::OPT_funsafe_math_optimizations,
1813 options::OPT_fno_unsafe_math_optimizations,
1814 options::OPT_freciprocal_math,
1815 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001816 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1817 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001818 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1819 ReciprocalMath = true;
1820 bool SignedZeros = true;
1821 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001822 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001823 options::OPT_funsafe_math_optimizations,
1824 options::OPT_fno_unsafe_math_optimizations,
1825 options::OPT_fsigned_zeros,
1826 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001827 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1828 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001829 A->getOption().getID() != options::OPT_fsigned_zeros)
1830 SignedZeros = false;
1831 bool TrappingMath = true;
1832 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001833 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001834 options::OPT_funsafe_math_optimizations,
1835 options::OPT_fno_unsafe_math_optimizations,
1836 options::OPT_ftrapping_math,
1837 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001838 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1839 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001840 A->getOption().getID() != options::OPT_ftrapping_math)
1841 TrappingMath = false;
1842 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1843 !TrappingMath)
1844 CmdArgs.push_back("-menable-unsafe-fp-math");
1845
Lang Hamesc9686712012-07-06 00:59:19 +00001846
1847 // Validate and pass through -fp-contract option.
1848 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001849 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00001850 options::OPT_ffp_contract)) {
1851 if (A->getOption().getID() == options::OPT_ffp_contract) {
1852 StringRef Val = A->getValue(Args);
1853 if (Val == "fast" || Val == "on" || Val == "off") {
1854 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1855 } else {
1856 D.Diag(diag::err_drv_unsupported_option_argument)
1857 << A->getOption().getName() << Val;
1858 }
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001859 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesc9686712012-07-06 00:59:19 +00001860 // If fast-math is set then set the fp-contract mode to fast.
1861 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1862 }
1863 }
1864
Bob Wilson455e72e2012-07-19 03:52:53 +00001865 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1866 // and if we find them, tell the frontend to provide the appropriate
1867 // preprocessor macros. This is distinct from enabling any optimizations as
1868 // these options induce language changes which must survive serialization
1869 // and deserialization, etc.
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001870 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1871 if (A->getOption().matches(options::OPT_ffast_math))
1872 CmdArgs.push_back("-ffast-math");
1873 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1874 if (A->getOption().matches(options::OPT_ffinite_math_only))
1875 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001876
Daniel Dunbar1b718482010-05-14 22:00:22 +00001877 // Decide whether to use verbose asm. Verbose assembly is the default on
1878 // toolchains which have the integrated assembler on by default.
1879 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1880 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00001881 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00001882 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001883 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001884
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001885 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1886 CmdArgs.push_back("-mdebug-pass");
1887 CmdArgs.push_back("Structure");
1888 }
1889 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1890 CmdArgs.push_back("-mdebug-pass");
1891 CmdArgs.push_back("Arguments");
1892 }
1893
John McCalld0c2ec42010-02-19 02:45:38 +00001894 // Enable -mconstructor-aliases except on darwin, where we have to
1895 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00001896 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00001897 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00001898
John McCall32096692011-03-18 02:56:14 +00001899 // Darwin's kernel doesn't support guard variables; just die if we
1900 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00001901 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00001902 CmdArgs.push_back("-fforbid-guard-variables");
1903
Douglas Gregor6f755502011-02-01 15:15:22 +00001904 if (Args.hasArg(options::OPT_mms_bitfields)) {
1905 CmdArgs.push_back("-mms-bitfields");
1906 }
John McCalld0c2ec42010-02-19 02:45:38 +00001907
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001908 // This is a coarse approximation of what llvm-gcc actually does, both
1909 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1910 // complicated ways.
1911 bool AsynchronousUnwindTables =
1912 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1913 options::OPT_fno_asynchronous_unwind_tables,
1914 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001915 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001916 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1917 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001918 CmdArgs.push_back("-munwind-tables");
1919
Rafael Espindola8af669f2012-06-19 01:26:10 +00001920 getToolChain().addClangTargetOptions(CmdArgs);
1921
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001922 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1923 CmdArgs.push_back("-mlimit-float-precision");
1924 CmdArgs.push_back(A->getValue(Args));
1925 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001926
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001927 // FIXME: Handle -mtune=.
1928 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001929
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001930 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001931 CmdArgs.push_back("-mcode-model");
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001932 CmdArgs.push_back(A->getValue(Args));
1933 }
1934
Daniel Dunbar6acda162009-09-09 22:33:08 +00001935 // Add target specific cpu and features flags.
1936 switch(getToolChain().getTriple().getArch()) {
1937 default:
1938 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001939
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001940 case llvm::Triple::arm:
1941 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00001942 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001943 break;
1944
Eric Christophered734732010-03-02 02:41:08 +00001945 case llvm::Triple::mips:
1946 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00001947 case llvm::Triple::mips64:
1948 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00001949 AddMIPSTargetArgs(Args, CmdArgs);
1950 break;
1951
Hal Finkel02a84272012-06-11 22:35:19 +00001952 case llvm::Triple::ppc:
1953 case llvm::Triple::ppc64:
1954 AddPPCTargetArgs(Args, CmdArgs);
1955 break;
1956
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001957 case llvm::Triple::sparc:
1958 AddSparcTargetArgs(Args, CmdArgs);
1959 break;
1960
Daniel Dunbar6acda162009-09-09 22:33:08 +00001961 case llvm::Triple::x86:
1962 case llvm::Triple::x86_64:
1963 AddX86TargetArgs(Args, CmdArgs);
1964 break;
Tony Linthicum96319392011-12-12 21:14:55 +00001965
1966 case llvm::Triple::hexagon:
1967 AddHexagonTargetArgs(Args, CmdArgs);
1968 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001969 }
1970
Tony Linthicum96319392011-12-12 21:14:55 +00001971
1972
Daniel Dunbarc176bc62010-08-11 23:07:47 +00001973 // Pass the linker version in use.
1974 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1975 CmdArgs.push_back("-target-linker-version");
1976 CmdArgs.push_back(A->getValue(Args));
1977 }
1978
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001979 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbar1ad66482010-07-01 01:31:45 +00001980 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001981 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson905c45f2011-10-14 05:03:44 +00001982 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00001983 CmdArgs.push_back("-momit-leaf-frame-pointer");
1984
Daniel Dunbarb30575c2010-05-12 18:19:58 +00001985 // Explicitly error on some things we know we don't support and can't just
1986 // ignore.
1987 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00001988 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1989 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00001990 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00001991 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00001992 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00001993 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1994 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00001995 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00001996 << Unsupported->getOption().getName();
1997 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00001998 }
1999
Daniel Dunbar1d460332009-03-18 10:01:51 +00002000 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002001 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002002 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002003 CmdArgs.push_back("-header-include-file");
2004 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2005 D.CCPrintHeadersFilename : "-");
2006 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002007 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002008 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002009
Chad Rosier2b819102011-08-02 17:58:04 +00002010 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002011 CmdArgs.push_back("-diagnostic-log-file");
2012 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2013 D.CCLogDiagnosticsFilename : "-");
2014 }
2015
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002016 // Use the last option from "-g" group. "-gline-tables-only" is
2017 // preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002018 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002019 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2020 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2021 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002022 } else if (!A->getOption().matches(options::OPT_g0) &&
2023 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00002024 CmdArgs.push_back("-g");
Chad Rosier2875bda2011-11-04 19:28:44 +00002025 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002026 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002027
Alexey Samsonov7f326072012-06-21 08:22:39 +00002028 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2029 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2030
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002031 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2032 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2033
Chris Lattner7255a2d2010-06-22 00:03:40 +00002034 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2035
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002036 if (Args.hasArg(options::OPT_ftest_coverage) ||
2037 Args.hasArg(options::OPT_coverage))
2038 CmdArgs.push_back("-femit-coverage-notes");
2039 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2040 Args.hasArg(options::OPT_coverage))
2041 CmdArgs.push_back("-femit-coverage-data");
2042
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002043 if (C.getArgs().hasArg(options::OPT_c) ||
2044 C.getArgs().hasArg(options::OPT_S)) {
2045 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002046 CmdArgs.push_back("-coverage-file");
Bill Wendlingecbbea42012-08-30 00:43:41 +00002047 SmallString<128> absFilename(Output.getFilename());
2048 llvm::sys::fs::make_absolute(absFilename);
2049 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002050 }
2051 }
2052
Daniel Dunbara268fc02011-10-11 18:20:10 +00002053 // Pass options for controlling the default header search paths.
2054 if (Args.hasArg(options::OPT_nostdinc)) {
2055 CmdArgs.push_back("-nostdsysteminc");
2056 CmdArgs.push_back("-nobuiltininc");
2057 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002058 if (Args.hasArg(options::OPT_nostdlibinc))
2059 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002060 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2061 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2062 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002063
Daniel Dunbar5f122322009-12-15 01:02:52 +00002064 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002065 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002066 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002067
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002068 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2069
Ted Kremenek30660a82012-03-06 20:06:33 +00002070 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002071 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002072 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002073 options::OPT_ccc_arcmt_modify,
2074 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002075 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002076 switch (A->getOption().getID()) {
2077 default:
2078 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002079 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002080 CmdArgs.push_back("-arcmt-check");
2081 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002082 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002083 CmdArgs.push_back("-arcmt-modify");
2084 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002085 case options::OPT_ccc_arcmt_migrate:
2086 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002087 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002088 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002089
2090 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2091 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002092 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002093 }
2094 }
2095 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002096
Ted Kremenek30660a82012-03-06 20:06:33 +00002097 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2098 if (ARCMTEnabled) {
2099 D.Diag(diag::err_drv_argument_not_allowed_with)
2100 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2101 }
2102 CmdArgs.push_back("-mt-migrate-directory");
2103 CmdArgs.push_back(A->getValue(Args));
2104
2105 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2106 options::OPT_objcmt_migrate_subscripting)) {
2107 // None specified, means enable them all.
2108 CmdArgs.push_back("-objcmt-migrate-literals");
2109 CmdArgs.push_back("-objcmt-migrate-subscripting");
2110 } else {
2111 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2112 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2113 }
2114 }
2115
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002116 // Add preprocessing options like -I, -D, etc. if we are using the
2117 // preprocessor.
2118 //
2119 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002120 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne54db68b2011-11-06 00:40:05 +00002121 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002122
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002123 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2124 // that "The compiler can only warn and ignore the option if not recognized".
2125 // When building with ccache, it will pass -D options to clang even on
2126 // preprocessed inputs and configure concludes that -fPIC is not supported.
2127 Args.ClaimAllArgs(options::OPT_D);
2128
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002129 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002130 // others.
2131 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002132 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002133 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002134 else if (A->getOption().matches(options::OPT_O) &&
2135 A->getValue(Args)[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002136 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002137 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002138 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002139 }
2140
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002141 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002142 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2143 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002144 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002145 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002146
2147 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2148 // (-ansi is equivalent to -std=c89).
2149 //
2150 // If a std is supplied, only add -trigraphs if it follows the
2151 // option.
2152 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2153 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002154 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002155 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002156 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002157 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002158 else
2159 Std->render(Args, CmdArgs);
2160
Daniel Dunbar0e100312010-06-14 21:23:08 +00002161 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2162 options::OPT_trigraphs))
2163 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002164 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002165 } else {
2166 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002167 //
2168 // FIXME: Clang doesn't correctly handle -std= when the input language
2169 // doesn't match. For the time being just ignore this for C++ inputs;
2170 // eventually we want to do all the standard defaulting here instead of
2171 // splitting it between the driver and clang -cc1.
2172 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002173 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2174 "-std=", /*Joined=*/true);
2175 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2176 CmdArgs.push_back("-std=c++11");
2177
Daniel Dunbard573d262009-04-07 22:13:21 +00002178 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002179 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002180
Chandler Carruth50465d12011-04-23 06:30:43 +00002181 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2182 // '-fconst-strings'; this better indicates its actual behavior.
2183 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2184 false)) {
2185 // For perfect compatibility with GCC, we do this even in the presence of
2186 // '-w'. This flag names something other than a warning for GCC.
2187 CmdArgs.push_back("-fconst-strings");
2188 }
2189
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002190 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002191 // during C++ compilation, which it is by default. GCC keeps this define even
2192 // in the presence of '-w', match this behavior bug-for-bug.
2193 if (types::isCXX(InputType) &&
2194 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2195 true)) {
2196 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002197 }
2198
Chandler Carruthc304ba32010-05-22 02:21:53 +00002199 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2200 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2201 if (Asm->getOption().matches(options::OPT_fasm))
2202 CmdArgs.push_back("-fgnu-keywords");
2203 else
2204 CmdArgs.push_back("-fno-gnu-keywords");
2205 }
2206
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002207 if (ShouldDisableCFI(Args, getToolChain()))
2208 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002209
Nick Lewyckyea523d72011-10-17 23:05:52 +00002210 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2211 CmdArgs.push_back("-fno-dwarf-directory-asm");
2212
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002213 if (const char *pwd = ::getenv("PWD")) {
2214 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2215 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumi813a4072011-10-22 10:25:25 +00002216 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002217 std::string CompDir = pwd;
2218 CmdArgs.push_back("-fdebug-compilation-dir");
2219 CmdArgs.push_back(Args.MakeArgString(CompDir));
2220 }
2221 }
2222
Richard Smithc18c4232011-11-21 19:36:32 +00002223 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2224 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002225 CmdArgs.push_back("-ftemplate-depth");
2226 CmdArgs.push_back(A->getValue(Args));
2227 }
2228
Richard Smithc18c4232011-11-21 19:36:32 +00002229 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2230 CmdArgs.push_back("-fconstexpr-depth");
2231 CmdArgs.push_back(A->getValue(Args));
2232 }
2233
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002234 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2235 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002236 if (A->getNumValues()) {
2237 StringRef bytes = A->getValue(Args);
2238 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2239 } else
2240 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002241 }
2242
Nuno Lopesb3198a82012-05-08 22:10:46 +00002243 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2244 options::OPT_fbounds_checking_EQ)) {
2245 if (A->getNumValues()) {
2246 StringRef val = A->getValue(Args);
2247 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2248 } else
2249 CmdArgs.push_back("-fbounds-checking=1");
2250 }
2251
Daniel Dunbare4bdae72009-11-19 04:00:53 +00002252 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002253 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002254
Daniel Dunbar294691e2009-11-04 06:24:38 +00002255 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2256 CmdArgs.push_back("-fconstant-string-class");
2257 CmdArgs.push_back(A->getValue(Args));
2258 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002259
Chris Lattner124fca52010-01-09 21:54:33 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2261 CmdArgs.push_back("-ftabstop");
2262 CmdArgs.push_back(A->getValue(Args));
2263 }
2264
Chris Lattner0f0c9632010-04-07 20:49:23 +00002265 CmdArgs.push_back("-ferror-limit");
2266 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2267 CmdArgs.push_back(A->getValue(Args));
2268 else
2269 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002270
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002271 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2272 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregor6c1cb992010-05-04 17:13:42 +00002273 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002274 }
2275
2276 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2277 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregor575cf372010-04-20 07:18:24 +00002278 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002279 }
2280
Richard Smith08d6e032011-12-16 19:06:07 +00002281 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2282 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2283 CmdArgs.push_back(A->getValue(Args));
2284 }
2285
Daniel Dunbar55efe142009-11-04 06:24:47 +00002286 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002287 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002288 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbara28690e2009-11-30 08:40:54 +00002289 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002290 } else {
2291 // If -fmessage-length=N was not specified, determine whether this is a
2292 // terminal and, if so, implicitly define -fmessage-length appropriately.
2293 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002294 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002295 }
2296
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002297 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2298 CmdArgs.push_back("-fvisibility");
2299 CmdArgs.push_back(A->getValue(Args));
2300 }
2301
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002302 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002303
Hans Wennborgde981f32012-06-28 08:01:44 +00002304 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2305
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002306 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002307 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2308 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002309 CmdArgs.push_back("-ffreestanding");
2310
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002311 // Forward -f (flag) options which we can pass directly.
Mike Stump9c276ae2009-12-12 01:27:46 +00002312 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002313 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002314 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002315 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002316 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002317 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002318 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002319 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2320 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002321
2322 // Report and error for -faltivec on anything other then PowerPC.
2323 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2324 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2325 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2326 D.Diag(diag::err_drv_argument_only_allowed_with)
2327 << A->getAsString(Args) << "ppc/ppc64";
2328
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002329 if (getToolChain().SupportsProfiling())
2330 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002331
Kostya Serebryany1b4eca62011-11-16 17:34:26 +00002332 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2333 options::OPT_fno_address_sanitizer, false))
2334 CmdArgs.push_back("-faddress-sanitizer");
2335
Kostya Serebryany3c931222012-03-01 22:27:08 +00002336 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2337 options::OPT_fno_thread_sanitizer, false))
2338 CmdArgs.push_back("-fthread-sanitizer");
2339
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002340 // -flax-vector-conversions is default.
2341 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2342 options::OPT_fno_lax_vector_conversions))
2343 CmdArgs.push_back("-fno-lax-vector-conversions");
2344
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002345 if (Args.getLastArg(options::OPT_fapple_kext))
2346 CmdArgs.push_back("-fapple-kext");
2347
David Blaikie940152f2012-06-14 18:55:27 +00002348 if (Args.hasFlag(options::OPT_frewrite_includes,
2349 options::OPT_fno_rewrite_includes, false))
2350 CmdArgs.push_back("-frewrite-includes");
2351
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002352 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002353 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002354 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002355 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2356 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002357
2358 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2359 CmdArgs.push_back("-ftrapv-handler");
2360 CmdArgs.push_back(A->getValue(Args));
2361 }
2362
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002363 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002364
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002365 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2366 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2367 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2368 options::OPT_fno_wrapv)) {
2369 if (A->getOption().matches(options::OPT_fwrapv))
2370 CmdArgs.push_back("-fwrapv");
2371 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2372 options::OPT_fno_strict_overflow)) {
2373 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2374 CmdArgs.push_back("-fwrapv");
2375 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002376 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002377 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002378
Daniel Dunbar5345c392009-09-03 04:54:28 +00002379 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2380
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002381 // -stack-protector=0 is default.
2382 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002383 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2384 options::OPT_fstack_protector_all,
2385 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002386 if (A->getOption().matches(options::OPT_fstack_protector))
2387 StackProtectorLevel = 1;
2388 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2389 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002390 } else {
2391 StackProtectorLevel =
2392 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2393 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002394 if (StackProtectorLevel) {
2395 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002396 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002397 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002398
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002399 // --param ssp-buffer-size=
2400 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2401 ie = Args.filtered_end(); it != ie; ++it) {
2402 StringRef Str((*it)->getValue(Args));
2403 if (Str.startswith("ssp-buffer-size=")) {
2404 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002405 CmdArgs.push_back("-stack-protector-buffer-size");
2406 // FIXME: Verify the argument is a valid integer.
2407 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002408 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002409 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002410 }
Bill Wendling45483f72009-06-28 07:36:13 +00002411 }
2412
Nick Lewycky4e785c92011-12-06 03:33:03 +00002413 // Translate -mstackrealign
2414 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2415 false)) {
2416 CmdArgs.push_back("-backend-option");
2417 CmdArgs.push_back("-force-align-stack");
2418 }
2419 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2420 false)) {
2421 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2422 }
2423
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002424 if (Args.hasArg(options::OPT_mstack_alignment)) {
2425 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2426 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002427 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002428
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002429 // Forward -f options with positive and negative forms; we translate
2430 // these by hand.
2431
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002432 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002433 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002434 CmdArgs.push_back("-fapple-kext");
2435 if (!Args.hasArg(options::OPT_fbuiltin))
2436 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002437 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002438 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002439 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002440 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002441 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002442
Nuno Lopesfc284482009-12-16 16:59:22 +00002443 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2444 options::OPT_fno_assume_sane_operator_new))
2445 CmdArgs.push_back("-fno-assume-sane-operator-new");
2446
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002447 // -fblocks=0 is default.
2448 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002449 getToolChain().IsBlocksDefault()) ||
2450 (Args.hasArg(options::OPT_fgnu_runtime) &&
2451 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2452 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002453 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002454
2455 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2456 !getToolChain().hasBlocksRuntime())
2457 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002458 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002459
Douglas Gregor64554ba2012-01-18 15:19:58 +00002460 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2461 // users must also pass -fcxx-modules. The latter flag will disappear once the
2462 // modules implementation is solid for C++/Objective-C++ programs as well.
2463 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2464 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2465 options::OPT_fno_cxx_modules,
2466 false);
2467 if (AllowedInCXX || !types::isCXX(InputType))
2468 CmdArgs.push_back("-fmodules");
2469 }
Douglas Gregor7025d2c2012-01-03 17:13:05 +00002470
John McCall32579cf2010-04-09 19:12:06 +00002471 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00002472 if (Args.hasFlag(options::OPT_fno_access_control,
2473 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00002474 false))
John McCall7002f4c2010-04-09 19:03:51 +00002475 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00002476
Anders Carlssona4c24752010-11-21 00:09:52 +00002477 // -felide-constructors is the default.
2478 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2479 options::OPT_felide_constructors,
2480 false))
2481 CmdArgs.push_back("-fno-elide-constructors");
2482
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002483 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002484 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2485 KernelOrKext)
Daniel Dunbar53e84842009-11-19 04:55:23 +00002486 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00002487
Tony Linthicum96319392011-12-12 21:14:55 +00002488 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002489 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00002490 options::OPT_fno_short_enums,
2491 getToolChain().getTriple().getArch() ==
2492 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002493 CmdArgs.push_back("-fshort-enums");
2494
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002495 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002496 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002497 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00002498 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00002499
Anders Carlssona508b7d2010-02-06 23:23:06 +00002500 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00002501 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00002502 options::OPT_fno_threadsafe_statics))
2503 CmdArgs.push_back("-fno-threadsafe-statics");
2504
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002505 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002506 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2507 options::OPT_fno_use_cxa_atexit,
2508 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00002509 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00002510 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2511 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002512 CmdArgs.push_back("-fno-use-cxa-atexit");
2513
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002514 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002515 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002516 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2517 CmdArgs.push_back("-fms-extensions");
2518
Chad Rosierf925e042012-07-20 21:20:33 +00002519 // -fms-inline-asm.
Chad Rosierd256f862012-07-20 23:12:26 +00002520 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2521 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosierf925e042012-07-20 21:20:33 +00002522
Francois Pichetae556082011-09-17 04:32:15 +00002523 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00002524 if (Args.hasFlag(options::OPT_fms_compatibility,
2525 options::OPT_fno_ms_compatibility,
2526 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2527 Args.hasFlag(options::OPT_fms_extensions,
2528 options::OPT_fno_ms_extensions,
2529 true))))
Francois Pichetae556082011-09-17 04:32:15 +00002530 CmdArgs.push_back("-fms-compatibility");
2531
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002532 // -fmsc-version=1300 is default.
2533 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2534 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2535 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002536 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002537 if (msc_ver.empty())
2538 CmdArgs.push_back("-fmsc-version=1300");
2539 else
2540 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2541 }
2542
2543
Dawn Perchik400b6072010-09-02 23:59:25 +00002544 // -fborland-extensions=0 is default.
2545 if (Args.hasFlag(options::OPT_fborland_extensions,
2546 options::OPT_fno_borland_extensions, false))
2547 CmdArgs.push_back("-fborland-extensions");
2548
Francois Pichet8efcc012011-09-01 16:38:08 +00002549 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2550 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00002551 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2552 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00002553 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00002554 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00002555
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002556 // -fgnu-keywords default varies depending on language; only pass if
2557 // specified.
2558 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00002559 options::OPT_fno_gnu_keywords))
2560 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002561
Rafael Espindola01ba8542011-06-02 17:30:53 +00002562 if (Args.hasFlag(options::OPT_fgnu89_inline,
2563 options::OPT_fno_gnu89_inline,
2564 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00002565 CmdArgs.push_back("-fgnu89-inline");
2566
Chad Rosierfc055f92012-03-15 22:31:42 +00002567 if (Args.hasArg(options::OPT_fno_inline))
2568 CmdArgs.push_back("-fno-inline");
2569
Chad Rosier634a4b12012-03-06 21:17:19 +00002570 if (Args.hasArg(options::OPT_fno_inline_functions))
2571 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00002572
John McCall260611a2012-06-20 06:18:46 +00002573 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00002574
John McCall260611a2012-06-20 06:18:46 +00002575 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2576 // legacy is the default.
2577 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002578 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2579 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00002580 objcRuntime.isLegacyDispatchDefaultForArch(
2581 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002582 if (getToolChain().UseObjCMixedDispatch())
2583 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2584 else
2585 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2586 }
2587 }
2588
Nico Weberdf423542012-03-09 21:19:44 +00002589 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2590 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00002591 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002592 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2593 }
2594
John McCall9f084a32011-07-06 00:26:06 +00002595 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2596 // NOTE: This logic is duplicated in ToolChains.cpp.
2597 bool ARC = isObjCAutoRefCount(Args);
2598 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00002599 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00002600
John McCall9f084a32011-07-06 00:26:06 +00002601 CmdArgs.push_back("-fobjc-arc");
2602
Chandler Carruth7ffa0322011-11-04 07:34:47 +00002603 // FIXME: It seems like this entire block, and several around it should be
2604 // wrapped in isObjC, but for now we just use it here as this is where it
2605 // was being used previously.
2606 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2607 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2608 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2609 else
2610 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2611 }
2612
John McCall9f084a32011-07-06 00:26:06 +00002613 // Allow the user to enable full exceptions code emission.
2614 // We define off for Objective-CC, on for Objective-C++.
2615 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2616 options::OPT_fno_objc_arc_exceptions,
2617 /*default*/ types::isCXX(InputType)))
2618 CmdArgs.push_back("-fobjc-arc-exceptions");
2619 }
2620
2621 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2622 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00002623 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00002624 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002625
John McCall9f084a32011-07-06 00:26:06 +00002626 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2627 // takes precedence.
2628 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2629 if (!GCArg)
2630 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2631 if (GCArg) {
2632 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002633 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00002634 << GCArg->getAsString(Args);
2635 } else if (getToolChain().SupportsObjCGC()) {
2636 GCArg->render(Args, CmdArgs);
2637 } else {
2638 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002639 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00002640 << GCArg->getAsString(Args);
2641 }
2642 }
2643
John McCalld71315c2011-06-22 00:53:57 +00002644 // Add exception args.
2645 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00002646 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00002647
2648 if (getToolChain().UseSjLjExceptions())
2649 CmdArgs.push_back("-fsjlj-exceptions");
2650
2651 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00002652 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2653 options::OPT_fno_assume_sane_operator_new))
2654 CmdArgs.push_back("-fno-assume-sane-operator-new");
2655
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00002656 // -fconstant-cfstrings is default, and may be subject to argument translation
2657 // on Darwin.
2658 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2659 options::OPT_fno_constant_cfstrings) ||
2660 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2661 options::OPT_mno_constant_cfstrings))
2662 CmdArgs.push_back("-fno-constant-cfstrings");
2663
John Thompsona6fda122009-11-05 20:14:16 +00002664 // -fshort-wchar default varies depending on platform; only
2665 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00002666 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2667 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00002668
Daniel Dunbaree848a72009-10-29 02:39:57 +00002669 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2670 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00002671 //
2672 // FIXME: This is gross; that translation should be pulled from the
2673 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002674 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00002675 options::OPT_fno_pascal_strings,
2676 false) ||
2677 Args.hasFlag(options::OPT_mpascal_strings,
2678 options::OPT_mno_pascal_strings,
2679 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002680 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002681
Daniel Dunbar88934e82011-10-05 21:04:55 +00002682 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2683 // -fno-pack-struct doesn't apply to -fpack-struct=.
2684 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00002685 std::string PackStructStr = "-fpack-struct=";
2686 PackStructStr += A->getValue(Args);
2687 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00002688 } else if (Args.hasFlag(options::OPT_fpack_struct,
2689 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00002690 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00002691 }
2692
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002693 if (Args.hasArg(options::OPT_mkernel) ||
2694 Args.hasArg(options::OPT_fapple_kext)) {
2695 if (!Args.hasArg(options::OPT_fcommon))
2696 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00002697 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002698 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00002699
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002700 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002701 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002702 CmdArgs.push_back("-fno-common");
2703
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002704 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002705 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00002706 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002707 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002708 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002709 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2710
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002711 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2712 if (!Args.hasFlag(options::OPT_ffor_scope,
2713 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002714 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002715 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2716
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00002717 // -fcaret-diagnostics is default.
2718 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2719 options::OPT_fno_caret_diagnostics, true))
2720 CmdArgs.push_back("-fno-caret-diagnostics");
2721
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002722 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00002723 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002724 options::OPT_fno_diagnostics_fixit_info))
2725 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002726
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002727 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00002728 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002729 options::OPT_fno_diagnostics_show_option))
2730 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00002731
Chris Lattner6fbe8392010-05-04 21:55:25 +00002732 if (const Arg *A =
2733 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2734 CmdArgs.push_back("-fdiagnostics-show-category");
2735 CmdArgs.push_back(A->getValue(Args));
2736 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002737
Douglas Gregorc9471b02011-05-21 17:07:29 +00002738 if (const Arg *A =
2739 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2740 CmdArgs.push_back("-fdiagnostics-format");
2741 CmdArgs.push_back(A->getValue(Args));
2742 }
2743
Chandler Carruthabaca7a2011-03-27 01:50:55 +00002744 if (Arg *A = Args.getLastArg(
2745 options::OPT_fdiagnostics_show_note_include_stack,
2746 options::OPT_fno_diagnostics_show_note_include_stack)) {
2747 if (A->getOption().matches(
2748 options::OPT_fdiagnostics_show_note_include_stack))
2749 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2750 else
2751 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2752 }
2753
Daniel Dunbar838be482009-11-04 06:24:57 +00002754 // Color diagnostics are the default, unless the terminal doesn't support
2755 // them.
2756 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidisf765d762010-09-23 12:56:06 +00002757 options::OPT_fno_color_diagnostics,
2758 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00002759 CmdArgs.push_back("-fcolor-diagnostics");
2760
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00002761 if (!Args.hasFlag(options::OPT_fshow_source_location,
2762 options::OPT_fno_show_source_location))
2763 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002764
Douglas Gregorc9471b02011-05-21 17:07:29 +00002765 if (!Args.hasFlag(options::OPT_fshow_column,
2766 options::OPT_fno_show_column,
2767 true))
2768 CmdArgs.push_back("-fno-show-column");
2769
Douglas Gregora0068fc2010-07-09 17:35:33 +00002770 if (!Args.hasFlag(options::OPT_fspell_checking,
2771 options::OPT_fno_spell_checking))
2772 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002773
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002774
Daniel Dunbar16894392010-11-02 19:42:04 +00002775 // Silently ignore -fasm-blocks for now.
2776 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2777 false);
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002778
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00002779 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2780 A->render(Args, CmdArgs);
2781
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002782 // -fdollars-in-identifiers default varies depending on platform and
2783 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00002784 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002785 options::OPT_fno_dollars_in_identifiers)) {
2786 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00002787 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002788 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00002789 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002790 }
2791
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002792 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2793 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00002794 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002795 options::OPT_fno_unit_at_a_time)) {
2796 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002797 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002798 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002799
Eli Friedman19bda3a2011-11-02 01:53:16 +00002800 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2801 options::OPT_fno_apple_pragma_pack, false))
2802 CmdArgs.push_back("-fapple-pragma-pack");
2803
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002804 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002805 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002806 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002807#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00002808 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002809 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2810 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2811 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2812 CmdArgs.push_back("-fno-builtin-strcat");
2813 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2814 CmdArgs.push_back("-fno-builtin-strcpy");
2815 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002816#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002817
Daniel Dunbard98750f2011-03-18 21:23:40 +00002818 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00002819 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00002820 options::OPT_traditional_cpp)) {
2821 if (isa<PreprocessJobAction>(JA))
2822 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002823 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00002824 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00002825 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002826
Daniel Dunbar1d460332009-03-18 10:01:51 +00002827 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00002828 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00002829
2830 // Handle serialized diagnostics.
2831 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2832 CmdArgs.push_back("-serialize-diagnostic-file");
2833 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2834 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002835
Ted Kremenek127ff2e2012-09-13 06:41:18 +00002836 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2837 CmdArgs.push_back("-fretain-comments-from-system-headers");
2838
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002839 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2840 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00002841 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002842 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2843 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002844 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00002845
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002846 // We translate this by hand to the -cc1 argument, since nightly test uses
2847 // it and developers have been trained to spell it with -mllvm.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002848 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002849 CmdArgs.push_back("-disable-llvm-optzns");
2850 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002851 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002852 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002853
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002854 if (Output.getType() == types::TY_Dependencies) {
2855 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00002856 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002857 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00002858 CmdArgs.push_back(Output.getFilename());
2859 } else {
2860 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002861 }
2862
Daniel Dunbar1d460332009-03-18 10:01:51 +00002863 for (InputInfoList::const_iterator
2864 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2865 const InputInfo &II = *it;
2866 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00002867 if (Args.hasArg(options::OPT_rewrite_objc))
2868 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2869 else
2870 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00002871 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00002872 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002873 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00002874 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002875 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002876
Chris Lattnere6113de2009-11-03 19:50:27 +00002877 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2878
Daniel Dunbara001c1c2010-07-18 21:16:15 +00002879 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002880
2881 // Optionally embed the -cc1 level arguments into the debug info, for build
2882 // analysis.
2883 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00002884 ArgStringList OriginalArgs;
2885 for (ArgList::const_iterator it = Args.begin(),
2886 ie = Args.end(); it != ie; ++it)
2887 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002888
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00002889 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002890 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00002891 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002892 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00002893 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002894 }
2895 CmdArgs.push_back("-dwarf-debug-flags");
2896 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2897 }
2898
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00002899 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00002900
Roman Divackybe4c8702011-02-10 16:52:03 +00002901 if (Arg *A = Args.getLastArg(options::OPT_pg))
2902 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002903 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00002904 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002905
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002906 // Claim some arguments which clang supports automatically.
2907
Daniel Dunbarf4046862010-04-15 06:18:42 +00002908 // -fpch-preprocess is used with gcc to add a special marker in the output to
2909 // include the PCH file. Clang's PTH solution is completely transparent, so we
2910 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002911 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002912
Daniel Dunbara880db02009-03-23 19:03:36 +00002913 // Claim some arguments which clang doesn't support, but we don't
2914 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00002915 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2916 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002917
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002918 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002919 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002920 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002921}
2922
Jim Grosbachfc308292012-02-10 20:37:10 +00002923void ClangAs::AddARMTargetArgs(const ArgList &Args,
2924 ArgStringList &CmdArgs) const {
2925 const Driver &D = getToolChain().getDriver();
2926 llvm::Triple Triple = getToolChain().getTriple();
2927
2928 // Set the CPU based on -march= and -mcpu=.
2929 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00002930 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00002931
2932 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00002933 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00002934 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00002935
2936 // Honor -mfpmath=.
2937 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00002938 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00002939}
2940
John McCall260611a2012-06-20 06:18:46 +00002941/// Add options related to the Objective-C runtime/ABI.
2942///
2943/// Returns true if the runtime is non-fragile.
2944ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2945 ArgStringList &cmdArgs,
2946 RewriteKind rewriteKind) const {
2947 // Look for the controlling runtime option.
2948 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2949 options::OPT_fgnu_runtime,
2950 options::OPT_fobjc_runtime_EQ);
2951
2952 // Just forward -fobjc-runtime= to the frontend. This supercedes
2953 // options about fragility.
2954 if (runtimeArg &&
2955 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2956 ObjCRuntime runtime;
2957 StringRef value = runtimeArg->getValue(args);
2958 if (runtime.tryParse(value)) {
2959 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2960 << value;
2961 }
2962
2963 runtimeArg->render(args, cmdArgs);
2964 return runtime;
2965 }
2966
2967 // Otherwise, we'll need the ABI "version". Version numbers are
2968 // slightly confusing for historical reasons:
2969 // 1 - Traditional "fragile" ABI
2970 // 2 - Non-fragile ABI, version 1
2971 // 3 - Non-fragile ABI, version 2
2972 unsigned objcABIVersion = 1;
2973 // If -fobjc-abi-version= is present, use that to set the version.
2974 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2975 StringRef value = abiArg->getValue(args);
2976 if (value == "1")
2977 objcABIVersion = 1;
2978 else if (value == "2")
2979 objcABIVersion = 2;
2980 else if (value == "3")
2981 objcABIVersion = 3;
2982 else
2983 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2984 << value;
2985 } else {
2986 // Otherwise, determine if we are using the non-fragile ABI.
2987 bool nonFragileABIIsDefault =
2988 (rewriteKind == RK_NonFragile ||
2989 (rewriteKind == RK_None &&
2990 getToolChain().IsObjCNonFragileABIDefault()));
2991 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2992 options::OPT_fno_objc_nonfragile_abi,
2993 nonFragileABIIsDefault)) {
2994 // Determine the non-fragile ABI version to use.
2995#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2996 unsigned nonFragileABIVersion = 1;
2997#else
2998 unsigned nonFragileABIVersion = 2;
2999#endif
3000
3001 if (Arg *abiArg = args.getLastArg(
3002 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3003 StringRef value = abiArg->getValue(args);
3004 if (value == "1")
3005 nonFragileABIVersion = 1;
3006 else if (value == "2")
3007 nonFragileABIVersion = 2;
3008 else
3009 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3010 << value;
3011 }
3012
3013 objcABIVersion = 1 + nonFragileABIVersion;
3014 } else {
3015 objcABIVersion = 1;
3016 }
3017 }
3018
3019 // We don't actually care about the ABI version other than whether
3020 // it's non-fragile.
3021 bool isNonFragile = objcABIVersion != 1;
3022
3023 // If we have no runtime argument, ask the toolchain for its default runtime.
3024 // However, the rewriter only really supports the Mac runtime, so assume that.
3025 ObjCRuntime runtime;
3026 if (!runtimeArg) {
3027 switch (rewriteKind) {
3028 case RK_None:
3029 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3030 break;
3031 case RK_Fragile:
3032 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3033 break;
3034 case RK_NonFragile:
3035 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3036 break;
3037 }
3038
3039 // -fnext-runtime
3040 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3041 // On Darwin, make this use the default behavior for the toolchain.
3042 if (getToolChain().getTriple().isOSDarwin()) {
3043 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3044
3045 // Otherwise, build for a generic macosx port.
3046 } else {
3047 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3048 }
3049
3050 // -fgnu-runtime
3051 } else {
3052 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003053 // Legacy behaviour is to target the gnustep runtime if we are i
3054 // non-fragile mode or the GCC runtime in fragile mode.
3055 if (isNonFragile)
3056 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3057 else
3058 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003059 }
3060
3061 cmdArgs.push_back(args.MakeArgString(
3062 "-fobjc-runtime=" + runtime.getAsString()));
3063 return runtime;
3064}
3065
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003066void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003067 const InputInfo &Output,
3068 const InputInfoList &Inputs,
3069 const ArgList &Args,
3070 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003071 ArgStringList CmdArgs;
3072
3073 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3074 const InputInfo &Input = Inputs[0];
3075
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003076 // Don't warn about "clang -w -c foo.s"
3077 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003078 // and "clang -emit-llvm -c foo.s"
3079 Args.ClaimAllArgs(options::OPT_emit_llvm);
3080 // and "clang -use-gold-plugin -c foo.s"
3081 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003082
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003083 // Invoke ourselves in -cc1as mode.
3084 //
3085 // FIXME: Implement custom jobs for internal actions.
3086 CmdArgs.push_back("-cc1as");
3087
3088 // Add the "effective" target triple.
3089 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003090 std::string TripleStr =
3091 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003092 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3093
3094 // Set the output mode, we currently only expect to be used as a real
3095 // assembler.
3096 CmdArgs.push_back("-filetype");
3097 CmdArgs.push_back("obj");
3098
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003099 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003100 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003101
Jim Grosbachfc308292012-02-10 20:37:10 +00003102 // Add target specific cpu and features flags.
3103 switch(getToolChain().getTriple().getArch()) {
3104 default:
3105 break;
3106
3107 case llvm::Triple::arm:
3108 case llvm::Triple::thumb:
3109 AddARMTargetArgs(Args, CmdArgs);
3110 break;
3111 }
3112
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003113 // Ignore explicit -force_cpusubtype_ALL option.
3114 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003115
Eric Christopher8f0a4032012-01-10 00:38:01 +00003116 // Determine the original source input.
3117 const Action *SourceAction = &JA;
3118 while (SourceAction->getKind() != Action::InputClass) {
3119 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3120 SourceAction = SourceAction->getInputs()[0];
3121 }
3122
3123 // Forward -g, assuming we are dealing with an actual assembly file.
3124 if (SourceAction->getType() == types::TY_Asm ||
3125 SourceAction->getType() == types::TY_PP_Asm) {
3126 Args.ClaimAllArgs(options::OPT_g_Group);
3127 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3128 if (!A->getOption().matches(options::OPT_g0))
3129 CmdArgs.push_back("-g");
3130 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003131
3132 // Optionally embed the -cc1as level arguments into the debug info, for build
3133 // analysis.
3134 if (getToolChain().UseDwarfDebugFlags()) {
3135 ArgStringList OriginalArgs;
3136 for (ArgList::const_iterator it = Args.begin(),
3137 ie = Args.end(); it != ie; ++it)
3138 (*it)->render(Args, OriginalArgs);
3139
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003140 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003141 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3142 Flags += Exec;
3143 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3144 Flags += " ";
3145 Flags += OriginalArgs[i];
3146 }
3147 CmdArgs.push_back("-dwarf-debug-flags");
3148 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3149 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003150
3151 // FIXME: Add -static support, once we have it.
3152
3153 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3154 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003155 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003156
3157 assert(Output.isFilename() && "Unexpected lipo output.");
3158 CmdArgs.push_back("-o");
3159 CmdArgs.push_back(Output.getFilename());
3160
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003161 assert(Input.isFilename() && "Invalid input.");
3162 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003163
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003164 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003165 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003166}
3167
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003168void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003169 const InputInfo &Output,
3170 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003171 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003172 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003173 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003174 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003175
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003176 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003177 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003178 Arg *A = *it;
Daniel Dunbar75877192009-03-19 07:55:12 +00003179 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003180 // Don't forward any -g arguments to assembly steps.
3181 if (isa<AssembleJobAction>(JA) &&
3182 A->getOption().matches(options::OPT_g_Group))
3183 continue;
3184
Daniel Dunbar75877192009-03-19 07:55:12 +00003185 // It is unfortunate that we have to claim here, as this means
3186 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003187 // platforms using a generic gcc, even if we are just using gcc
3188 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003189 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003190 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003191 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003192 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003193
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003194 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003195
3196 // If using a driver driver, force the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003197 const std::string &Arch = getToolChain().getArchName();
Bob Wilson905c45f2011-10-14 05:03:44 +00003198 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003199 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003200
3201 // FIXME: Remove these special cases.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003202 if (Arch == "powerpc")
3203 CmdArgs.push_back("ppc");
3204 else if (Arch == "powerpc64")
3205 CmdArgs.push_back("ppc64");
3206 else
Daniel Dunbar88137642009-09-09 22:32:48 +00003207 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003208 }
3209
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003210 // Try to force gcc to match the tool chain we want, if we recognize
3211 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003212 //
3213 // FIXME: The triple class should directly provide the information we want
3214 // here.
3215 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003216 CmdArgs.push_back("-m32");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003217 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003218 CmdArgs.push_back("-m64");
3219
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003220 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003221 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003222 CmdArgs.push_back(Output.getFilename());
3223 } else {
3224 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003225 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003226 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003227
Tony Linthicum96319392011-12-12 21:14:55 +00003228 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3229 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003230
3231 // Only pass -x if gcc will understand it; otherwise hope gcc
3232 // understands the suffix correctly. The main use case this would go
3233 // wrong in is for linker inputs if they happened to have an odd
3234 // suffix; really the only way to get this to happen is a command
3235 // like '-x foobar a.c' which will treat a.c like a linker input.
3236 //
3237 // FIXME: For the linker case specifically, can we safely convert
3238 // inputs into '-Wl,' options?
3239 for (InputInfoList::const_iterator
3240 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3241 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003242
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003243 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003244 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3245 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003246 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003247 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003248 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003249 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003250 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003251
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003252 if (types::canTypeBeUserSpecified(II.getType())) {
3253 CmdArgs.push_back("-x");
3254 CmdArgs.push_back(types::getTypeName(II.getType()));
3255 }
3256
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003257 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003258 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003259 else {
3260 const Arg &A = II.getInputArg();
3261
3262 // Reverse translate some rewritten options.
3263 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3264 CmdArgs.push_back("-lstdc++");
3265 continue;
3266 }
3267
Daniel Dunbar115a7922009-03-19 07:29:38 +00003268 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003269 A.render(Args, CmdArgs);
3270 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003271 }
3272
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003273 const std::string customGCCName = D.getCCCGenericGCCName();
3274 const char *GCCName;
3275 if (!customGCCName.empty())
3276 GCCName = customGCCName.c_str();
3277 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003278 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003279 } else
3280 GCCName = "gcc";
3281
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003282 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003283 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003284 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003285}
3286
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003287void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3288 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003289 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003290}
3291
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003292void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3293 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003294 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003295}
3296
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003297void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3298 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003299 const Driver &D = getToolChain().getDriver();
3300
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003301 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003302 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3303 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003304 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00003305 else {
3306 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003307 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003308 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00003309
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003310 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00003311 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003312}
3313
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003314void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3315 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003316 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003317}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003318
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003319void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3320 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003321 // The types are (hopefully) good enough.
3322}
3323
Tony Linthicum96319392011-12-12 21:14:55 +00003324// Hexagon tools start.
3325void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3326 ArgStringList &CmdArgs) const {
3327
3328}
3329void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3330 const InputInfo &Output,
3331 const InputInfoList &Inputs,
3332 const ArgList &Args,
3333 const char *LinkingOutput) const {
3334
3335 const Driver &D = getToolChain().getDriver();
3336 ArgStringList CmdArgs;
3337
3338 std::string MarchString = "-march=";
3339 MarchString += getHexagonTargetCPU(Args);
3340 CmdArgs.push_back(Args.MakeArgString(MarchString));
3341
3342 RenderExtraToolArgs(JA, CmdArgs);
3343
3344 if (Output.isFilename()) {
3345 CmdArgs.push_back("-o");
3346 CmdArgs.push_back(Output.getFilename());
3347 } else {
3348 assert(Output.isNothing() && "Unexpected output");
3349 CmdArgs.push_back("-fsyntax-only");
3350 }
3351
3352
3353 // Only pass -x if gcc will understand it; otherwise hope gcc
3354 // understands the suffix correctly. The main use case this would go
3355 // wrong in is for linker inputs if they happened to have an odd
3356 // suffix; really the only way to get this to happen is a command
3357 // like '-x foobar a.c' which will treat a.c like a linker input.
3358 //
3359 // FIXME: For the linker case specifically, can we safely convert
3360 // inputs into '-Wl,' options?
3361 for (InputInfoList::const_iterator
3362 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3363 const InputInfo &II = *it;
3364
3365 // Don't try to pass LLVM or AST inputs to a generic gcc.
3366 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3367 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3368 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3369 << getToolChain().getTripleString();
3370 else if (II.getType() == types::TY_AST)
3371 D.Diag(clang::diag::err_drv_no_ast_support)
3372 << getToolChain().getTripleString();
3373
3374 if (II.isFilename())
3375 CmdArgs.push_back(II.getFilename());
3376 else
3377 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3378 II.getInputArg().render(Args, CmdArgs);
3379 }
3380
3381 const char *GCCName = "hexagon-as";
3382 const char *Exec =
3383 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3384 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3385
3386}
3387void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3388 ArgStringList &CmdArgs) const {
3389 // The types are (hopefully) good enough.
3390}
3391
3392void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3393 const InputInfo &Output,
3394 const InputInfoList &Inputs,
3395 const ArgList &Args,
3396 const char *LinkingOutput) const {
3397
3398 const Driver &D = getToolChain().getDriver();
3399 ArgStringList CmdArgs;
3400
3401 for (ArgList::const_iterator
3402 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3403 Arg *A = *it;
3404 if (A->getOption().hasForwardToGCC()) {
3405 // Don't forward any -g arguments to assembly steps.
3406 if (isa<AssembleJobAction>(JA) &&
3407 A->getOption().matches(options::OPT_g_Group))
3408 continue;
3409
3410 // It is unfortunate that we have to claim here, as this means
3411 // we will basically never report anything interesting for
3412 // platforms using a generic gcc, even if we are just using gcc
3413 // to get to the assembler.
3414 A->claim();
3415 A->render(Args, CmdArgs);
3416 }
3417 }
3418
3419 RenderExtraToolArgs(JA, CmdArgs);
3420
3421 // Add Arch Information
3422 Arg *A;
Sebastian Pop43115d42012-01-13 20:37:10 +00003423 if ((A = getLastHexagonArchArg(Args))) {
3424 if (A->getOption().matches(options::OPT_m_Joined))
3425 A->render(Args, CmdArgs);
Tony Linthicum96319392011-12-12 21:14:55 +00003426 else
Sebastian Pop43115d42012-01-13 20:37:10 +00003427 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00003428 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003429 else {
3430 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3431 }
3432
Tony Linthicum96319392011-12-12 21:14:55 +00003433 CmdArgs.push_back("-mqdsp6-compat");
3434
3435 const char *GCCName;
3436 if (C.getDriver().CCCIsCXX)
3437 GCCName = "hexagon-g++";
3438 else
3439 GCCName = "hexagon-gcc";
3440 const char *Exec =
3441 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3442
3443 if (Output.isFilename()) {
3444 CmdArgs.push_back("-o");
3445 CmdArgs.push_back(Output.getFilename());
3446 }
3447
3448 for (InputInfoList::const_iterator
3449 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3450 const InputInfo &II = *it;
3451
3452 // Don't try to pass LLVM or AST inputs to a generic gcc.
3453 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3454 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3455 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3456 << getToolChain().getTripleString();
3457 else if (II.getType() == types::TY_AST)
3458 D.Diag(clang::diag::err_drv_no_ast_support)
3459 << getToolChain().getTripleString();
3460
3461 if (II.isFilename())
3462 CmdArgs.push_back(II.getFilename());
3463 else
3464 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3465 II.getInputArg().render(Args, CmdArgs);
3466 }
3467 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3468
3469}
3470// Hexagon tools end.
3471
3472
Daniel Dunbar40f12652009-03-29 17:08:39 +00003473const char *darwin::CC1::getCC1Name(types::ID Type) const {
3474 switch (Type) {
3475 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00003476 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbar40f12652009-03-29 17:08:39 +00003477 case types::TY_Asm:
3478 case types::TY_C: case types::TY_CHeader:
3479 case types::TY_PP_C: case types::TY_PP_CHeader:
3480 return "cc1";
3481 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003482 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3483 case types::TY_PP_ObjCHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003484 return "cc1obj";
3485 case types::TY_CXX: case types::TY_CXXHeader:
3486 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3487 return "cc1plus";
3488 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003489 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3490 case types::TY_PP_ObjCXXHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003491 return "cc1objplus";
3492 }
3493}
3494
David Blaikie99ba9e32011-12-20 02:48:34 +00003495void darwin::CC1::anchor() {}
3496
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003497const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003498 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00003499 return Args.MakeArgString(
3500 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003501}
3502
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003503const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003504 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003505 const char *Str = getBaseInputName(Args, Inputs);
3506
Chris Lattner657ca662011-01-16 08:14:11 +00003507 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00003508 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003509
3510 return Str;
3511}
3512
3513const char *
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003514darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003515 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003516 // FIXME: Think about this more.
3517 std::string Res;
3518
3519 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3520 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003521 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00003522 } else {
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003523 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00003524 }
Daniel Dunbar88137642009-09-09 22:32:48 +00003525 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003526}
3527
Chad Rosier285f9a22011-08-17 18:24:55 +00003528void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher88b7cf02011-08-19 00:30:14 +00003529 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosier285f9a22011-08-17 18:24:55 +00003530 it != ie;) {
Chad Rosier8722a5d2011-08-18 17:56:32 +00003531
3532 StringRef Option = *it;
Chad Rosier80717972011-08-26 18:30:43 +00003533 bool RemoveOption = false;
Chad Rosier04225c12011-08-18 01:18:28 +00003534
Bob Wilson2872c8d2012-02-07 01:17:55 +00003535 // Erase both -fmodule-cache-path and its argument.
3536 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3537 it = CmdArgs.erase(it, it+2);
Chad Rosier80717972011-08-26 18:30:43 +00003538 ie = CmdArgs.end();
Chad Rosier04225c12011-08-18 01:18:28 +00003539 continue;
3540 }
3541
Bob Wilson2872c8d2012-02-07 01:17:55 +00003542 // Remove unsupported -f options.
3543 if (Option.startswith("-f")) {
3544 // Remove -f/-fno- to reduce the number of cases.
3545 if (Option.startswith("-fno-"))
3546 Option = Option.substr(5);
3547 else
3548 Option = Option.substr(2);
3549 RemoveOption = llvm::StringSwitch<bool>(Option)
3550 .Case("altivec", true)
3551 .Case("modules", true)
3552 .Case("diagnostics-show-note-include-stack", true)
3553 .Default(false);
3554 }
3555
Chad Rosier80717972011-08-26 18:30:43 +00003556 // Handle machine specific options.
3557 if (Option.startswith("-m")) {
3558 RemoveOption = llvm::StringSwitch<bool>(Option)
3559 .Case("-mthumb", true)
3560 .Case("-mno-thumb", true)
3561 .Case("-mno-fused-madd", true)
3562 .Case("-mlong-branch", true)
3563 .Case("-mlongcall", true)
3564 .Case("-mcpu=G4", true)
3565 .Case("-mcpu=G5", true)
3566 .Default(false);
3567 }
3568
3569 // Handle warning options.
3570 if (Option.startswith("-W")) {
3571 // Remove -W/-Wno- to reduce the number of cases.
3572 if (Option.startswith("-Wno-"))
3573 Option = Option.substr(5);
3574 else
3575 Option = Option.substr(2);
3576
3577 RemoveOption = llvm::StringSwitch<bool>(Option)
3578 .Case("address-of-temporary", true)
3579 .Case("ambiguous-member-template", true)
3580 .Case("analyzer-incompatible-plugin", true)
3581 .Case("array-bounds", true)
3582 .Case("array-bounds-pointer-arithmetic", true)
3583 .Case("bind-to-temporary-copy", true)
3584 .Case("bitwise-op-parentheses", true)
3585 .Case("bool-conversions", true)
3586 .Case("builtin-macro-redefined", true)
3587 .Case("c++-hex-floats", true)
3588 .Case("c++0x-compat", true)
3589 .Case("c++0x-extensions", true)
3590 .Case("c++0x-narrowing", true)
Richard Smith575fdda2011-10-13 23:32:09 +00003591 .Case("c++11-compat", true)
3592 .Case("c++11-extensions", true)
3593 .Case("c++11-narrowing", true)
Chad Rosier80717972011-08-26 18:30:43 +00003594 .Case("conditional-uninitialized", true)
3595 .Case("constant-conversion", true)
David Blaikie95187bd2012-03-15 04:50:32 +00003596 .Case("conversion-null", true)
Chad Rosier80717972011-08-26 18:30:43 +00003597 .Case("CFString-literal", true)
3598 .Case("constant-logical-operand", true)
3599 .Case("custom-atomic-properties", true)
3600 .Case("default-arg-special-member", true)
3601 .Case("delegating-ctor-cycles", true)
3602 .Case("delete-non-virtual-dtor", true)
3603 .Case("deprecated-implementations", true)
3604 .Case("deprecated-writable-strings", true)
3605 .Case("distributed-object-modifiers", true)
3606 .Case("duplicate-method-arg", true)
3607 .Case("dynamic-class-memaccess", true)
3608 .Case("enum-compare", true)
3609 .Case("exit-time-destructors", true)
3610 .Case("gnu", true)
3611 .Case("gnu-designator", true)
3612 .Case("header-hygiene", true)
3613 .Case("idiomatic-parentheses", true)
3614 .Case("ignored-qualifiers", true)
3615 .Case("implicit-atomic-properties", true)
3616 .Case("incompatible-pointer-types", true)
3617 .Case("incomplete-implementation", true)
3618 .Case("initializer-overrides", true)
3619 .Case("invalid-noreturn", true)
3620 .Case("invalid-token-paste", true)
Ivan Krasin08f35a72011-10-06 02:46:34 +00003621 .Case("language-extension-token", true)
Chad Rosier80717972011-08-26 18:30:43 +00003622 .Case("literal-conversion", true)
3623 .Case("literal-range", true)
3624 .Case("local-type-template-args", true)
3625 .Case("logical-op-parentheses", true)
3626 .Case("method-signatures", true)
3627 .Case("microsoft", true)
3628 .Case("mismatched-tags", true)
3629 .Case("missing-method-return-type", true)
3630 .Case("non-pod-varargs", true)
3631 .Case("nonfragile-abi2", true)
3632 .Case("null-arithmetic", true)
3633 .Case("null-dereference", true)
3634 .Case("out-of-line-declaration", true)
3635 .Case("overriding-method-mismatch", true)
3636 .Case("readonly-setter-attrs", true)
3637 .Case("return-stack-address", true)
3638 .Case("self-assign", true)
3639 .Case("semicolon-before-method-body", true)
3640 .Case("sentinel", true)
3641 .Case("shift-overflow", true)
3642 .Case("shift-sign-overflow", true)
3643 .Case("sign-conversion", true)
3644 .Case("sizeof-array-argument", true)
3645 .Case("sizeof-pointer-memaccess", true)
3646 .Case("string-compare", true)
3647 .Case("super-class-method-mismatch", true)
3648 .Case("tautological-compare", true)
3649 .Case("typedef-redefinition", true)
3650 .Case("typename-missing", true)
3651 .Case("undefined-reinterpret-cast", true)
3652 .Case("unknown-warning-option", true)
3653 .Case("unnamed-type-template-args", true)
3654 .Case("unneeded-internal-declaration", true)
3655 .Case("unneeded-member-function", true)
3656 .Case("unused-comparison", true)
3657 .Case("unused-exception-parameter", true)
3658 .Case("unused-member-function", true)
3659 .Case("unused-result", true)
3660 .Case("vector-conversions", true)
3661 .Case("vla", true)
3662 .Case("used-but-marked-unused", true)
3663 .Case("weak-vtables", true)
3664 .Default(false);
3665 } // if (Option.startswith("-W"))
Chad Rosier04225c12011-08-18 01:18:28 +00003666 if (RemoveOption) {
Chad Rosier285f9a22011-08-17 18:24:55 +00003667 it = CmdArgs.erase(it);
Chad Rosiercc0de8c2011-08-17 18:51:56 +00003668 ie = CmdArgs.end();
Chad Rosier30601782011-08-17 23:08:45 +00003669 } else {
Chad Rosier285f9a22011-08-17 18:24:55 +00003670 ++it;
Chad Rosier30601782011-08-17 23:08:45 +00003671 }
Chad Rosier285f9a22011-08-17 18:24:55 +00003672 }
3673}
3674
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003675void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003676 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003677 const Driver &D = getToolChain().getDriver();
Daniel Dunbare2fd6642009-09-10 01:21:12 +00003678
3679 CheckCodeGenerationOptions(D, Args);
3680
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003681 // Derived from cc1 spec.
Bob Wilsonf2f3ce52012-09-29 23:52:58 +00003682 if ((!Args.hasArg(options::OPT_mkernel) ||
3683 (getDarwinToolChain().isTargetIPhoneOS() &&
3684 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3685 !Args.hasArg(options::OPT_static) &&
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003686 !Args.hasArg(options::OPT_mdynamic_no_pic))
3687 CmdArgs.push_back("-fPIC");
3688
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003689 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3690 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3691 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3692 CmdArgs.push_back("-fno-builtin-strcat");
3693 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3694 CmdArgs.push_back("-fno-builtin-strcpy");
3695 }
3696
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003697 if (Args.hasArg(options::OPT_g_Flag) &&
3698 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3699 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3700}
3701
3702void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3703 const InputInfoList &Inputs,
3704 const ArgStringList &OutputArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003705 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003706
3707 // Derived from cc1_options spec.
3708 if (Args.hasArg(options::OPT_fast) ||
3709 Args.hasArg(options::OPT_fastf) ||
3710 Args.hasArg(options::OPT_fastcp))
3711 CmdArgs.push_back("-O3");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003712
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003713 if (Arg *A = Args.getLastArg(options::OPT_pg))
3714 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003715 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003716 << A->getAsString(Args) << "-fomit-frame-pointer";
3717
3718 AddCC1Args(Args, CmdArgs);
3719
3720 if (!Args.hasArg(options::OPT_Q))
3721 CmdArgs.push_back("-quiet");
3722
3723 CmdArgs.push_back("-dumpbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003724 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003725
3726 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3727
3728 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3729 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3730
3731 // FIXME: The goal is to use the user provided -o if that is our
3732 // final output, otherwise to drive from the original input
3733 // name. Find a clean way to go about this.
3734 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3735 Args.hasArg(options::OPT_o)) {
3736 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3737 CmdArgs.push_back("-auxbase-strip");
3738 CmdArgs.push_back(OutputOpt->getValue(Args));
3739 } else {
3740 CmdArgs.push_back("-auxbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003741 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003742 }
3743
3744 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3745
3746 Args.AddAllArgs(CmdArgs, options::OPT_O);
3747 // FIXME: -Wall is getting some special treatment. Investigate.
3748 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3749 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003750 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003751 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003752 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3753 // Honor -std-default.
3754 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3755 "-std=", /*Joined=*/true);
3756 }
3757
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003758 if (Args.hasArg(options::OPT_v))
3759 CmdArgs.push_back("-version");
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00003760 if (Args.hasArg(options::OPT_pg) &&
3761 getToolChain().SupportsProfiling())
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003762 CmdArgs.push_back("-p");
3763 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003764
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003765 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003766 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3767 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3768 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3769 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3770 //
3771 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003772 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3773 options::OPT_fsyntax_only),
3774 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003775 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3776 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3777 (*it)->claim();
3778 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003779 }
3780 }
3781 } else
3782 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003783
Daniel Dunbar089f8722011-04-07 20:41:03 +00003784 // Claim Clang only -f options, they aren't worth warning about.
3785 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3786
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003787 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3788 if (Args.hasArg(options::OPT_Qn))
3789 CmdArgs.push_back("-fno-ident");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003790
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003791 // FIXME: This isn't correct.
3792 //Args.AddLastArg(CmdArgs, options::OPT__help)
3793 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3794
3795 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3796
3797 // FIXME: Still don't get what is happening here. Investigate.
3798 Args.AddAllArgs(CmdArgs, options::OPT__param);
3799
3800 if (Args.hasArg(options::OPT_fmudflap) ||
3801 Args.hasArg(options::OPT_fmudflapth)) {
3802 CmdArgs.push_back("-fno-builtin");
3803 CmdArgs.push_back("-fno-merge-constants");
3804 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003805
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003806 if (Args.hasArg(options::OPT_coverage)) {
3807 CmdArgs.push_back("-fprofile-arcs");
3808 CmdArgs.push_back("-ftest-coverage");
3809 }
3810
3811 if (types::isCXX(Inputs[0].getType()))
3812 CmdArgs.push_back("-D__private_extern__=extern");
3813}
3814
3815void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3816 const InputInfoList &Inputs,
3817 const ArgStringList &OutputArgs) const {
3818 // Derived from cpp_options
3819 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003820
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003821 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3822
3823 AddCC1Args(Args, CmdArgs);
3824
3825 // NOTE: The code below has some commonality with cpp_options, but
3826 // in classic gcc style ends up sending things in different
3827 // orders. This may be a good merge candidate once we drop pedantic
3828 // compatibility.
3829
3830 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003831 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003832 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003833 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3834 // Honor -std-default.
3835 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3836 "-std=", /*Joined=*/true);
3837 }
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003838 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3839 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003840
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003841 // The driver treats -fsyntax-only specially.
3842 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3843
Daniel Dunbar089f8722011-04-07 20:41:03 +00003844 // Claim Clang only -f options, they aren't worth warning about.
3845 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3846
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003847 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3848 !Args.hasArg(options::OPT_fno_working_directory))
3849 CmdArgs.push_back("-fworking-directory");
3850
3851 Args.AddAllArgs(CmdArgs, options::OPT_O);
3852 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3853 if (Args.hasArg(options::OPT_save_temps))
3854 CmdArgs.push_back("-fpch-preprocess");
3855}
3856
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003857void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003858 ArgStringList &CmdArgs,
Mike Stump1eb44332009-09-09 15:08:12 +00003859 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003860 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003861
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003862 CheckPreprocessingOptions(D, Args);
3863
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003864 // Derived from cpp_unique_options.
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003865 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3866 Args.AddLastArg(CmdArgs, options::OPT_C);
3867 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003868 if (!Args.hasArg(options::OPT_Q))
3869 CmdArgs.push_back("-quiet");
3870 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor4c2bcad2010-03-24 20:13:48 +00003871 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003872 Args.AddLastArg(CmdArgs, options::OPT_v);
3873 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3874 Args.AddLastArg(CmdArgs, options::OPT_P);
3875
3876 // FIXME: Handle %I properly.
3877 if (getToolChain().getArchName() == "x86_64") {
3878 CmdArgs.push_back("-imultilib");
3879 CmdArgs.push_back("x86_64");
3880 }
3881
3882 if (Args.hasArg(options::OPT_MD)) {
3883 CmdArgs.push_back("-MD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003884 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003885 }
3886
3887 if (Args.hasArg(options::OPT_MMD)) {
3888 CmdArgs.push_back("-MMD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003889 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003890 }
3891
3892 Args.AddLastArg(CmdArgs, options::OPT_M);
3893 Args.AddLastArg(CmdArgs, options::OPT_MM);
3894 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3895 Args.AddLastArg(CmdArgs, options::OPT_MG);
3896 Args.AddLastArg(CmdArgs, options::OPT_MP);
3897 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3898 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3899 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3900 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3901 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3902 CmdArgs.push_back("-MQ");
3903 CmdArgs.push_back(OutputOpt->getValue(Args));
3904 }
3905 }
3906
3907 Args.AddLastArg(CmdArgs, options::OPT_remap);
3908 if (Args.hasArg(options::OPT_g3))
3909 CmdArgs.push_back("-dD");
3910 Args.AddLastArg(CmdArgs, options::OPT_H);
3911
3912 AddCPPArgs(Args, CmdArgs);
3913
3914 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3915 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3916
3917 for (InputInfoList::const_iterator
3918 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3919 const InputInfo &II = *it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003920
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003921 CmdArgs.push_back(II.getFilename());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003922 }
3923
3924 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3925 options::OPT_Xpreprocessor);
3926
3927 if (Args.hasArg(options::OPT_fmudflap)) {
3928 CmdArgs.push_back("-D_MUDFLAP");
3929 CmdArgs.push_back("-include");
3930 CmdArgs.push_back("mf-runtime.h");
3931 }
3932
3933 if (Args.hasArg(options::OPT_fmudflapth)) {
3934 CmdArgs.push_back("-D_MUDFLAP");
3935 CmdArgs.push_back("-D_MUDFLAPTH");
3936 CmdArgs.push_back("-include");
3937 CmdArgs.push_back("mf-runtime.h");
3938 }
3939}
3940
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003941void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003942 ArgStringList &CmdArgs) const {
3943 // Derived from cpp spec.
3944
3945 if (Args.hasArg(options::OPT_static)) {
3946 // The gcc spec is broken here, it refers to dynamic but
3947 // that has been translated. Start by being bug compatible.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003948
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003949 // if (!Args.hasArg(arglist.parser.dynamicOption))
3950 CmdArgs.push_back("-D__STATIC__");
3951 } else
3952 CmdArgs.push_back("-D__DYNAMIC__");
3953
3954 if (Args.hasArg(options::OPT_pthread))
3955 CmdArgs.push_back("-D_REENTRANT");
3956}
3957
Daniel Dunbar40f12652009-03-29 17:08:39 +00003958void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003959 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003960 const InputInfoList &Inputs,
3961 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00003962 const char *LinkingOutput) const {
3963 ArgStringList CmdArgs;
3964
3965 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3966
3967 CmdArgs.push_back("-E");
3968
3969 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbar40f12652009-03-29 17:08:39 +00003970 Args.hasArg(options::OPT_traditional_cpp))
3971 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003972
Daniel Dunbar40f12652009-03-29 17:08:39 +00003973 ArgStringList OutputArgs;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003974 assert(Output.isFilename() && "Unexpected CC1 output.");
3975 OutputArgs.push_back("-o");
3976 OutputArgs.push_back(Output.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00003977
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +00003978 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbar9120f172009-03-29 22:27:40 +00003979 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3980 } else {
3981 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3982 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3983 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003984
Daniel Dunbar8a2073a2009-04-03 01:27:06 +00003985 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3986
Chad Rosier4fe4d732011-09-08 00:38:00 +00003987 RemoveCC1UnsupportedArgs(CmdArgs);
3988
Daniel Dunbar40f12652009-03-29 17:08:39 +00003989 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003990 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003991 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003992 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00003993}
3994
3995void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003996 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003997 const InputInfoList &Inputs,
3998 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00003999 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004000 const Driver &D = getToolChain().getDriver();
Daniel Dunbar40f12652009-03-29 17:08:39 +00004001 ArgStringList CmdArgs;
4002
4003 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4004
Bob Wilson651f3d42012-04-01 23:03:29 +00004005 // Silence warning about unused --serialize-diagnostics
4006 Args.ClaimAllArgs(options::OPT__serialize_diags);
4007
Daniel Dunbar40f12652009-03-29 17:08:39 +00004008 types::ID InputType = Inputs[0].getType();
David Blaikied624a5b2012-04-04 20:43:14 +00004009 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004010 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004011 << A->getAsString(Args) << "-E";
4012
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004013 if (JA.getType() == types::TY_LLVM_IR ||
4014 JA.getType() == types::TY_LTO_IR)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004015 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004016 else if (JA.getType() == types::TY_LLVM_BC ||
4017 JA.getType() == types::TY_LTO_BC)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004018 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004019 else if (Output.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004020 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004021 << getToolChain().getTripleString();
Daniel Dunbarae24a882010-02-11 17:33:45 +00004022 else if (JA.getType() != types::TY_PP_Asm &&
4023 JA.getType() != types::TY_PCH)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004024 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004025 << getTypeName(JA.getType());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004026
4027 ArgStringList OutputArgs;
4028 if (Output.getType() != types::TY_PCH) {
4029 OutputArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004030 if (Output.isNothing())
Daniel Dunbar40f12652009-03-29 17:08:39 +00004031 OutputArgs.push_back("/dev/null");
4032 else
4033 OutputArgs.push_back(Output.getFilename());
4034 }
4035
4036 // There is no need for this level of compatibility, but it makes
4037 // diffing easier.
4038 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4039 Args.hasArg(options::OPT_S));
4040
4041 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004042 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbar40f12652009-03-29 17:08:39 +00004043 if (OutputArgsEarly) {
4044 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4045 } else {
4046 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4047 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4048 }
4049 } else {
4050 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004051
Daniel Dunbar40f12652009-03-29 17:08:39 +00004052 for (InputInfoList::const_iterator
4053 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4054 const InputInfo &II = *it;
4055
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004056 // Reject AST inputs.
4057 if (II.getType() == types::TY_AST) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004058 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004059 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004060 return;
4061 }
4062
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004063 CmdArgs.push_back(II.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004064 }
4065
4066 if (OutputArgsEarly) {
4067 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4068 } else {
4069 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4070 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4071 }
4072 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004073
Daniel Dunbar40f12652009-03-29 17:08:39 +00004074 if (Output.getType() == types::TY_PCH) {
4075 assert(Output.isFilename() && "Invalid PCH output.");
4076
4077 CmdArgs.push_back("-o");
4078 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4079 // to be a good reason.
Chad Rosier8c221b82011-08-01 19:58:48 +00004080 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004081 D.GetTemporaryPath("cc", "s"));
Chad Rosier8c221b82011-08-01 19:58:48 +00004082 C.addTempFile(TmpPath);
4083 CmdArgs.push_back(TmpPath);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004084
Eric Christopher88b7cf02011-08-19 00:30:14 +00004085 // If we're emitting a pch file with the last 4 characters of ".pth"
4086 // and falling back to llvm-gcc we want to use ".gch" instead.
4087 std::string OutputFile(Output.getFilename());
4088 size_t loc = OutputFile.rfind(".pth");
4089 if (loc != std::string::npos)
4090 OutputFile.replace(loc, 4, ".gch");
4091 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4092 CmdArgs.push_back(Tmp);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004093 }
Daniel Dunbar40f12652009-03-29 17:08:39 +00004094
Chad Rosier285f9a22011-08-17 18:24:55 +00004095 RemoveCC1UnsupportedArgs(CmdArgs);
4096
Daniel Dunbar40f12652009-03-29 17:08:39 +00004097 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004098 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004099 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004100 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00004101}
4102
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004103void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004104 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004105 const InputInfoList &Inputs,
4106 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004107 const char *LinkingOutput) const {
4108 ArgStringList CmdArgs;
4109
4110 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4111 const InputInfo &Input = Inputs[0];
4112
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004113 // Determine the original source input.
4114 const Action *SourceAction = &JA;
4115 while (SourceAction->getKind() != Action::InputClass) {
4116 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4117 SourceAction = SourceAction->getInputs()[0];
4118 }
4119
4120 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004121 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004122 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004123 if (Args.hasArg(options::OPT_gstabs))
4124 CmdArgs.push_back("--gstabs");
4125 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004126 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004127 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004128
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004129 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004130 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004131
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004132 // Use -force_cpusubtype_ALL on x86 by default.
4133 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4134 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004135 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4136 CmdArgs.push_back("-force_cpusubtype_ALL");
4137
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004138 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Bob Wilsonf2f3ce52012-09-29 23:52:58 +00004139 (((Args.hasArg(options::OPT_mkernel) ||
4140 Args.hasArg(options::OPT_fapple_kext)) &&
4141 (!getDarwinToolChain().isTargetIPhoneOS() ||
4142 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4143 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004144 CmdArgs.push_back("-static");
4145
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004146 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4147 options::OPT_Xassembler);
4148
4149 assert(Output.isFilename() && "Unexpected lipo output.");
4150 CmdArgs.push_back("-o");
4151 CmdArgs.push_back(Output.getFilename());
4152
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004153 assert(Input.isFilename() && "Invalid input.");
4154 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004155
4156 // asm_final spec is empty.
4157
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004158 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004159 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004160 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004161}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004162
David Blaikie99ba9e32011-12-20 02:48:34 +00004163void darwin::DarwinTool::anchor() {}
4164
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004165void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4166 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004167 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004168
Daniel Dunbar02633b52009-03-26 16:23:12 +00004169 // Derived from darwin_arch spec.
4170 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004171 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004172
Daniel Dunbareeff4062010-01-22 02:04:58 +00004173 // FIXME: Is this needed anymore?
4174 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004175 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004176}
4177
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004178void darwin::Link::AddLinkArgs(Compilation &C,
4179 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004180 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004181 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004182 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004183
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004184 unsigned Version[3] = { 0, 0, 0 };
4185 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4186 bool HadExtra;
4187 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4188 Version[1], Version[2], HadExtra) ||
4189 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004190 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004191 << A->getAsString(Args);
4192 }
4193
4194 // Newer linkers support -demangle, pass it if supported and not disabled by
4195 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004196 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004197 // Don't pass -demangle to ld_classic.
4198 //
4199 // FIXME: This is a temporary workaround, ld should be handling this.
4200 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4201 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004202 if (getToolChain().getArch() == llvm::Triple::x86) {
4203 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4204 options::OPT_Wl_COMMA),
4205 ie = Args.filtered_end(); it != ie; ++it) {
4206 const Arg *A = *it;
4207 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004208 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004209 UsesLdClassic = true;
4210 }
4211 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004212 if (!UsesLdClassic)
4213 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004214 }
4215
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004216 // If we are using LTO, then automatically create a temporary file path for
4217 // the linker to use, so that it's lifetime will extend past a possible
4218 // dsymutil step.
Daniel Dunbara68e1c32011-06-21 21:18:32 +00004219 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004220 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004221 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004222 C.addTempFile(TmpPath);
4223 CmdArgs.push_back("-object_path_lto");
4224 CmdArgs.push_back(TmpPath);
4225 }
4226
Daniel Dunbar02633b52009-03-26 16:23:12 +00004227 // Derived from the "link" spec.
4228 Args.AddAllArgs(CmdArgs, options::OPT_static);
4229 if (!Args.hasArg(options::OPT_static))
4230 CmdArgs.push_back("-dynamic");
4231 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4232 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4233 // here. How do we wish to handle such things?
4234 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004235
Daniel Dunbar02633b52009-03-26 16:23:12 +00004236 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004237 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004238 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004239 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004240
4241 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4242 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4243 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4244
4245 Arg *A;
4246 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4247 (A = Args.getLastArg(options::OPT_current__version)) ||
4248 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004249 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004250 << A->getAsString(Args) << "-dynamiclib";
4251
4252 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4253 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4254 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4255 } else {
4256 CmdArgs.push_back("-dylib");
4257
4258 Arg *A;
4259 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4260 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4261 (A = Args.getLastArg(options::OPT_client__name)) ||
4262 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4263 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4264 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004265 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004266 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004267
Daniel Dunbar02633b52009-03-26 16:23:12 +00004268 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4269 "-dylib_compatibility_version");
4270 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4271 "-dylib_current_version");
4272
Daniel Dunbara6d38492010-01-22 02:04:52 +00004273 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004274
4275 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4276 "-dylib_install_name");
4277 }
4278
4279 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4280 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4281 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004282 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004283 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004284 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4285 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4286 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4287 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4288 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4289 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004290 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004291 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4292 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4293 Args.AddAllArgs(CmdArgs, options::OPT_init);
4294
Daniel Dunbarce911f52011-04-28 21:23:41 +00004295 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004296 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004297
4298 // If we had an explicit -mios-simulator-version-min argument, honor that,
4299 // otherwise use the traditional deployment targets. We can't just check the
4300 // is-sim attribute because existing code follows this path, and the linker
4301 // may not handle the argument.
4302 //
4303 // FIXME: We may be able to remove this, once we can verify no one depends on
4304 // it.
4305 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4306 CmdArgs.push_back("-ios_simulator_version_min");
4307 else if (DarwinTC.isTargetIPhoneOS())
4308 CmdArgs.push_back("-iphoneos_version_min");
4309 else
4310 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004311 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004312
Daniel Dunbar02633b52009-03-26 16:23:12 +00004313 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4314 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4315 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4316 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4317 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004318
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004319 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4320 options::OPT_fno_pie,
4321 options::OPT_fno_PIE)) {
4322 if (A->getOption().matches(options::OPT_fpie) ||
4323 A->getOption().matches(options::OPT_fPIE))
4324 CmdArgs.push_back("-pie");
4325 else
4326 CmdArgs.push_back("-no_pie");
4327 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004328
4329 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4330 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4331 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4332 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4333 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4334 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4335 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4336 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4337 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4338 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4339 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4340 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4341 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4342 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4343 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4344 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004345
Daniel Dunbarcc957192011-05-02 21:03:47 +00004346 // Give --sysroot= preference, over the Apple specific behavior to also use
4347 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004348 StringRef sysroot = C.getSysRoot();
4349 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004350 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004351 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004352 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4353 CmdArgs.push_back("-syslibroot");
4354 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004355 }
4356
Daniel Dunbar02633b52009-03-26 16:23:12 +00004357 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4358 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4359 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4360 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4361 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004362 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004363 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4364 Args.AddAllArgs(CmdArgs, options::OPT_y);
4365 Args.AddLastArg(CmdArgs, options::OPT_w);
4366 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4367 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4368 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4369 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4370 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4371 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4372 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4373 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4374 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4375 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4376 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4377 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4378}
4379
4380void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004381 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004382 const InputInfoList &Inputs,
4383 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004384 const char *LinkingOutput) const {
4385 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004386
Daniel Dunbar02633b52009-03-26 16:23:12 +00004387 // The logic here is derived from gcc's behavior; most of which
4388 // comes from specs (starting with link_command). Consult gcc for
4389 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004390 ArgStringList CmdArgs;
4391
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004392 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4393 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4394 options::OPT_ccc_arcmt_migrate)) {
4395 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4396 (*I)->claim();
4397 const char *Exec =
4398 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4399 CmdArgs.push_back(Output.getFilename());
4400 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4401 return;
4402 }
4403
Daniel Dunbar02633b52009-03-26 16:23:12 +00004404 // I'm not sure why this particular decomposition exists in gcc, but
4405 // we follow suite for ease of comparison.
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004406 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004407
Daniel Dunbar02633b52009-03-26 16:23:12 +00004408 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4409 Args.AddAllArgs(CmdArgs, options::OPT_s);
4410 Args.AddAllArgs(CmdArgs, options::OPT_t);
4411 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4412 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004413 Args.AddLastArg(CmdArgs, options::OPT_e);
4414 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4415 Args.AddAllArgs(CmdArgs, options::OPT_r);
4416
Daniel Dunbar270073c2010-10-18 22:08:36 +00004417 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4418 // members of static archive libraries which implement Objective-C classes or
4419 // categories.
4420 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4421 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004422
Daniel Dunbar02633b52009-03-26 16:23:12 +00004423 CmdArgs.push_back("-o");
4424 CmdArgs.push_back(Output.getFilename());
4425
Chad Rosier18937312012-05-16 23:45:12 +00004426 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004427 !Args.hasArg(options::OPT_nostartfiles)) {
4428 // Derived from startfile spec.
4429 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004430 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004431 if (getDarwinToolChain().isTargetIOSSimulator()) {
4432 // The simulator doesn't have a versioned crt1 file.
4433 CmdArgs.push_back("-ldylib1.o");
4434 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004435 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4436 CmdArgs.push_back("-ldylib1.o");
4437 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004438 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004439 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004440 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004441 CmdArgs.push_back("-ldylib1.10.5.o");
4442 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004443 } else {
4444 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004445 if (!Args.hasArg(options::OPT_static)) {
4446 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004447 if (getDarwinToolChain().isTargetIOSSimulator()) {
4448 // The simulator doesn't have a versioned crt1 file.
4449 CmdArgs.push_back("-lbundle1.o");
4450 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004451 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4452 CmdArgs.push_back("-lbundle1.o");
4453 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004454 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004455 CmdArgs.push_back("-lbundle1.o");
4456 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004457 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004458 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004459 if (Args.hasArg(options::OPT_pg) &&
4460 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004461 if (Args.hasArg(options::OPT_static) ||
4462 Args.hasArg(options::OPT_object) ||
4463 Args.hasArg(options::OPT_preload)) {
4464 CmdArgs.push_back("-lgcrt0.o");
4465 } else {
4466 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004467
Daniel Dunbar02633b52009-03-26 16:23:12 +00004468 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004469 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004470 // By default on OS X 10.8 and later, we don't link with a crt1.o
4471 // file and the linker knows to use _main as the entry point. But,
4472 // when compiling with -pg, we need to link with the gcrt1.o file,
4473 // so pass the -no_new_main option to tell the linker to use the
4474 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004475 if (getDarwinToolChain().isTargetMacOS() &&
4476 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4477 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004478 } else {
4479 if (Args.hasArg(options::OPT_static) ||
4480 Args.hasArg(options::OPT_object) ||
4481 Args.hasArg(options::OPT_preload)) {
4482 CmdArgs.push_back("-lcrt0.o");
4483 } else {
4484 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004485 if (getDarwinToolChain().isTargetIOSSimulator()) {
4486 // The simulator doesn't have a versioned crt1 file.
4487 CmdArgs.push_back("-lcrt1.o");
4488 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004489 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4490 CmdArgs.push_back("-lcrt1.o");
Bob Wilsonf2f3ce52012-09-29 23:52:58 +00004491 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004492 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004493 } else {
4494 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4495 CmdArgs.push_back("-lcrt1.o");
4496 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4497 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004498 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004499 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004500
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004501 // darwin_crt2 spec is empty.
4502 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004503 }
4504 }
4505 }
4506 }
4507
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004508 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4509 Args.hasArg(options::OPT_shared_libgcc) &&
4510 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004511 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004512 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004513 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004514 }
4515 }
4516
4517 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004518
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004519 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4520 // symbols may appear. Mark all of them as dynamic_lookup.
4521 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4522 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4523 options::OPT_fno_address_sanitizer, false)) {
4524 if (Args.hasArg(options::OPT_dynamiclib) ||
4525 Args.hasArg(options::OPT_bundle)) {
4526 CmdArgs.push_back("-undefined");
4527 CmdArgs.push_back("dynamic_lookup");
4528 }
4529 }
4530
Daniel Dunbar02633b52009-03-26 16:23:12 +00004531 if (Args.hasArg(options::OPT_fopenmp))
4532 // This is more complicated in gcc...
4533 CmdArgs.push_back("-lgomp");
4534
Douglas Gregor04e326b2012-05-15 21:00:27 +00004535 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4536
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004537 if (isObjCRuntimeLinked(Args) &&
4538 !Args.hasArg(options::OPT_nostdlib) &&
4539 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004540 // Avoid linking compatibility stubs on i386 mac.
4541 if (!getDarwinToolChain().isTargetMacOS() ||
4542 getDarwinToolChain().getArchName() != "i386") {
4543 // If we don't have ARC or subscripting runtime support, link in the
4544 // runtime stubs. We have to do this *before* adding any of the normal
4545 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004546 ObjCRuntime runtime =
4547 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004548 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004549 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004550 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004551 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004552 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004553 CmdArgs.push_back("-framework");
4554 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004555 // Link libobj.
4556 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004557 }
John McCallf85e1932011-06-15 23:02:42 +00004558
Daniel Dunbar02633b52009-03-26 16:23:12 +00004559 if (LinkingOutput) {
4560 CmdArgs.push_back("-arch_multiple");
4561 CmdArgs.push_back("-final_output");
4562 CmdArgs.push_back(LinkingOutput);
4563 }
4564
Daniel Dunbar02633b52009-03-26 16:23:12 +00004565 if (Args.hasArg(options::OPT_fnested_functions))
4566 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004567
Daniel Dunbar02633b52009-03-26 16:23:12 +00004568 if (!Args.hasArg(options::OPT_nostdlib) &&
4569 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004570 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004571 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004572
Daniel Dunbar02633b52009-03-26 16:23:12 +00004573 // link_ssp spec is empty.
4574
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004575 // Let the tool chain choose which runtime library to link.
4576 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004577 }
4578
Chad Rosier18937312012-05-16 23:45:12 +00004579 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004580 !Args.hasArg(options::OPT_nostartfiles)) {
4581 // endfile_spec is empty.
4582 }
4583
4584 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4585 Args.AddAllArgs(CmdArgs, options::OPT_F);
4586
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004587 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004588 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004589 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004590}
4591
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004592void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004593 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004594 const InputInfoList &Inputs,
4595 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004596 const char *LinkingOutput) const {
4597 ArgStringList CmdArgs;
4598
4599 CmdArgs.push_back("-create");
4600 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004601
4602 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004603 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004604
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004605 for (InputInfoList::const_iterator
4606 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4607 const InputInfo &II = *it;
4608 assert(II.isFilename() && "Unexpected lipo input.");
4609 CmdArgs.push_back(II.getFilename());
4610 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004611 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004612 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004613 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004614}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004615
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004616void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004617 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004618 const InputInfoList &Inputs,
4619 const ArgList &Args,
4620 const char *LinkingOutput) const {
4621 ArgStringList CmdArgs;
4622
Daniel Dunbar03e92302011-05-09 17:23:16 +00004623 CmdArgs.push_back("-o");
4624 CmdArgs.push_back(Output.getFilename());
4625
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004626 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4627 const InputInfo &Input = Inputs[0];
4628 assert(Input.isFilename() && "Unexpected dsymutil input.");
4629 CmdArgs.push_back(Input.getFilename());
4630
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004631 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004632 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004633 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004634}
4635
Eric Christopherf8571862011-08-23 17:56:55 +00004636void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4637 const InputInfo &Output,
4638 const InputInfoList &Inputs,
4639 const ArgList &Args,
4640 const char *LinkingOutput) const {
4641 ArgStringList CmdArgs;
4642 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004643 CmdArgs.push_back("--debug-info");
4644 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004645 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004646
4647 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4648 const InputInfo &Input = Inputs[0];
4649 assert(Input.isFilename() && "Unexpected verify input");
4650
4651 // Grabbing the output of the earlier dsymutil run.
4652 CmdArgs.push_back(Input.getFilename());
4653
4654 const char *Exec =
4655 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4656 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4657}
4658
David Chisnall31c46902012-02-15 13:39:01 +00004659void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4660 const InputInfo &Output,
4661 const InputInfoList &Inputs,
4662 const ArgList &Args,
4663 const char *LinkingOutput) const {
4664 ArgStringList CmdArgs;
4665
4666 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4667 options::OPT_Xassembler);
4668
4669 CmdArgs.push_back("-o");
4670 CmdArgs.push_back(Output.getFilename());
4671
4672 for (InputInfoList::const_iterator
4673 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4674 const InputInfo &II = *it;
4675 CmdArgs.push_back(II.getFilename());
4676 }
4677
4678 const char *Exec =
4679 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4680 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4681}
4682
4683
4684void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4685 const InputInfo &Output,
4686 const InputInfoList &Inputs,
4687 const ArgList &Args,
4688 const char *LinkingOutput) const {
4689 // FIXME: Find a real GCC, don't hard-code versions here
4690 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4691 const llvm::Triple &T = getToolChain().getTriple();
4692 std::string LibPath = "/usr/lib/";
4693 llvm::Triple::ArchType Arch = T.getArch();
4694 switch (Arch) {
4695 case llvm::Triple::x86:
4696 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4697 T.getOSName()).str() + "/4.5.2/";
4698 break;
4699 case llvm::Triple::x86_64:
4700 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4701 T.getOSName()).str();
4702 GCCLibPath += "/4.5.2/amd64/";
4703 LibPath += "amd64/";
4704 break;
4705 default:
4706 assert(0 && "Unsupported architecture");
4707 }
4708
4709 ArgStringList CmdArgs;
4710
David Chisnall41d476d2012-02-29 15:06:12 +00004711 // Demangle C++ names in errors
4712 CmdArgs.push_back("-C");
4713
David Chisnall31c46902012-02-15 13:39:01 +00004714 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4715 (!Args.hasArg(options::OPT_shared))) {
4716 CmdArgs.push_back("-e");
4717 CmdArgs.push_back("_start");
4718 }
4719
4720 if (Args.hasArg(options::OPT_static)) {
4721 CmdArgs.push_back("-Bstatic");
4722 CmdArgs.push_back("-dn");
4723 } else {
4724 CmdArgs.push_back("-Bdynamic");
4725 if (Args.hasArg(options::OPT_shared)) {
4726 CmdArgs.push_back("-shared");
4727 } else {
4728 CmdArgs.push_back("--dynamic-linker");
4729 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4730 }
4731 }
4732
4733 if (Output.isFilename()) {
4734 CmdArgs.push_back("-o");
4735 CmdArgs.push_back(Output.getFilename());
4736 } else {
4737 assert(Output.isNothing() && "Invalid output.");
4738 }
4739
4740 if (!Args.hasArg(options::OPT_nostdlib) &&
4741 !Args.hasArg(options::OPT_nostartfiles)) {
4742 if (!Args.hasArg(options::OPT_shared)) {
4743 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4744 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004745 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004746 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4747 } else {
4748 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004749 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4750 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004751 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004752 if (getToolChain().getDriver().CCCIsCXX)
4753 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004754 }
4755
4756 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4757
4758 Args.AddAllArgs(CmdArgs, options::OPT_L);
4759 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4760 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00004761 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00004762
4763 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4764
4765 if (!Args.hasArg(options::OPT_nostdlib) &&
4766 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00004767 if (getToolChain().getDriver().CCCIsCXX)
4768 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00004769 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00004770 if (!Args.hasArg(options::OPT_shared)) {
4771 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00004772 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00004773 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00004774 }
David Chisnall31c46902012-02-15 13:39:01 +00004775 }
4776
4777 if (!Args.hasArg(options::OPT_nostdlib) &&
4778 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00004779 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004780 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00004781 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004782
4783 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4784
4785 const char *Exec =
4786 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4787 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4788}
4789
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004790void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004791 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004792 const InputInfoList &Inputs,
4793 const ArgList &Args,
4794 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004795 ArgStringList CmdArgs;
4796
4797 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4798 options::OPT_Xassembler);
4799
4800 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004801 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004802
4803 for (InputInfoList::const_iterator
4804 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4805 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004806 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004807 }
4808
4809 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004810 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004811 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004812}
4813
4814void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004815 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004816 const InputInfoList &Inputs,
4817 const ArgList &Args,
4818 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004819 ArgStringList CmdArgs;
4820
4821 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004822 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004823 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004824 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004825 }
4826
4827 if (Args.hasArg(options::OPT_static)) {
4828 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004829 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004830 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004831// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004832 CmdArgs.push_back("-Bdynamic");
4833 if (Args.hasArg(options::OPT_shared)) {
4834 CmdArgs.push_back("-shared");
4835 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00004836 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004837 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4838 }
4839 }
4840
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004841 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004842 CmdArgs.push_back("-o");
4843 CmdArgs.push_back(Output.getFilename());
4844 } else {
4845 assert(Output.isNothing() && "Invalid output.");
4846 }
4847
4848 if (!Args.hasArg(options::OPT_nostdlib) &&
4849 !Args.hasArg(options::OPT_nostartfiles)) {
4850 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00004851 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004852 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004853 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004854 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004855 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004856 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004857 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004858 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004859 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004860 }
Chris Lattner38e317d2010-07-07 16:01:42 +00004861 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004862 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004863 }
4864
Daniel Dunbar294691e2009-11-04 06:24:38 +00004865 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4866 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004867 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004868
4869 Args.AddAllArgs(CmdArgs, options::OPT_L);
4870 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4871 Args.AddAllArgs(CmdArgs, options::OPT_e);
4872
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004873 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004874
4875 if (!Args.hasArg(options::OPT_nostdlib) &&
4876 !Args.hasArg(options::OPT_nodefaultlibs)) {
4877 // FIXME: For some reason GCC passes -lgcc before adding
4878 // the default system libraries. Just mimic this for now.
4879 CmdArgs.push_back("-lgcc");
4880
4881 if (Args.hasArg(options::OPT_pthread))
4882 CmdArgs.push_back("-pthread");
4883 if (!Args.hasArg(options::OPT_shared))
4884 CmdArgs.push_back("-lc");
4885 CmdArgs.push_back("-lgcc");
4886 }
4887
4888 if (!Args.hasArg(options::OPT_nostdlib) &&
4889 !Args.hasArg(options::OPT_nostartfiles)) {
4890 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004891 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004892 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004893 }
4894
Bill Wendling3f4be6f2011-06-27 19:15:03 +00004895 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00004896
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004897 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004898 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004899 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004900}
4901
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004902void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004903 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004904 const InputInfoList &Inputs,
4905 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00004906 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004907 ArgStringList CmdArgs;
4908
4909 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4910 options::OPT_Xassembler);
4911
4912 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004913 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004914
4915 for (InputInfoList::const_iterator
4916 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4917 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004918 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004919 }
4920
4921 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004922 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004923 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004924}
4925
4926void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004927 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004928 const InputInfoList &Inputs,
4929 const ArgList &Args,
4930 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004931 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004932 ArgStringList CmdArgs;
4933
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004934 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004935 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004936 CmdArgs.push_back("-e");
4937 CmdArgs.push_back("__start");
4938 }
4939
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004940 if (Args.hasArg(options::OPT_static)) {
4941 CmdArgs.push_back("-Bstatic");
4942 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00004943 if (Args.hasArg(options::OPT_rdynamic))
4944 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004945 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004946 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004947 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004948 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004949 } else {
4950 CmdArgs.push_back("-dynamic-linker");
4951 CmdArgs.push_back("/usr/libexec/ld.so");
4952 }
4953 }
4954
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004955 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004956 CmdArgs.push_back("-o");
4957 CmdArgs.push_back(Output.getFilename());
4958 } else {
4959 assert(Output.isNothing() && "Invalid output.");
4960 }
4961
4962 if (!Args.hasArg(options::OPT_nostdlib) &&
4963 !Args.hasArg(options::OPT_nostartfiles)) {
4964 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00004965 if (Args.hasArg(options::OPT_pg))
4966 CmdArgs.push_back(Args.MakeArgString(
4967 getToolChain().GetFilePath("gcrt0.o")));
4968 else
4969 CmdArgs.push_back(Args.MakeArgString(
4970 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004971 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004972 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004973 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004974 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004975 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004976 }
4977 }
4978
Edward O'Callaghane7e18202009-10-28 15:13:08 +00004979 std::string Triple = getToolChain().getTripleString();
4980 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00004981 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004982 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00004983 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004984
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004985 Args.AddAllArgs(CmdArgs, options::OPT_L);
4986 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4987 Args.AddAllArgs(CmdArgs, options::OPT_e);
4988
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004989 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004990
4991 if (!Args.hasArg(options::OPT_nostdlib) &&
4992 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00004993 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004994 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00004995 if (Args.hasArg(options::OPT_pg))
4996 CmdArgs.push_back("-lm_p");
4997 else
4998 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00004999 }
5000
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005001 // FIXME: For some reason GCC passes -lgcc before adding
5002 // the default system libraries. Just mimic this for now.
5003 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005004
Eric Christopherdc6cc872012-09-13 06:32:34 +00005005 if (Args.hasArg(options::OPT_pthread)) {
5006 if (!Args.hasArg(options::OPT_shared) &&
5007 Args.hasArg(options::OPT_pg))
5008 CmdArgs.push_back("-lpthread_p");
5009 else
5010 CmdArgs.push_back("-lpthread");
5011 }
5012
Chandler Carruth657849c2011-12-17 22:32:42 +00005013 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005014 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005015 CmdArgs.push_back("-lc_p");
5016 else
5017 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005018 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005019
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005020 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005021 }
5022
5023 if (!Args.hasArg(options::OPT_nostdlib) &&
5024 !Args.hasArg(options::OPT_nostartfiles)) {
5025 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005026 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005027 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005028 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005029 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005030 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005031 }
5032
5033 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005034 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005035 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005036}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005037
Eli Friedman42f74f22012-08-08 23:57:20 +00005038void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5039 const InputInfo &Output,
5040 const InputInfoList &Inputs,
5041 const ArgList &Args,
5042 const char *LinkingOutput) const {
5043 ArgStringList CmdArgs;
5044
5045 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5046 options::OPT_Xassembler);
5047
5048 CmdArgs.push_back("-o");
5049 CmdArgs.push_back(Output.getFilename());
5050
5051 for (InputInfoList::const_iterator
5052 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5053 const InputInfo &II = *it;
5054 CmdArgs.push_back(II.getFilename());
5055 }
5056
5057 const char *Exec =
5058 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5059 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5060}
5061
5062void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5063 const InputInfo &Output,
5064 const InputInfoList &Inputs,
5065 const ArgList &Args,
5066 const char *LinkingOutput) const {
5067 const Driver &D = getToolChain().getDriver();
5068 ArgStringList CmdArgs;
5069
5070 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5071 (!Args.hasArg(options::OPT_shared))) {
5072 CmdArgs.push_back("-e");
5073 CmdArgs.push_back("__start");
5074 }
5075
5076 if (Args.hasArg(options::OPT_static)) {
5077 CmdArgs.push_back("-Bstatic");
5078 } else {
5079 if (Args.hasArg(options::OPT_rdynamic))
5080 CmdArgs.push_back("-export-dynamic");
5081 CmdArgs.push_back("--eh-frame-hdr");
5082 CmdArgs.push_back("-Bdynamic");
5083 if (Args.hasArg(options::OPT_shared)) {
5084 CmdArgs.push_back("-shared");
5085 } else {
5086 CmdArgs.push_back("-dynamic-linker");
5087 CmdArgs.push_back("/usr/libexec/ld.so");
5088 }
5089 }
5090
5091 if (Output.isFilename()) {
5092 CmdArgs.push_back("-o");
5093 CmdArgs.push_back(Output.getFilename());
5094 } else {
5095 assert(Output.isNothing() && "Invalid output.");
5096 }
5097
5098 if (!Args.hasArg(options::OPT_nostdlib) &&
5099 !Args.hasArg(options::OPT_nostartfiles)) {
5100 if (!Args.hasArg(options::OPT_shared)) {
5101 if (Args.hasArg(options::OPT_pg))
5102 CmdArgs.push_back(Args.MakeArgString(
5103 getToolChain().GetFilePath("gcrt0.o")));
5104 else
5105 CmdArgs.push_back(Args.MakeArgString(
5106 getToolChain().GetFilePath("crt0.o")));
5107 CmdArgs.push_back(Args.MakeArgString(
5108 getToolChain().GetFilePath("crtbegin.o")));
5109 } else {
5110 CmdArgs.push_back(Args.MakeArgString(
5111 getToolChain().GetFilePath("crtbeginS.o")));
5112 }
5113 }
5114
5115 Args.AddAllArgs(CmdArgs, options::OPT_L);
5116 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5117 Args.AddAllArgs(CmdArgs, options::OPT_e);
5118
5119 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5120
5121 if (!Args.hasArg(options::OPT_nostdlib) &&
5122 !Args.hasArg(options::OPT_nodefaultlibs)) {
5123 if (D.CCCIsCXX) {
5124 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5125 if (Args.hasArg(options::OPT_pg))
5126 CmdArgs.push_back("-lm_p");
5127 else
5128 CmdArgs.push_back("-lm");
5129 }
5130
5131 if (Args.hasArg(options::OPT_pthread))
5132 CmdArgs.push_back("-lpthread");
5133 if (!Args.hasArg(options::OPT_shared)) {
5134 if (Args.hasArg(options::OPT_pg))
5135 CmdArgs.push_back("-lc_p");
5136 else
5137 CmdArgs.push_back("-lc");
5138 }
5139
5140 std::string myarch = "-lclang_rt.";
5141 const llvm::Triple &T = getToolChain().getTriple();
5142 llvm::Triple::ArchType Arch = T.getArch();
5143 switch (Arch) {
5144 case llvm::Triple::arm:
5145 myarch += ("arm");
5146 break;
5147 case llvm::Triple::x86:
5148 myarch += ("i386");
5149 break;
5150 case llvm::Triple::x86_64:
5151 myarch += ("amd64");
5152 break;
5153 default:
5154 assert(0 && "Unsupported architecture");
5155 }
5156 CmdArgs.push_back(Args.MakeArgString(myarch));
5157 }
5158
5159 if (!Args.hasArg(options::OPT_nostdlib) &&
5160 !Args.hasArg(options::OPT_nostartfiles)) {
5161 if (!Args.hasArg(options::OPT_shared))
5162 CmdArgs.push_back(Args.MakeArgString(
5163 getToolChain().GetFilePath("crtend.o")));
5164 else
5165 CmdArgs.push_back(Args.MakeArgString(
5166 getToolChain().GetFilePath("crtendS.o")));
5167 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005168
5169 const char *Exec =
5170 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5171 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005172}
5173
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005174void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005175 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005176 const InputInfoList &Inputs,
5177 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005178 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005179 ArgStringList CmdArgs;
5180
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005181 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5182 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005183 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005184 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005185 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005186 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005187 else if (getToolChain().getArch() == llvm::Triple::mips ||
5188 getToolChain().getArch() == llvm::Triple::mipsel ||
5189 getToolChain().getArch() == llvm::Triple::mips64 ||
5190 getToolChain().getArch() == llvm::Triple::mips64el) {
5191 StringRef CPUName;
5192 StringRef ABIName;
5193 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005194
Eric Christopherc55da4b2012-09-05 21:32:44 +00005195 CmdArgs.push_back("-march");
5196 CmdArgs.push_back(CPUName.data());
5197
5198 // Convert ABI name to the GNU tools acceptable variant.
5199 if (ABIName == "o32")
5200 ABIName = "32";
5201 else if (ABIName == "n64")
5202 ABIName = "64";
5203
5204 CmdArgs.push_back("-mabi");
5205 CmdArgs.push_back(ABIName.data());
5206
5207 if (getToolChain().getArch() == llvm::Triple::mips ||
5208 getToolChain().getArch() == llvm::Triple::mips64)
5209 CmdArgs.push_back("-EB");
5210 else
5211 CmdArgs.push_back("-EL");
5212
5213 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5214 options::OPT_fpic, options::OPT_fno_pic,
5215 options::OPT_fPIE, options::OPT_fno_PIE,
5216 options::OPT_fpie, options::OPT_fno_pie);
5217 if (LastPICArg &&
5218 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5219 LastPICArg->getOption().matches(options::OPT_fpic) ||
5220 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5221 LastPICArg->getOption().matches(options::OPT_fpie))) {
5222 CmdArgs.push_back("-KPIC");
5223 }
5224 }
Eric Christophered734732010-03-02 02:41:08 +00005225
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5227 options::OPT_Xassembler);
5228
5229 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005230 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005231
5232 for (InputInfoList::const_iterator
5233 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5234 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005235 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005236 }
5237
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005238 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005239 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005240 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005241}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005242
5243void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005244 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005245 const InputInfoList &Inputs,
5246 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005247 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005248 const toolchains::FreeBSD& ToolChain =
5249 static_cast<const toolchains::FreeBSD&>(getToolChain());
5250 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005251 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005252
5253 // Silence warning for "clang -g foo.o -o foo"
5254 Args.ClaimAllArgs(options::OPT_g_Group);
5255 // and "clang -emit-llvm foo.o -o foo"
5256 Args.ClaimAllArgs(options::OPT_emit_llvm);
5257 // and for "clang -w foo.o -o foo". Other warning options are already
5258 // handled somewhere else.
5259 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005260
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005261 if (!D.SysRoot.empty())
5262 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5263
Roman Divacky94380162012-08-28 15:09:03 +00005264 if (Args.hasArg(options::OPT_pie))
5265 CmdArgs.push_back("-pie");
5266
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005267 if (Args.hasArg(options::OPT_static)) {
5268 CmdArgs.push_back("-Bstatic");
5269 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005270 if (Args.hasArg(options::OPT_rdynamic))
5271 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005272 CmdArgs.push_back("--eh-frame-hdr");
5273 if (Args.hasArg(options::OPT_shared)) {
5274 CmdArgs.push_back("-Bshareable");
5275 } else {
5276 CmdArgs.push_back("-dynamic-linker");
5277 CmdArgs.push_back("/libexec/ld-elf.so.1");
5278 }
Roman Divacky94380162012-08-28 15:09:03 +00005279 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5280 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005281 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5282 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5283 CmdArgs.push_back("--hash-style=both");
5284 }
5285 }
5286 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005287 }
5288
5289 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5290 // instruct ld in the base system to link 32-bit code.
Roman Divacky94380162012-08-28 15:09:03 +00005291 if (ToolChain.getArchName() == "i386") {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005292 CmdArgs.push_back("-m");
5293 CmdArgs.push_back("elf_i386_fbsd");
5294 }
5295
Roman Divacky94380162012-08-28 15:09:03 +00005296 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky000a6552011-06-04 07:40:24 +00005297 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005298 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005299 }
5300
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005301 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005302 CmdArgs.push_back("-o");
5303 CmdArgs.push_back(Output.getFilename());
5304 } else {
5305 assert(Output.isNothing() && "Invalid output.");
5306 }
5307
5308 if (!Args.hasArg(options::OPT_nostdlib) &&
5309 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005310 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005311 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005312 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005313 crt1 = "gcrt1.o";
5314 else if (Args.hasArg(options::OPT_pie))
5315 crt1 = "Scrt1.o";
5316 else
5317 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005318 }
Roman Divacky94380162012-08-28 15:09:03 +00005319 if (crt1)
5320 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5321
5322 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5323
5324 const char *crtbegin = NULL;
5325 if (Args.hasArg(options::OPT_static))
5326 crtbegin = "crtbeginT.o";
5327 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5328 crtbegin = "crtbeginS.o";
5329 else
5330 crtbegin = "crtbegin.o";
5331
5332 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005333 }
5334
5335 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005336 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005337 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5338 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005339 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005340 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5341 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005342 Args.AddAllArgs(CmdArgs, options::OPT_s);
5343 Args.AddAllArgs(CmdArgs, options::OPT_t);
5344 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5345 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005346
Roman Divacky94380162012-08-28 15:09:03 +00005347 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005348
5349 if (!Args.hasArg(options::OPT_nostdlib) &&
5350 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005351 if (D.CCCIsCXX) {
Roman Divacky94380162012-08-28 15:09:03 +00005352 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005353 if (Args.hasArg(options::OPT_pg))
5354 CmdArgs.push_back("-lm_p");
5355 else
5356 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005357 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005358 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5359 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005360 if (Args.hasArg(options::OPT_pg))
5361 CmdArgs.push_back("-lgcc_p");
5362 else
5363 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005364 if (Args.hasArg(options::OPT_static)) {
5365 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005366 } else if (Args.hasArg(options::OPT_pg)) {
5367 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005368 } else {
5369 CmdArgs.push_back("--as-needed");
5370 CmdArgs.push_back("-lgcc_s");
5371 CmdArgs.push_back("--no-as-needed");
5372 }
5373
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005374 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005375 if (Args.hasArg(options::OPT_pg))
5376 CmdArgs.push_back("-lpthread_p");
5377 else
5378 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005379 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005380
Roman Divackyc16bb762011-02-10 16:59:40 +00005381 if (Args.hasArg(options::OPT_pg)) {
5382 if (Args.hasArg(options::OPT_shared))
5383 CmdArgs.push_back("-lc");
5384 else
5385 CmdArgs.push_back("-lc_p");
5386 CmdArgs.push_back("-lgcc_p");
5387 } else {
5388 CmdArgs.push_back("-lc");
5389 CmdArgs.push_back("-lgcc");
5390 }
5391
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005392 if (Args.hasArg(options::OPT_static)) {
5393 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005394 } else if (Args.hasArg(options::OPT_pg)) {
5395 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005396 } else {
5397 CmdArgs.push_back("--as-needed");
5398 CmdArgs.push_back("-lgcc_s");
5399 CmdArgs.push_back("--no-as-needed");
5400 }
5401 }
5402
5403 if (!Args.hasArg(options::OPT_nostdlib) &&
5404 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005405 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005406 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005407 else
5408 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005409 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005410 }
5411
Roman Divacky94380162012-08-28 15:09:03 +00005412 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005413
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005414 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005415 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005416 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005417}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005418
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005419void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5420 const InputInfo &Output,
5421 const InputInfoList &Inputs,
5422 const ArgList &Args,
5423 const char *LinkingOutput) const {
5424 ArgStringList CmdArgs;
5425
5426 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5427 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005428 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005429 CmdArgs.push_back("--32");
5430
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005431 // Set byte order explicitly
5432 if (getToolChain().getArchName() == "mips")
5433 CmdArgs.push_back("-EB");
5434 else if (getToolChain().getArchName() == "mipsel")
5435 CmdArgs.push_back("-EL");
5436
5437 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5438 options::OPT_Xassembler);
5439
5440 CmdArgs.push_back("-o");
5441 CmdArgs.push_back(Output.getFilename());
5442
5443 for (InputInfoList::const_iterator
5444 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5445 const InputInfo &II = *it;
5446 CmdArgs.push_back(II.getFilename());
5447 }
5448
David Chisnall5adcec12011-09-27 22:03:18 +00005449 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005450 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5451}
5452
5453void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5454 const InputInfo &Output,
5455 const InputInfoList &Inputs,
5456 const ArgList &Args,
5457 const char *LinkingOutput) const {
5458 const Driver &D = getToolChain().getDriver();
5459 ArgStringList CmdArgs;
5460
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005461 if (!D.SysRoot.empty())
5462 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5463
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005464 if (Args.hasArg(options::OPT_static)) {
5465 CmdArgs.push_back("-Bstatic");
5466 } else {
5467 if (Args.hasArg(options::OPT_rdynamic))
5468 CmdArgs.push_back("-export-dynamic");
5469 CmdArgs.push_back("--eh-frame-hdr");
5470 if (Args.hasArg(options::OPT_shared)) {
5471 CmdArgs.push_back("-Bshareable");
5472 } else {
5473 CmdArgs.push_back("-dynamic-linker");
5474 CmdArgs.push_back("/libexec/ld.elf_so");
5475 }
5476 }
5477
5478 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5479 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005480 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005481 CmdArgs.push_back("-m");
5482 CmdArgs.push_back("elf_i386");
5483 }
5484
5485 if (Output.isFilename()) {
5486 CmdArgs.push_back("-o");
5487 CmdArgs.push_back(Output.getFilename());
5488 } else {
5489 assert(Output.isNothing() && "Invalid output.");
5490 }
5491
5492 if (!Args.hasArg(options::OPT_nostdlib) &&
5493 !Args.hasArg(options::OPT_nostartfiles)) {
5494 if (!Args.hasArg(options::OPT_shared)) {
5495 CmdArgs.push_back(Args.MakeArgString(
5496 getToolChain().GetFilePath("crt0.o")));
5497 CmdArgs.push_back(Args.MakeArgString(
5498 getToolChain().GetFilePath("crti.o")));
5499 CmdArgs.push_back(Args.MakeArgString(
5500 getToolChain().GetFilePath("crtbegin.o")));
5501 } else {
5502 CmdArgs.push_back(Args.MakeArgString(
5503 getToolChain().GetFilePath("crti.o")));
5504 CmdArgs.push_back(Args.MakeArgString(
5505 getToolChain().GetFilePath("crtbeginS.o")));
5506 }
5507 }
5508
5509 Args.AddAllArgs(CmdArgs, options::OPT_L);
5510 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5511 Args.AddAllArgs(CmdArgs, options::OPT_e);
5512 Args.AddAllArgs(CmdArgs, options::OPT_s);
5513 Args.AddAllArgs(CmdArgs, options::OPT_t);
5514 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5515 Args.AddAllArgs(CmdArgs, options::OPT_r);
5516
5517 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5518
5519 if (!Args.hasArg(options::OPT_nostdlib) &&
5520 !Args.hasArg(options::OPT_nodefaultlibs)) {
5521 if (D.CCCIsCXX) {
5522 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5523 CmdArgs.push_back("-lm");
5524 }
5525 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5526 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005527 if (Args.hasArg(options::OPT_static)) {
5528 CmdArgs.push_back("-lgcc_eh");
5529 } else {
5530 CmdArgs.push_back("--as-needed");
5531 CmdArgs.push_back("-lgcc_s");
5532 CmdArgs.push_back("--no-as-needed");
5533 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005534 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005535
5536 if (Args.hasArg(options::OPT_pthread))
5537 CmdArgs.push_back("-lpthread");
5538 CmdArgs.push_back("-lc");
5539
5540 CmdArgs.push_back("-lgcc");
5541 if (Args.hasArg(options::OPT_static)) {
5542 CmdArgs.push_back("-lgcc_eh");
5543 } else {
5544 CmdArgs.push_back("--as-needed");
5545 CmdArgs.push_back("-lgcc_s");
5546 CmdArgs.push_back("--no-as-needed");
5547 }
5548 }
5549
5550 if (!Args.hasArg(options::OPT_nostdlib) &&
5551 !Args.hasArg(options::OPT_nostartfiles)) {
5552 if (!Args.hasArg(options::OPT_shared))
5553 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5554 "crtend.o")));
5555 else
5556 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5557 "crtendS.o")));
5558 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5559 "crtn.o")));
5560 }
5561
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005562 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005563
David Chisnall5adcec12011-09-27 22:03:18 +00005564 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005565 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5566}
5567
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005568void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5569 const InputInfo &Output,
5570 const InputInfoList &Inputs,
5571 const ArgList &Args,
5572 const char *LinkingOutput) const {
5573 ArgStringList CmdArgs;
5574
5575 // Add --32/--64 to make sure we get the format we want.
5576 // This is incomplete
5577 if (getToolChain().getArch() == llvm::Triple::x86) {
5578 CmdArgs.push_back("--32");
5579 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5580 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005581 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5582 CmdArgs.push_back("-a32");
5583 CmdArgs.push_back("-mppc");
5584 CmdArgs.push_back("-many");
5585 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5586 CmdArgs.push_back("-a64");
5587 CmdArgs.push_back("-mppc64");
5588 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005589 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005590 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005591 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5592 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005593
5594 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5595 getToolChain().getTriple());
5596 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005597
5598 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5599 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5600 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005601 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5602 getToolChain().getArch() == llvm::Triple::mipsel ||
5603 getToolChain().getArch() == llvm::Triple::mips64 ||
5604 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005605 StringRef CPUName;
5606 StringRef ABIName;
5607 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005608
Simon Atanasyan073a7802012-04-07 22:31:29 +00005609 CmdArgs.push_back("-march");
5610 CmdArgs.push_back(CPUName.data());
5611
5612 // Convert ABI name to the GNU tools acceptable variant.
5613 if (ABIName == "o32")
5614 ABIName = "32";
5615 else if (ABIName == "n64")
5616 ABIName = "64";
5617
5618 CmdArgs.push_back("-mabi");
5619 CmdArgs.push_back(ABIName.data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005620
5621 if (getToolChain().getArch() == llvm::Triple::mips ||
5622 getToolChain().getArch() == llvm::Triple::mips64)
5623 CmdArgs.push_back("-EB");
5624 else
5625 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005626
5627 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5628 options::OPT_fpic, options::OPT_fno_pic,
5629 options::OPT_fPIE, options::OPT_fno_PIE,
5630 options::OPT_fpie, options::OPT_fno_pie);
5631 if (LastPICArg &&
5632 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5633 LastPICArg->getOption().matches(options::OPT_fpic) ||
5634 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5635 LastPICArg->getOption().matches(options::OPT_fpie))) {
5636 CmdArgs.push_back("-KPIC");
5637 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005638 }
5639
5640 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5641 options::OPT_Xassembler);
5642
5643 CmdArgs.push_back("-o");
5644 CmdArgs.push_back(Output.getFilename());
5645
5646 for (InputInfoList::const_iterator
5647 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5648 const InputInfo &II = *it;
5649 CmdArgs.push_back(II.getFilename());
5650 }
5651
5652 const char *Exec =
5653 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5654 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5655}
5656
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005657static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5658 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005659 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005660 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005661 Args.hasArg(options::OPT_static_libgcc);
5662 if (!D.CCCIsCXX)
5663 CmdArgs.push_back("-lgcc");
5664
5665 if (StaticLibgcc) {
5666 if (D.CCCIsCXX)
5667 CmdArgs.push_back("-lgcc");
5668 } else {
5669 if (!D.CCCIsCXX)
5670 CmdArgs.push_back("--as-needed");
5671 CmdArgs.push_back("-lgcc_s");
5672 if (!D.CCCIsCXX)
5673 CmdArgs.push_back("--no-as-needed");
5674 }
5675
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005676 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005677 CmdArgs.push_back("-lgcc_eh");
5678 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5679 CmdArgs.push_back("-lgcc");
5680}
5681
Rafael Espindolac1da9812010-11-07 20:14:31 +00005682void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5683 const InputInfo &Output,
5684 const InputInfoList &Inputs,
5685 const ArgList &Args,
5686 const char *LinkingOutput) const {
5687 const toolchains::Linux& ToolChain =
5688 static_cast<const toolchains::Linux&>(getToolChain());
5689 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005690 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chien94a71422012-09-02 09:30:11 +00005691 llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005692
Rafael Espindolac1da9812010-11-07 20:14:31 +00005693 ArgStringList CmdArgs;
5694
Rafael Espindola26f14c32010-11-15 18:28:16 +00005695 // Silence warning for "clang -g foo.o -o foo"
5696 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005697 // and "clang -emit-llvm foo.o -o foo"
5698 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00005699 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00005700 // handled somewhere else.
5701 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00005702
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005703 if (!D.SysRoot.empty())
5704 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005705
Rafael Espindolafdda1712010-11-17 22:26:15 +00005706 if (Args.hasArg(options::OPT_pie))
5707 CmdArgs.push_back("-pie");
5708
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00005709 if (Args.hasArg(options::OPT_rdynamic))
5710 CmdArgs.push_back("-export-dynamic");
5711
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00005712 if (Args.hasArg(options::OPT_s))
5713 CmdArgs.push_back("-s");
5714
Rafael Espindolac1da9812010-11-07 20:14:31 +00005715 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5716 e = ToolChain.ExtraOpts.end();
5717 i != e; ++i)
5718 CmdArgs.push_back(i->c_str());
5719
5720 if (!Args.hasArg(options::OPT_static)) {
5721 CmdArgs.push_back("--eh-frame-hdr");
5722 }
5723
5724 CmdArgs.push_back("-m");
5725 if (ToolChain.getArch() == llvm::Triple::x86)
5726 CmdArgs.push_back("elf_i386");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005727 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00005728 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005729 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005730 else if (ToolChain.getArch() == llvm::Triple::ppc)
5731 CmdArgs.push_back("elf32ppclinux");
5732 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5733 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00005734 else if (ToolChain.getArch() == llvm::Triple::mips)
5735 CmdArgs.push_back("elf32btsmip");
5736 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5737 CmdArgs.push_back("elf32ltsmip");
5738 else if (ToolChain.getArch() == llvm::Triple::mips64)
5739 CmdArgs.push_back("elf64btsmip");
5740 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5741 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005742 else
5743 CmdArgs.push_back("elf_x86_64");
5744
5745 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00005746 if (ToolChain.getArch() == llvm::Triple::arm
5747 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005748 CmdArgs.push_back("-Bstatic");
5749 else
5750 CmdArgs.push_back("-static");
5751 } else if (Args.hasArg(options::OPT_shared)) {
5752 CmdArgs.push_back("-shared");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005753 if ((ToolChain.getArch() == llvm::Triple::arm
5754 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5755 CmdArgs.push_back("-Bsymbolic");
5756 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005757 }
5758
5759 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00005760 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00005761 (!Args.hasArg(options::OPT_static) &&
5762 !Args.hasArg(options::OPT_shared))) {
5763 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005764 if (isAndroid)
5765 CmdArgs.push_back("/system/bin/linker");
5766 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005767 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregorf0594d82011-03-06 19:11:49 +00005768 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liu6cc9dc82012-07-30 11:05:56 +00005769 ToolChain.getArch() == llvm::Triple::thumb) {
5770 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5771 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5772 else
5773 CmdArgs.push_back("/lib/ld-linux.so.3");
5774 }
Eli Friedman5bea4f62011-11-08 19:43:37 +00005775 else if (ToolChain.getArch() == llvm::Triple::mips ||
5776 ToolChain.getArch() == llvm::Triple::mipsel)
5777 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan8491cb22012-04-06 20:14:27 +00005778 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5779 ToolChain.getArch() == llvm::Triple::mips64el)
5780 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005781 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005782 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005783 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005784 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005785 else
5786 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5787 }
5788
5789 CmdArgs.push_back("-o");
5790 CmdArgs.push_back(Output.getFilename());
5791
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005792 if (!Args.hasArg(options::OPT_nostdlib) &&
5793 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005794 if (!isAndroid) {
5795 const char *crt1 = NULL;
5796 if (!Args.hasArg(options::OPT_shared)){
5797 if (Args.hasArg(options::OPT_pie))
5798 crt1 = "Scrt1.o";
5799 else
5800 crt1 = "crt1.o";
5801 }
5802 if (crt1)
5803 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005804
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005805 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5806 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005807
Rafael Espindola89414b32010-11-12 03:00:39 +00005808 const char *crtbegin;
5809 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005810 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005811 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005812 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005813 else if (Args.hasArg(options::OPT_pie))
5814 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005815 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005816 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005817 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5818 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005819
5820 Args.AddAllArgs(CmdArgs, options::OPT_L);
5821
5822 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5823
Roman Divacky58e5ac92011-03-01 17:53:14 +00005824 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5825 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005826 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005827
Rafael Espindolac5151542012-04-09 23:53:34 +00005828 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5829 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5830 // forward.
5831 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5832 CmdArgs.push_back("-plugin");
5833 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5834 CmdArgs.push_back(Args.MakeArgString(Plugin));
5835 }
5836
Nick Lewyckye276cfc2012-08-17 03:39:16 +00005837 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5838 CmdArgs.push_back("--no-demangle");
5839
Rafael Espindolac1da9812010-11-07 20:14:31 +00005840 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5841
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005842 if (D.CCCIsCXX &&
5843 !Args.hasArg(options::OPT_nostdlib) &&
5844 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00005845 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5846 !Args.hasArg(options::OPT_static);
5847 if (OnlyLibstdcxxStatic)
5848 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005849 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00005850 if (OnlyLibstdcxxStatic)
5851 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005852 CmdArgs.push_back("-lm");
5853 }
5854
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005855 // Call this before we add the C run-time.
5856 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00005857 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005858
Rafael Espindola89414b32010-11-12 03:00:39 +00005859 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005860 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5861 if (Args.hasArg(options::OPT_static))
5862 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00005863
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005864 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00005865
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005866 if (Args.hasArg(options::OPT_pthread) ||
5867 Args.hasArg(options::OPT_pthreads))
5868 CmdArgs.push_back("-lpthread");
5869
5870 CmdArgs.push_back("-lc");
5871
5872 if (Args.hasArg(options::OPT_static))
5873 CmdArgs.push_back("--end-group");
5874 else
5875 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5876 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00005877
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005878 if (!Args.hasArg(options::OPT_nostartfiles)) {
5879 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005880 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005881 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005882 else if (Args.hasArg(options::OPT_pie))
5883 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005884 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005885 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005886
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005887 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005888 if (!isAndroid)
5889 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005890 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005891 }
5892
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005893 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005894
Rafael Espindolac1da9812010-11-07 20:14:31 +00005895 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5896}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005897
Chris Lattner38e317d2010-07-07 16:01:42 +00005898void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005899 const InputInfo &Output,
5900 const InputInfoList &Inputs,
5901 const ArgList &Args,
5902 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005903 ArgStringList CmdArgs;
5904
5905 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5906 options::OPT_Xassembler);
5907
5908 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005909 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005910
5911 for (InputInfoList::const_iterator
5912 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5913 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005914 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005915 }
5916
5917 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00005918 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005919 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005920}
5921
5922void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005923 const InputInfo &Output,
5924 const InputInfoList &Inputs,
5925 const ArgList &Args,
5926 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005927 const Driver &D = getToolChain().getDriver();
5928 ArgStringList CmdArgs;
5929
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005930 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005931 CmdArgs.push_back("-o");
5932 CmdArgs.push_back(Output.getFilename());
5933 } else {
5934 assert(Output.isNothing() && "Invalid output.");
5935 }
5936
5937 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00005938 !Args.hasArg(options::OPT_nostartfiles)) {
5939 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5940 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5941 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5942 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5943 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005944
5945 Args.AddAllArgs(CmdArgs, options::OPT_L);
5946 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5947 Args.AddAllArgs(CmdArgs, options::OPT_e);
5948
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005949 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005950
Eli Friedman6d402dc2011-12-08 23:54:21 +00005951 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5952
Chris Lattner38e317d2010-07-07 16:01:42 +00005953 if (!Args.hasArg(options::OPT_nostdlib) &&
5954 !Args.hasArg(options::OPT_nodefaultlibs)) {
5955 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005956 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005957 CmdArgs.push_back("-lm");
5958 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005959 }
5960
5961 if (!Args.hasArg(options::OPT_nostdlib) &&
5962 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00005963 if (Args.hasArg(options::OPT_pthread))
5964 CmdArgs.push_back("-lpthread");
5965 CmdArgs.push_back("-lc");
5966 CmdArgs.push_back("-lCompilerRT-Generic");
5967 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5968 CmdArgs.push_back(
5969 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005970 }
5971
Eli Friedman6d402dc2011-12-08 23:54:21 +00005972 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005973 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005974}
5975
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005976/// DragonFly Tools
5977
5978// For now, DragonFly Assemble does just about the same as for
5979// FreeBSD, but this may change soon.
5980void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005981 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005982 const InputInfoList &Inputs,
5983 const ArgList &Args,
5984 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005985 ArgStringList CmdArgs;
5986
5987 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5988 // instruct as in the base system to assemble 32-bit code.
5989 if (getToolChain().getArchName() == "i386")
5990 CmdArgs.push_back("--32");
5991
5992 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5993 options::OPT_Xassembler);
5994
5995 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005996 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005997
5998 for (InputInfoList::const_iterator
5999 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6000 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006001 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006002 }
6003
6004 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006005 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006006 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006007}
6008
6009void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006010 const InputInfo &Output,
6011 const InputInfoList &Inputs,
6012 const ArgList &Args,
6013 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006014 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006015 ArgStringList CmdArgs;
6016
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006017 if (!D.SysRoot.empty())
6018 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6019
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006020 if (Args.hasArg(options::OPT_static)) {
6021 CmdArgs.push_back("-Bstatic");
6022 } else {
6023 if (Args.hasArg(options::OPT_shared))
6024 CmdArgs.push_back("-Bshareable");
6025 else {
6026 CmdArgs.push_back("-dynamic-linker");
6027 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6028 }
6029 }
6030
6031 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6032 // instruct ld in the base system to link 32-bit code.
6033 if (getToolChain().getArchName() == "i386") {
6034 CmdArgs.push_back("-m");
6035 CmdArgs.push_back("elf_i386");
6036 }
6037
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006038 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006039 CmdArgs.push_back("-o");
6040 CmdArgs.push_back(Output.getFilename());
6041 } else {
6042 assert(Output.isNothing() && "Invalid output.");
6043 }
6044
6045 if (!Args.hasArg(options::OPT_nostdlib) &&
6046 !Args.hasArg(options::OPT_nostartfiles)) {
6047 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006048 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006049 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006050 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006051 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006052 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006053 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006054 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00006055 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006056 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006057 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006058 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006059 }
6060 }
6061
6062 Args.AddAllArgs(CmdArgs, options::OPT_L);
6063 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6064 Args.AddAllArgs(CmdArgs, options::OPT_e);
6065
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006066 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006067
6068 if (!Args.hasArg(options::OPT_nostdlib) &&
6069 !Args.hasArg(options::OPT_nodefaultlibs)) {
6070 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6071 // rpaths
6072 CmdArgs.push_back("-L/usr/lib/gcc41");
6073
6074 if (!Args.hasArg(options::OPT_static)) {
6075 CmdArgs.push_back("-rpath");
6076 CmdArgs.push_back("/usr/lib/gcc41");
6077
6078 CmdArgs.push_back("-rpath-link");
6079 CmdArgs.push_back("/usr/lib/gcc41");
6080
6081 CmdArgs.push_back("-rpath");
6082 CmdArgs.push_back("/usr/lib");
6083
6084 CmdArgs.push_back("-rpath-link");
6085 CmdArgs.push_back("/usr/lib");
6086 }
6087
Rafael Espindola405861d2010-07-20 12:59:03 +00006088 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006089 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006090 CmdArgs.push_back("-lm");
6091 }
6092
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006093 if (Args.hasArg(options::OPT_shared)) {
6094 CmdArgs.push_back("-lgcc_pic");
6095 } else {
6096 CmdArgs.push_back("-lgcc");
6097 }
6098
6099
6100 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006101 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006102
6103 if (!Args.hasArg(options::OPT_nolibc)) {
6104 CmdArgs.push_back("-lc");
6105 }
6106
6107 if (Args.hasArg(options::OPT_shared)) {
6108 CmdArgs.push_back("-lgcc_pic");
6109 } else {
6110 CmdArgs.push_back("-lgcc");
6111 }
6112 }
6113
6114 if (!Args.hasArg(options::OPT_nostdlib) &&
6115 !Args.hasArg(options::OPT_nostartfiles)) {
6116 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006117 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006118 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006119 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006120 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006121 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006122 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006123 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006124 }
6125
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006126 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006127
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006128 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006129 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006130 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006131}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006132
6133void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6134 const InputInfo &Output,
6135 const InputInfoList &Inputs,
6136 const ArgList &Args,
6137 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006138 ArgStringList CmdArgs;
6139
6140 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006141 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6142 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006143 } else {
6144 assert(Output.isNothing() && "Invalid output.");
6145 }
6146
6147 if (!Args.hasArg(options::OPT_nostdlib) &&
6148 !Args.hasArg(options::OPT_nostartfiles)) {
6149 CmdArgs.push_back("-defaultlib:libcmt");
6150 }
6151
6152 CmdArgs.push_back("-nologo");
6153
Michael J. Spencera2284f52012-06-18 16:56:04 +00006154 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6155
6156 // Add filenames immediately.
6157 for (InputInfoList::const_iterator
6158 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6159 if (it->isFilename())
6160 CmdArgs.push_back(it->getFilename());
6161 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006162
6163 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006164 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006165 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6166}