blob: 760fc8bd9e3f28dc42b6242d7bd451b1ea08beae [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();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +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) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +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
Richard Smith4def70d2012-10-09 19:52:38 +00001469/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1470/// (Linux).
1471static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1472 ArgStringList &CmdArgs) {
1473 if (!Args.hasArg(options::OPT_fcatch_undefined_behavior))
1474 return;
1475 if (!Args.hasArg(options::OPT_shared)) {
1476 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1477 // resource directory.
1478 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1479 llvm::sys::path::append(LibUbsan, "lib", "linux",
1480 (Twine("libclang_rt.ubsan-") +
1481 TC.getArchName() + ".a"));
1482 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
1483 }
1484}
1485
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001486static bool shouldUseFramePointer(const ArgList &Args,
1487 const llvm::Triple &Triple) {
1488 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1489 options::OPT_fomit_frame_pointer))
1490 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1491
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001492 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001493 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1494 Triple.getArch() == llvm::Triple::x86) &&
1495 Triple.getOS() == llvm::Triple::Linux) {
1496 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1497 if (!A->getOption().matches(options::OPT_O0))
1498 return false;
1499 }
1500
1501 return true;
1502}
1503
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001504void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001505 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001506 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001507 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001508 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001509 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1510 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001511 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001512 ArgStringList CmdArgs;
1513
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001514 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1515
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001516 // Invoke ourselves in -cc1 mode.
1517 //
1518 // FIXME: Implement custom jobs for internal actions.
1519 CmdArgs.push_back("-cc1");
1520
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001521 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001522 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001523 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001524 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001525
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001526 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001527 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001528
Daniel Dunbar1d460332009-03-18 10:01:51 +00001529 if (isa<AnalyzeJobAction>(JA)) {
1530 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1531 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001532 } else if (isa<MigrateJobAction>(JA)) {
1533 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001534 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001535 if (Output.getType() == types::TY_Dependencies)
1536 CmdArgs.push_back("-Eonly");
1537 else
1538 CmdArgs.push_back("-E");
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001539 } else if (isa<AssembleJobAction>(JA)) {
1540 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001541
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001542 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001543 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001544
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001545 // When using an integrated assembler, translate -Wa, and -Xassembler
1546 // options.
1547 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1548 options::OPT_Xassembler),
1549 ie = Args.filtered_end(); it != ie; ++it) {
1550 const Arg *A = *it;
1551 A->claim();
1552
1553 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001554 StringRef Value = A->getValue(Args, i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001555
1556 if (Value == "-force_cpusubtype_ALL") {
1557 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001558 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001559 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001560 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001561 CmdArgs.push_back("-mllvm");
1562 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001563 } else if (Value == "--noexecstack") {
1564 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001565 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001566 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001567 << A->getOption().getName() << Value;
1568 }
1569 }
1570 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001571
1572 // Also ignore explicit -force_cpusubtype_ALL option.
1573 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001574 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001575 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001576 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001577
Aaron Ballman761322b2012-07-31 01:21:00 +00001578 if (JA.getType() == types::TY_Nothing)
1579 CmdArgs.push_back("-fsyntax-only");
1580 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001581 CmdArgs.push_back("-emit-pch");
1582 else
1583 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001584 } else {
1585 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001586
Daniel Dunbar1d460332009-03-18 10:01:51 +00001587 if (JA.getType() == types::TY_Nothing) {
1588 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001589 } else if (JA.getType() == types::TY_LLVM_IR ||
1590 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001591 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001592 } else if (JA.getType() == types::TY_LLVM_BC ||
1593 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001594 CmdArgs.push_back("-emit-llvm-bc");
1595 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001596 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001597 } else if (JA.getType() == types::TY_AST) {
1598 CmdArgs.push_back("-emit-pch");
Daniel Dunbar64952502010-02-11 03:16:21 +00001599 } else if (JA.getType() == types::TY_RewrittenObjC) {
1600 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001601 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001602 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1603 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001604 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001605 } else {
1606 assert(JA.getType() == types::TY_PP_Asm &&
1607 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001608 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001609 }
1610
Daniel Dunbar1d460332009-03-18 10:01:51 +00001611 // The make clang go fast button.
1612 CmdArgs.push_back("-disable-free");
1613
John McCallb689afb2010-02-13 03:50:24 +00001614 // Disable the verification pass in -asserts builds.
1615#ifdef NDEBUG
1616 CmdArgs.push_back("-disable-llvm-verifier");
1617#endif
1618
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001619 // Set the main file name, so that debug info works even with
1620 // -save-temps.
1621 CmdArgs.push_back("-main-file-name");
1622 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1623
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001624 // Some flags which affect the language (via preprocessor
1625 // defines). See darwin::CC1::AddCPPArgs.
1626 if (Args.hasArg(options::OPT_static))
1627 CmdArgs.push_back("-static-define");
1628
Daniel Dunbar1d460332009-03-18 10:01:51 +00001629 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001630 // Enable region store model by default.
1631 CmdArgs.push_back("-analyzer-store=region");
1632
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001633 // Treat blocks as analysis entry points.
1634 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1635
Ted Kremenek51885072011-03-24 00:28:47 +00001636 CmdArgs.push_back("-analyzer-eagerly-assume");
1637
Daniel Dunbar1d460332009-03-18 10:01:51 +00001638 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001639 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001640 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001641
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001642 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1643 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001644
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001645 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001646 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001647
1648 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001649
1650 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00001651 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1652 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1653 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1654 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1655 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1656 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001657 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001658
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001659 // Set the output format. The default is plist, for (lame) historical
1660 // reasons.
1661 CmdArgs.push_back("-analyzer-output");
1662 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1663 CmdArgs.push_back(A->getValue(Args));
1664 else
1665 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001666
Ted Kremenek0647a7b2010-03-22 22:32:05 +00001667 // Disable the presentation of standard compiler warnings when
1668 // using --analyze. We only want to show static analyzer diagnostics
1669 // or frontend errors.
1670 CmdArgs.push_back("-w");
1671
Daniel Dunbar1d460332009-03-18 10:01:51 +00001672 // Add -Xanalyzer arguments when running as analyzer.
1673 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00001674 }
1675
Daniel Dunbare2fd6642009-09-10 01:21:12 +00001676 CheckCodeGenerationOptions(D, Args);
1677
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001678 // Perform argument translation for LLVM backend. This
1679 // takes some care in reconciling with llvm-gcc. The
1680 // issue is that llvm-gcc translates these options based on
1681 // the values in cc1, whereas we are processing based on
1682 // the driver arguments.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001683
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001684 // This comes from the default translation the driver + cc1
1685 // would do to enable flag_pic.
Simon Atanasyan003ab662012-05-29 18:50:33 +00001686
1687 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1688 options::OPT_fpic, options::OPT_fno_pic,
1689 options::OPT_fPIE, options::OPT_fno_PIE,
1690 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001691 bool PICDisabled = false;
1692 bool PICEnabled = false;
1693 bool PICForPIE = false;
1694 if (LastPICArg) {
1695 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1696 LastPICArg->getOption().matches(options::OPT_fpie));
1697 PICEnabled = (PICForPIE ||
1698 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1699 LastPICArg->getOption().matches(options::OPT_fpic));
1700 PICDisabled = !PICEnabled;
1701 }
1702 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1703 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00001704 llvm::Triple Triple(TripleStr);
1705 if ((Args.hasArg(options::OPT_mkernel) ||
1706 Args.hasArg(options::OPT_fapple_kext)) &&
1707 (Triple.getOS() != llvm::Triple::IOS ||
1708 Triple.isOSVersionLT(6)))
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001709 PICDisabled = true;
1710 if (Args.hasArg(options::OPT_static))
1711 PICDisabled = true;
1712 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1713
1714 // Select the relocation model.
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001715 const char *Model = getToolChain().GetForcedPicModel();
1716 if (!Model) {
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001717 if (DynamicNoPIC)
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001718 Model = "dynamic-no-pic";
1719 else if (PICDisabled)
1720 Model = "static";
1721 else if (PICEnabled)
1722 Model = "pic";
Daniel Dunbar1d460332009-03-18 10:01:51 +00001723 else
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001724 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbar1d460332009-03-18 10:01:51 +00001725 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001726 StringRef ModelStr = Model ? Model : "";
1727 if (Model && ModelStr != "pic") {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001728 CmdArgs.push_back("-mrelocation-model");
1729 CmdArgs.push_back(Model);
1730 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001731
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001732 // Infer the __PIC__ and __PIE__ values.
1733 if (ModelStr == "pic" && PICForPIE) {
1734 CmdArgs.push_back("-pie-level");
1735 CmdArgs.push_back((LastPICArg &&
1736 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1737 "2" : "1");
1738 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar76743522009-11-29 02:39:08 +00001739 CmdArgs.push_back("-pic-level");
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001740 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1741 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1742 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001743 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001744
Tanya Lattner59876c22009-11-04 01:18:09 +00001745 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1746 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00001747 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001748
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001749 // LLVM Code Generator Options.
1750
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001751 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1752 CmdArgs.push_back("-mregparm");
1753 CmdArgs.push_back(A->getValue(Args));
1754 }
1755
Roman Divackycfe9af22011-03-01 17:40:53 +00001756 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1757 CmdArgs.push_back("-mrtd");
1758
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001759 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001760 CmdArgs.push_back("-mdisable-fp-elim");
1761 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1762 options::OPT_fno_zero_initialized_in_bss))
1763 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar398c6102011-02-04 02:20:39 +00001764 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1765 options::OPT_fno_strict_aliasing,
1766 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00001767 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00001768 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1769 false))
1770 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00001771 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1772 options::OPT_fno_optimize_sibling_calls))
1773 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001774
Chandler Carruthabf07a72012-01-02 14:19:45 +00001775 // Handle various floating point optimization flags, mapping them to the
1776 // appropriate LLVM code generation flags. The pattern for all of these is to
1777 // default off the codegen optimizations, and if any flag enables them and no
1778 // flag disables them after the flag enabling them, enable the codegen
1779 // optimization. This is complicated by several "umbrella" flags.
1780 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001781 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001782 options::OPT_ffinite_math_only,
1783 options::OPT_fno_finite_math_only,
1784 options::OPT_fhonor_infinities,
1785 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001786 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1787 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001788 A->getOption().getID() != options::OPT_fhonor_infinities)
1789 CmdArgs.push_back("-menable-no-infs");
1790 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001791 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001792 options::OPT_ffinite_math_only,
1793 options::OPT_fno_finite_math_only,
1794 options::OPT_fhonor_nans,
1795 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001796 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1797 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001798 A->getOption().getID() != options::OPT_fhonor_nans)
1799 CmdArgs.push_back("-menable-no-nans");
1800
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00001801 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1802 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruthabf07a72012-01-02 14:19:45 +00001803 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001804 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001805 options::OPT_fmath_errno,
Chandler Carruth4f50c502012-04-26 02:10:51 +00001806 options::OPT_fno_math_errno))
1807 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1808 if (MathErrno)
1809 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001810
1811 // There are several flags which require disabling very specific
1812 // optimizations. Any of these being disabled forces us to turn off the
1813 // entire set of LLVM optimizations, so collect them through all the flag
1814 // madness.
1815 bool AssociativeMath = false;
1816 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001817 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001818 options::OPT_funsafe_math_optimizations,
1819 options::OPT_fno_unsafe_math_optimizations,
1820 options::OPT_fassociative_math,
1821 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001822 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1823 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001824 A->getOption().getID() != options::OPT_fno_associative_math)
1825 AssociativeMath = true;
1826 bool ReciprocalMath = false;
1827 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001828 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001829 options::OPT_funsafe_math_optimizations,
1830 options::OPT_fno_unsafe_math_optimizations,
1831 options::OPT_freciprocal_math,
1832 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001833 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1834 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001835 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1836 ReciprocalMath = true;
1837 bool SignedZeros = true;
1838 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001839 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001840 options::OPT_funsafe_math_optimizations,
1841 options::OPT_fno_unsafe_math_optimizations,
1842 options::OPT_fsigned_zeros,
1843 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001844 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1845 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001846 A->getOption().getID() != options::OPT_fsigned_zeros)
1847 SignedZeros = false;
1848 bool TrappingMath = true;
1849 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001850 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001851 options::OPT_funsafe_math_optimizations,
1852 options::OPT_fno_unsafe_math_optimizations,
1853 options::OPT_ftrapping_math,
1854 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001855 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1856 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001857 A->getOption().getID() != options::OPT_ftrapping_math)
1858 TrappingMath = false;
1859 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1860 !TrappingMath)
1861 CmdArgs.push_back("-menable-unsafe-fp-math");
1862
Lang Hamesc9686712012-07-06 00:59:19 +00001863
1864 // Validate and pass through -fp-contract option.
1865 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001866 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00001867 options::OPT_ffp_contract)) {
1868 if (A->getOption().getID() == options::OPT_ffp_contract) {
1869 StringRef Val = A->getValue(Args);
1870 if (Val == "fast" || Val == "on" || Val == "off") {
1871 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1872 } else {
1873 D.Diag(diag::err_drv_unsupported_option_argument)
1874 << A->getOption().getName() << Val;
1875 }
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001876 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesc9686712012-07-06 00:59:19 +00001877 // If fast-math is set then set the fp-contract mode to fast.
1878 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1879 }
1880 }
1881
Bob Wilson455e72e2012-07-19 03:52:53 +00001882 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1883 // and if we find them, tell the frontend to provide the appropriate
1884 // preprocessor macros. This is distinct from enabling any optimizations as
1885 // these options induce language changes which must survive serialization
1886 // and deserialization, etc.
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001887 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1888 if (A->getOption().matches(options::OPT_ffast_math))
1889 CmdArgs.push_back("-ffast-math");
1890 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1891 if (A->getOption().matches(options::OPT_ffinite_math_only))
1892 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001893
Daniel Dunbar1b718482010-05-14 22:00:22 +00001894 // Decide whether to use verbose asm. Verbose assembly is the default on
1895 // toolchains which have the integrated assembler on by default.
1896 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1897 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00001898 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00001899 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001900 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001901
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001902 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1903 CmdArgs.push_back("-mdebug-pass");
1904 CmdArgs.push_back("Structure");
1905 }
1906 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1907 CmdArgs.push_back("-mdebug-pass");
1908 CmdArgs.push_back("Arguments");
1909 }
1910
John McCalld0c2ec42010-02-19 02:45:38 +00001911 // Enable -mconstructor-aliases except on darwin, where we have to
1912 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00001913 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00001914 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00001915
John McCall32096692011-03-18 02:56:14 +00001916 // Darwin's kernel doesn't support guard variables; just die if we
1917 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00001918 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00001919 CmdArgs.push_back("-fforbid-guard-variables");
1920
Douglas Gregor6f755502011-02-01 15:15:22 +00001921 if (Args.hasArg(options::OPT_mms_bitfields)) {
1922 CmdArgs.push_back("-mms-bitfields");
1923 }
John McCalld0c2ec42010-02-19 02:45:38 +00001924
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001925 // This is a coarse approximation of what llvm-gcc actually does, both
1926 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1927 // complicated ways.
1928 bool AsynchronousUnwindTables =
1929 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1930 options::OPT_fno_asynchronous_unwind_tables,
1931 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001932 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001933 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1934 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001935 CmdArgs.push_back("-munwind-tables");
1936
Rafael Espindola8af669f2012-06-19 01:26:10 +00001937 getToolChain().addClangTargetOptions(CmdArgs);
1938
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001939 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1940 CmdArgs.push_back("-mlimit-float-precision");
1941 CmdArgs.push_back(A->getValue(Args));
1942 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001943
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001944 // FIXME: Handle -mtune=.
1945 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001946
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001947 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001948 CmdArgs.push_back("-mcode-model");
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001949 CmdArgs.push_back(A->getValue(Args));
1950 }
1951
Daniel Dunbar6acda162009-09-09 22:33:08 +00001952 // Add target specific cpu and features flags.
1953 switch(getToolChain().getTriple().getArch()) {
1954 default:
1955 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001956
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001957 case llvm::Triple::arm:
1958 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00001959 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001960 break;
1961
Eric Christophered734732010-03-02 02:41:08 +00001962 case llvm::Triple::mips:
1963 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00001964 case llvm::Triple::mips64:
1965 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00001966 AddMIPSTargetArgs(Args, CmdArgs);
1967 break;
1968
Hal Finkel02a84272012-06-11 22:35:19 +00001969 case llvm::Triple::ppc:
1970 case llvm::Triple::ppc64:
1971 AddPPCTargetArgs(Args, CmdArgs);
1972 break;
1973
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001974 case llvm::Triple::sparc:
1975 AddSparcTargetArgs(Args, CmdArgs);
1976 break;
1977
Daniel Dunbar6acda162009-09-09 22:33:08 +00001978 case llvm::Triple::x86:
1979 case llvm::Triple::x86_64:
1980 AddX86TargetArgs(Args, CmdArgs);
1981 break;
Tony Linthicum96319392011-12-12 21:14:55 +00001982
1983 case llvm::Triple::hexagon:
1984 AddHexagonTargetArgs(Args, CmdArgs);
1985 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001986 }
1987
Tony Linthicum96319392011-12-12 21:14:55 +00001988
1989
Daniel Dunbarc176bc62010-08-11 23:07:47 +00001990 // Pass the linker version in use.
1991 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1992 CmdArgs.push_back("-target-linker-version");
1993 CmdArgs.push_back(A->getValue(Args));
1994 }
1995
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001996 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbar1ad66482010-07-01 01:31:45 +00001997 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001998 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson905c45f2011-10-14 05:03:44 +00001999 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002000 CmdArgs.push_back("-momit-leaf-frame-pointer");
2001
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002002 // Explicitly error on some things we know we don't support and can't just
2003 // ignore.
2004 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002005 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2006 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002007 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002008 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00002009 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002010 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2011 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002012 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002013 << Unsupported->getOption().getName();
2014 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002015 }
2016
Daniel Dunbar1d460332009-03-18 10:01:51 +00002017 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002018 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002019 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002020 CmdArgs.push_back("-header-include-file");
2021 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2022 D.CCPrintHeadersFilename : "-");
2023 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002024 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002025 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002026
Chad Rosier2b819102011-08-02 17:58:04 +00002027 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002028 CmdArgs.push_back("-diagnostic-log-file");
2029 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2030 D.CCLogDiagnosticsFilename : "-");
2031 }
2032
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002033 // Use the last option from "-g" group. "-gline-tables-only" is
2034 // preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002035 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002036 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2037 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2038 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002039 } else if (!A->getOption().matches(options::OPT_g0) &&
2040 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00002041 CmdArgs.push_back("-g");
Chad Rosier2875bda2011-11-04 19:28:44 +00002042 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002043 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002044
Alexey Samsonov7f326072012-06-21 08:22:39 +00002045 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2046 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2047
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002048 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2049 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2050
Chris Lattner7255a2d2010-06-22 00:03:40 +00002051 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2052
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002053 if (Args.hasArg(options::OPT_ftest_coverage) ||
2054 Args.hasArg(options::OPT_coverage))
2055 CmdArgs.push_back("-femit-coverage-notes");
2056 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2057 Args.hasArg(options::OPT_coverage))
2058 CmdArgs.push_back("-femit-coverage-data");
2059
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002060 if (C.getArgs().hasArg(options::OPT_c) ||
2061 C.getArgs().hasArg(options::OPT_S)) {
2062 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002063 CmdArgs.push_back("-coverage-file");
Bill Wendlingecbbea42012-08-30 00:43:41 +00002064 SmallString<128> absFilename(Output.getFilename());
2065 llvm::sys::fs::make_absolute(absFilename);
2066 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002067 }
2068 }
2069
Daniel Dunbara268fc02011-10-11 18:20:10 +00002070 // Pass options for controlling the default header search paths.
2071 if (Args.hasArg(options::OPT_nostdinc)) {
2072 CmdArgs.push_back("-nostdsysteminc");
2073 CmdArgs.push_back("-nobuiltininc");
2074 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002075 if (Args.hasArg(options::OPT_nostdlibinc))
2076 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002077 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2078 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2079 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002080
Daniel Dunbar5f122322009-12-15 01:02:52 +00002081 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002082 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002083 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002084
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002085 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2086
Ted Kremenek30660a82012-03-06 20:06:33 +00002087 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002088 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002089 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002090 options::OPT_ccc_arcmt_modify,
2091 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002092 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002093 switch (A->getOption().getID()) {
2094 default:
2095 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002096 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002097 CmdArgs.push_back("-arcmt-check");
2098 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002099 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002100 CmdArgs.push_back("-arcmt-modify");
2101 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002102 case options::OPT_ccc_arcmt_migrate:
2103 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002104 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002105 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002106
2107 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2108 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002109 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002110 }
2111 }
2112 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002113
Ted Kremenek30660a82012-03-06 20:06:33 +00002114 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2115 if (ARCMTEnabled) {
2116 D.Diag(diag::err_drv_argument_not_allowed_with)
2117 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2118 }
2119 CmdArgs.push_back("-mt-migrate-directory");
2120 CmdArgs.push_back(A->getValue(Args));
2121
2122 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2123 options::OPT_objcmt_migrate_subscripting)) {
2124 // None specified, means enable them all.
2125 CmdArgs.push_back("-objcmt-migrate-literals");
2126 CmdArgs.push_back("-objcmt-migrate-subscripting");
2127 } else {
2128 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2129 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2130 }
2131 }
2132
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002133 // Add preprocessing options like -I, -D, etc. if we are using the
2134 // preprocessor.
2135 //
2136 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002137 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne54db68b2011-11-06 00:40:05 +00002138 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002139
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002140 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2141 // that "The compiler can only warn and ignore the option if not recognized".
2142 // When building with ccache, it will pass -D options to clang even on
2143 // preprocessed inputs and configure concludes that -fPIC is not supported.
2144 Args.ClaimAllArgs(options::OPT_D);
2145
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002146 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002147 // others.
2148 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002149 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002150 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002151 else if (A->getOption().matches(options::OPT_O) &&
2152 A->getValue(Args)[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002153 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002154 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002155 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002156 }
2157
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002158 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002159 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2160 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002161 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002162 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002163
2164 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2165 // (-ansi is equivalent to -std=c89).
2166 //
2167 // If a std is supplied, only add -trigraphs if it follows the
2168 // option.
2169 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2170 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002171 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002172 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002173 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002174 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002175 else
2176 Std->render(Args, CmdArgs);
2177
Daniel Dunbar0e100312010-06-14 21:23:08 +00002178 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2179 options::OPT_trigraphs))
2180 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002181 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002182 } else {
2183 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002184 //
2185 // FIXME: Clang doesn't correctly handle -std= when the input language
2186 // doesn't match. For the time being just ignore this for C++ inputs;
2187 // eventually we want to do all the standard defaulting here instead of
2188 // splitting it between the driver and clang -cc1.
2189 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002190 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2191 "-std=", /*Joined=*/true);
2192 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2193 CmdArgs.push_back("-std=c++11");
2194
Daniel Dunbard573d262009-04-07 22:13:21 +00002195 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002196 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002197
Chandler Carruth50465d12011-04-23 06:30:43 +00002198 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2199 // '-fconst-strings'; this better indicates its actual behavior.
2200 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2201 false)) {
2202 // For perfect compatibility with GCC, we do this even in the presence of
2203 // '-w'. This flag names something other than a warning for GCC.
2204 CmdArgs.push_back("-fconst-strings");
2205 }
2206
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002207 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002208 // during C++ compilation, which it is by default. GCC keeps this define even
2209 // in the presence of '-w', match this behavior bug-for-bug.
2210 if (types::isCXX(InputType) &&
2211 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2212 true)) {
2213 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002214 }
2215
Chandler Carruthc304ba32010-05-22 02:21:53 +00002216 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2217 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2218 if (Asm->getOption().matches(options::OPT_fasm))
2219 CmdArgs.push_back("-fgnu-keywords");
2220 else
2221 CmdArgs.push_back("-fno-gnu-keywords");
2222 }
2223
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002224 if (ShouldDisableCFI(Args, getToolChain()))
2225 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002226
Nick Lewyckyea523d72011-10-17 23:05:52 +00002227 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2228 CmdArgs.push_back("-fno-dwarf-directory-asm");
2229
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002230 if (const char *pwd = ::getenv("PWD")) {
2231 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2232 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumi813a4072011-10-22 10:25:25 +00002233 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002234 std::string CompDir = pwd;
2235 CmdArgs.push_back("-fdebug-compilation-dir");
2236 CmdArgs.push_back(Args.MakeArgString(CompDir));
2237 }
2238 }
2239
Richard Smithc18c4232011-11-21 19:36:32 +00002240 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2241 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002242 CmdArgs.push_back("-ftemplate-depth");
2243 CmdArgs.push_back(A->getValue(Args));
2244 }
2245
Richard Smithc18c4232011-11-21 19:36:32 +00002246 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2247 CmdArgs.push_back("-fconstexpr-depth");
2248 CmdArgs.push_back(A->getValue(Args));
2249 }
2250
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002251 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2252 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002253 if (A->getNumValues()) {
2254 StringRef bytes = A->getValue(Args);
2255 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2256 } else
2257 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002258 }
2259
Nuno Lopesb3198a82012-05-08 22:10:46 +00002260 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2261 options::OPT_fbounds_checking_EQ)) {
2262 if (A->getNumValues()) {
2263 StringRef val = A->getValue(Args);
2264 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2265 } else
2266 CmdArgs.push_back("-fbounds-checking=1");
2267 }
2268
Daniel Dunbare4bdae72009-11-19 04:00:53 +00002269 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002270 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002271
Daniel Dunbar294691e2009-11-04 06:24:38 +00002272 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2273 CmdArgs.push_back("-fconstant-string-class");
2274 CmdArgs.push_back(A->getValue(Args));
2275 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002276
Chris Lattner124fca52010-01-09 21:54:33 +00002277 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2278 CmdArgs.push_back("-ftabstop");
2279 CmdArgs.push_back(A->getValue(Args));
2280 }
2281
Chris Lattner0f0c9632010-04-07 20:49:23 +00002282 CmdArgs.push_back("-ferror-limit");
2283 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2284 CmdArgs.push_back(A->getValue(Args));
2285 else
2286 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002287
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002288 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2289 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregor6c1cb992010-05-04 17:13:42 +00002290 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002291 }
2292
2293 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2294 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregor575cf372010-04-20 07:18:24 +00002295 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002296 }
2297
Richard Smith08d6e032011-12-16 19:06:07 +00002298 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2299 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2300 CmdArgs.push_back(A->getValue(Args));
2301 }
2302
Daniel Dunbar55efe142009-11-04 06:24:47 +00002303 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002304 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002305 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbara28690e2009-11-30 08:40:54 +00002306 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002307 } else {
2308 // If -fmessage-length=N was not specified, determine whether this is a
2309 // terminal and, if so, implicitly define -fmessage-length appropriately.
2310 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002311 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002312 }
2313
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002314 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2315 CmdArgs.push_back("-fvisibility");
2316 CmdArgs.push_back(A->getValue(Args));
2317 }
2318
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002319 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002320
Hans Wennborgde981f32012-06-28 08:01:44 +00002321 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2322
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002323 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002324 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2325 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002326 CmdArgs.push_back("-ffreestanding");
2327
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002328 // Forward -f (flag) options which we can pass directly.
Mike Stump9c276ae2009-12-12 01:27:46 +00002329 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002330 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002331 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002332 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002333 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002334 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002335 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002336 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2337 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002338
2339 // Report and error for -faltivec on anything other then PowerPC.
2340 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2341 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2342 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2343 D.Diag(diag::err_drv_argument_only_allowed_with)
2344 << A->getAsString(Args) << "ppc/ppc64";
2345
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002346 if (getToolChain().SupportsProfiling())
2347 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002348
Kostya Serebryany1b4eca62011-11-16 17:34:26 +00002349 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2350 options::OPT_fno_address_sanitizer, false))
2351 CmdArgs.push_back("-faddress-sanitizer");
2352
Kostya Serebryany3c931222012-03-01 22:27:08 +00002353 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2354 options::OPT_fno_thread_sanitizer, false))
2355 CmdArgs.push_back("-fthread-sanitizer");
2356
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002357 // -flax-vector-conversions is default.
2358 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2359 options::OPT_fno_lax_vector_conversions))
2360 CmdArgs.push_back("-fno-lax-vector-conversions");
2361
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002362 if (Args.getLastArg(options::OPT_fapple_kext))
2363 CmdArgs.push_back("-fapple-kext");
2364
David Blaikie940152f2012-06-14 18:55:27 +00002365 if (Args.hasFlag(options::OPT_frewrite_includes,
2366 options::OPT_fno_rewrite_includes, false))
2367 CmdArgs.push_back("-frewrite-includes");
2368
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002369 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002370 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002371 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002372 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2373 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002374
2375 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2376 CmdArgs.push_back("-ftrapv-handler");
2377 CmdArgs.push_back(A->getValue(Args));
2378 }
2379
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002380 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002381
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002382 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2383 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2384 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2385 options::OPT_fno_wrapv)) {
2386 if (A->getOption().matches(options::OPT_fwrapv))
2387 CmdArgs.push_back("-fwrapv");
2388 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2389 options::OPT_fno_strict_overflow)) {
2390 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2391 CmdArgs.push_back("-fwrapv");
2392 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002393 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002394 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002395
Daniel Dunbar5345c392009-09-03 04:54:28 +00002396 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2397
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002398 // -stack-protector=0 is default.
2399 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002400 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2401 options::OPT_fstack_protector_all,
2402 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002403 if (A->getOption().matches(options::OPT_fstack_protector))
2404 StackProtectorLevel = 1;
2405 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2406 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002407 } else {
2408 StackProtectorLevel =
2409 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2410 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002411 if (StackProtectorLevel) {
2412 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002413 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002414 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002415
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002416 // --param ssp-buffer-size=
2417 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2418 ie = Args.filtered_end(); it != ie; ++it) {
2419 StringRef Str((*it)->getValue(Args));
2420 if (Str.startswith("ssp-buffer-size=")) {
2421 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002422 CmdArgs.push_back("-stack-protector-buffer-size");
2423 // FIXME: Verify the argument is a valid integer.
2424 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002425 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002426 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002427 }
Bill Wendling45483f72009-06-28 07:36:13 +00002428 }
2429
Nick Lewycky4e785c92011-12-06 03:33:03 +00002430 // Translate -mstackrealign
2431 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2432 false)) {
2433 CmdArgs.push_back("-backend-option");
2434 CmdArgs.push_back("-force-align-stack");
2435 }
2436 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2437 false)) {
2438 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2439 }
2440
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002441 if (Args.hasArg(options::OPT_mstack_alignment)) {
2442 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2443 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002444 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002445
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002446 // Forward -f options with positive and negative forms; we translate
2447 // these by hand.
2448
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002449 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002450 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002451 CmdArgs.push_back("-fapple-kext");
2452 if (!Args.hasArg(options::OPT_fbuiltin))
2453 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002454 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002455 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002456 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002457 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002458 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002459
Nuno Lopesfc284482009-12-16 16:59:22 +00002460 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2461 options::OPT_fno_assume_sane_operator_new))
2462 CmdArgs.push_back("-fno-assume-sane-operator-new");
2463
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002464 // -fblocks=0 is default.
2465 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002466 getToolChain().IsBlocksDefault()) ||
2467 (Args.hasArg(options::OPT_fgnu_runtime) &&
2468 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2469 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002470 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002471
2472 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2473 !getToolChain().hasBlocksRuntime())
2474 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002475 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002476
Douglas Gregor64554ba2012-01-18 15:19:58 +00002477 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2478 // users must also pass -fcxx-modules. The latter flag will disappear once the
2479 // modules implementation is solid for C++/Objective-C++ programs as well.
2480 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2481 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2482 options::OPT_fno_cxx_modules,
2483 false);
2484 if (AllowedInCXX || !types::isCXX(InputType))
2485 CmdArgs.push_back("-fmodules");
2486 }
Douglas Gregor7025d2c2012-01-03 17:13:05 +00002487
John McCall32579cf2010-04-09 19:12:06 +00002488 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00002489 if (Args.hasFlag(options::OPT_fno_access_control,
2490 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00002491 false))
John McCall7002f4c2010-04-09 19:03:51 +00002492 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00002493
Anders Carlssona4c24752010-11-21 00:09:52 +00002494 // -felide-constructors is the default.
2495 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2496 options::OPT_felide_constructors,
2497 false))
2498 CmdArgs.push_back("-fno-elide-constructors");
2499
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002500 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002501 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2502 KernelOrKext)
Daniel Dunbar53e84842009-11-19 04:55:23 +00002503 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00002504
Tony Linthicum96319392011-12-12 21:14:55 +00002505 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002506 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00002507 options::OPT_fno_short_enums,
2508 getToolChain().getTriple().getArch() ==
2509 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002510 CmdArgs.push_back("-fshort-enums");
2511
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002512 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002513 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002514 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00002515 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00002516
Anders Carlssona508b7d2010-02-06 23:23:06 +00002517 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00002518 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00002519 options::OPT_fno_threadsafe_statics))
2520 CmdArgs.push_back("-fno-threadsafe-statics");
2521
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002522 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002523 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2524 options::OPT_fno_use_cxa_atexit,
2525 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00002526 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00002527 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2528 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002529 CmdArgs.push_back("-fno-use-cxa-atexit");
2530
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002531 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002532 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002533 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2534 CmdArgs.push_back("-fms-extensions");
2535
Chad Rosierf925e042012-07-20 21:20:33 +00002536 // -fms-inline-asm.
Chad Rosierd256f862012-07-20 23:12:26 +00002537 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2538 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosierf925e042012-07-20 21:20:33 +00002539
Francois Pichetae556082011-09-17 04:32:15 +00002540 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00002541 if (Args.hasFlag(options::OPT_fms_compatibility,
2542 options::OPT_fno_ms_compatibility,
2543 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2544 Args.hasFlag(options::OPT_fms_extensions,
2545 options::OPT_fno_ms_extensions,
2546 true))))
Francois Pichetae556082011-09-17 04:32:15 +00002547 CmdArgs.push_back("-fms-compatibility");
2548
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002549 // -fmsc-version=1300 is default.
2550 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2551 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2552 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002553 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002554 if (msc_ver.empty())
2555 CmdArgs.push_back("-fmsc-version=1300");
2556 else
2557 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2558 }
2559
2560
Dawn Perchik400b6072010-09-02 23:59:25 +00002561 // -fborland-extensions=0 is default.
2562 if (Args.hasFlag(options::OPT_fborland_extensions,
2563 options::OPT_fno_borland_extensions, false))
2564 CmdArgs.push_back("-fborland-extensions");
2565
Francois Pichet8efcc012011-09-01 16:38:08 +00002566 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2567 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00002568 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2569 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00002570 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00002571 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00002572
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002573 // -fgnu-keywords default varies depending on language; only pass if
2574 // specified.
2575 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00002576 options::OPT_fno_gnu_keywords))
2577 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002578
Rafael Espindola01ba8542011-06-02 17:30:53 +00002579 if (Args.hasFlag(options::OPT_fgnu89_inline,
2580 options::OPT_fno_gnu89_inline,
2581 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00002582 CmdArgs.push_back("-fgnu89-inline");
2583
Chad Rosierfc055f92012-03-15 22:31:42 +00002584 if (Args.hasArg(options::OPT_fno_inline))
2585 CmdArgs.push_back("-fno-inline");
2586
Chad Rosier634a4b12012-03-06 21:17:19 +00002587 if (Args.hasArg(options::OPT_fno_inline_functions))
2588 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00002589
John McCall260611a2012-06-20 06:18:46 +00002590 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00002591
John McCall260611a2012-06-20 06:18:46 +00002592 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2593 // legacy is the default.
2594 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002595 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2596 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00002597 objcRuntime.isLegacyDispatchDefaultForArch(
2598 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002599 if (getToolChain().UseObjCMixedDispatch())
2600 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2601 else
2602 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2603 }
2604 }
2605
Nico Weberdf423542012-03-09 21:19:44 +00002606 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2607 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00002608 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002609 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2610 }
2611
John McCall9f084a32011-07-06 00:26:06 +00002612 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2613 // NOTE: This logic is duplicated in ToolChains.cpp.
2614 bool ARC = isObjCAutoRefCount(Args);
2615 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00002616 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00002617
John McCall9f084a32011-07-06 00:26:06 +00002618 CmdArgs.push_back("-fobjc-arc");
2619
Chandler Carruth7ffa0322011-11-04 07:34:47 +00002620 // FIXME: It seems like this entire block, and several around it should be
2621 // wrapped in isObjC, but for now we just use it here as this is where it
2622 // was being used previously.
2623 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2624 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2625 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2626 else
2627 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2628 }
2629
John McCall9f084a32011-07-06 00:26:06 +00002630 // Allow the user to enable full exceptions code emission.
2631 // We define off for Objective-CC, on for Objective-C++.
2632 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2633 options::OPT_fno_objc_arc_exceptions,
2634 /*default*/ types::isCXX(InputType)))
2635 CmdArgs.push_back("-fobjc-arc-exceptions");
2636 }
2637
2638 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2639 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00002640 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00002641 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002642
John McCall9f084a32011-07-06 00:26:06 +00002643 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2644 // takes precedence.
2645 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2646 if (!GCArg)
2647 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2648 if (GCArg) {
2649 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002650 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00002651 << GCArg->getAsString(Args);
2652 } else if (getToolChain().SupportsObjCGC()) {
2653 GCArg->render(Args, CmdArgs);
2654 } else {
2655 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002656 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00002657 << GCArg->getAsString(Args);
2658 }
2659 }
2660
John McCalld71315c2011-06-22 00:53:57 +00002661 // Add exception args.
2662 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00002663 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00002664
2665 if (getToolChain().UseSjLjExceptions())
2666 CmdArgs.push_back("-fsjlj-exceptions");
2667
2668 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00002669 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2670 options::OPT_fno_assume_sane_operator_new))
2671 CmdArgs.push_back("-fno-assume-sane-operator-new");
2672
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00002673 // -fconstant-cfstrings is default, and may be subject to argument translation
2674 // on Darwin.
2675 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2676 options::OPT_fno_constant_cfstrings) ||
2677 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2678 options::OPT_mno_constant_cfstrings))
2679 CmdArgs.push_back("-fno-constant-cfstrings");
2680
John Thompsona6fda122009-11-05 20:14:16 +00002681 // -fshort-wchar default varies depending on platform; only
2682 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00002683 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2684 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00002685
Daniel Dunbaree848a72009-10-29 02:39:57 +00002686 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2687 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00002688 //
2689 // FIXME: This is gross; that translation should be pulled from the
2690 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002691 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00002692 options::OPT_fno_pascal_strings,
2693 false) ||
2694 Args.hasFlag(options::OPT_mpascal_strings,
2695 options::OPT_mno_pascal_strings,
2696 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002697 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002698
Daniel Dunbar88934e82011-10-05 21:04:55 +00002699 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2700 // -fno-pack-struct doesn't apply to -fpack-struct=.
2701 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00002702 std::string PackStructStr = "-fpack-struct=";
2703 PackStructStr += A->getValue(Args);
2704 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00002705 } else if (Args.hasFlag(options::OPT_fpack_struct,
2706 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00002707 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00002708 }
2709
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002710 if (Args.hasArg(options::OPT_mkernel) ||
2711 Args.hasArg(options::OPT_fapple_kext)) {
2712 if (!Args.hasArg(options::OPT_fcommon))
2713 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00002714 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002715 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00002716
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002717 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002718 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002719 CmdArgs.push_back("-fno-common");
2720
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002721 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002722 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00002723 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002724 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002725 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002726 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2727
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002728 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2729 if (!Args.hasFlag(options::OPT_ffor_scope,
2730 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002731 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002732 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2733
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00002734 // -fcaret-diagnostics is default.
2735 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2736 options::OPT_fno_caret_diagnostics, true))
2737 CmdArgs.push_back("-fno-caret-diagnostics");
2738
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002739 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00002740 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002741 options::OPT_fno_diagnostics_fixit_info))
2742 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002743
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002744 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00002745 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002746 options::OPT_fno_diagnostics_show_option))
2747 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00002748
Chris Lattner6fbe8392010-05-04 21:55:25 +00002749 if (const Arg *A =
2750 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2751 CmdArgs.push_back("-fdiagnostics-show-category");
2752 CmdArgs.push_back(A->getValue(Args));
2753 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002754
Douglas Gregorc9471b02011-05-21 17:07:29 +00002755 if (const Arg *A =
2756 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2757 CmdArgs.push_back("-fdiagnostics-format");
2758 CmdArgs.push_back(A->getValue(Args));
2759 }
2760
Chandler Carruthabaca7a2011-03-27 01:50:55 +00002761 if (Arg *A = Args.getLastArg(
2762 options::OPT_fdiagnostics_show_note_include_stack,
2763 options::OPT_fno_diagnostics_show_note_include_stack)) {
2764 if (A->getOption().matches(
2765 options::OPT_fdiagnostics_show_note_include_stack))
2766 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2767 else
2768 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2769 }
2770
Daniel Dunbar838be482009-11-04 06:24:57 +00002771 // Color diagnostics are the default, unless the terminal doesn't support
2772 // them.
2773 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidisf765d762010-09-23 12:56:06 +00002774 options::OPT_fno_color_diagnostics,
2775 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00002776 CmdArgs.push_back("-fcolor-diagnostics");
2777
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00002778 if (!Args.hasFlag(options::OPT_fshow_source_location,
2779 options::OPT_fno_show_source_location))
2780 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002781
Douglas Gregorc9471b02011-05-21 17:07:29 +00002782 if (!Args.hasFlag(options::OPT_fshow_column,
2783 options::OPT_fno_show_column,
2784 true))
2785 CmdArgs.push_back("-fno-show-column");
2786
Douglas Gregora0068fc2010-07-09 17:35:33 +00002787 if (!Args.hasFlag(options::OPT_fspell_checking,
2788 options::OPT_fno_spell_checking))
2789 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002790
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002791
Daniel Dunbar16894392010-11-02 19:42:04 +00002792 // Silently ignore -fasm-blocks for now.
2793 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2794 false);
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002795
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00002796 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2797 A->render(Args, CmdArgs);
2798
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002799 // -fdollars-in-identifiers default varies depending on platform and
2800 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00002801 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002802 options::OPT_fno_dollars_in_identifiers)) {
2803 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00002804 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002805 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00002806 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002807 }
2808
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002809 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2810 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00002811 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002812 options::OPT_fno_unit_at_a_time)) {
2813 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002814 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002815 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002816
Eli Friedman19bda3a2011-11-02 01:53:16 +00002817 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2818 options::OPT_fno_apple_pragma_pack, false))
2819 CmdArgs.push_back("-fapple-pragma-pack");
2820
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002821 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002822 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002823 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002824#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00002825 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002826 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2827 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2828 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2829 CmdArgs.push_back("-fno-builtin-strcat");
2830 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2831 CmdArgs.push_back("-fno-builtin-strcpy");
2832 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002833#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002834
Daniel Dunbard98750f2011-03-18 21:23:40 +00002835 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00002836 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00002837 options::OPT_traditional_cpp)) {
2838 if (isa<PreprocessJobAction>(JA))
2839 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002840 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00002841 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00002842 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002843
Daniel Dunbar1d460332009-03-18 10:01:51 +00002844 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00002845 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00002846
2847 // Handle serialized diagnostics.
2848 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2849 CmdArgs.push_back("-serialize-diagnostic-file");
2850 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2851 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002852
Ted Kremenek127ff2e2012-09-13 06:41:18 +00002853 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2854 CmdArgs.push_back("-fretain-comments-from-system-headers");
2855
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002856 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2857 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00002858 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002859 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2860 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002861 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00002862
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002863 // We translate this by hand to the -cc1 argument, since nightly test uses
2864 // it and developers have been trained to spell it with -mllvm.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002865 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002866 CmdArgs.push_back("-disable-llvm-optzns");
2867 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002868 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002869 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002870
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002871 if (Output.getType() == types::TY_Dependencies) {
2872 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00002873 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002874 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00002875 CmdArgs.push_back(Output.getFilename());
2876 } else {
2877 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002878 }
2879
Daniel Dunbar1d460332009-03-18 10:01:51 +00002880 for (InputInfoList::const_iterator
2881 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2882 const InputInfo &II = *it;
2883 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00002884 if (Args.hasArg(options::OPT_rewrite_objc))
2885 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2886 else
2887 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00002888 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00002889 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002890 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00002891 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002892 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002893
Chris Lattnere6113de2009-11-03 19:50:27 +00002894 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2895
Daniel Dunbara001c1c2010-07-18 21:16:15 +00002896 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002897
2898 // Optionally embed the -cc1 level arguments into the debug info, for build
2899 // analysis.
2900 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00002901 ArgStringList OriginalArgs;
2902 for (ArgList::const_iterator it = Args.begin(),
2903 ie = Args.end(); it != ie; ++it)
2904 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002905
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00002906 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002907 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00002908 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002909 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00002910 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002911 }
2912 CmdArgs.push_back("-dwarf-debug-flags");
2913 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2914 }
2915
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00002916 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00002917
Roman Divackybe4c8702011-02-10 16:52:03 +00002918 if (Arg *A = Args.getLastArg(options::OPT_pg))
2919 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002920 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00002921 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002922
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002923 // Claim some arguments which clang supports automatically.
2924
Daniel Dunbarf4046862010-04-15 06:18:42 +00002925 // -fpch-preprocess is used with gcc to add a special marker in the output to
2926 // include the PCH file. Clang's PTH solution is completely transparent, so we
2927 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002928 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002929
Daniel Dunbara880db02009-03-23 19:03:36 +00002930 // Claim some arguments which clang doesn't support, but we don't
2931 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00002932 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2933 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002934
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002935 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002936 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002937 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002938}
2939
Jim Grosbachfc308292012-02-10 20:37:10 +00002940void ClangAs::AddARMTargetArgs(const ArgList &Args,
2941 ArgStringList &CmdArgs) const {
2942 const Driver &D = getToolChain().getDriver();
2943 llvm::Triple Triple = getToolChain().getTriple();
2944
2945 // Set the CPU based on -march= and -mcpu=.
2946 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00002947 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00002948
2949 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00002950 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00002951 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00002952
2953 // Honor -mfpmath=.
2954 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00002955 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00002956}
2957
John McCall260611a2012-06-20 06:18:46 +00002958/// Add options related to the Objective-C runtime/ABI.
2959///
2960/// Returns true if the runtime is non-fragile.
2961ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2962 ArgStringList &cmdArgs,
2963 RewriteKind rewriteKind) const {
2964 // Look for the controlling runtime option.
2965 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2966 options::OPT_fgnu_runtime,
2967 options::OPT_fobjc_runtime_EQ);
2968
2969 // Just forward -fobjc-runtime= to the frontend. This supercedes
2970 // options about fragility.
2971 if (runtimeArg &&
2972 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2973 ObjCRuntime runtime;
2974 StringRef value = runtimeArg->getValue(args);
2975 if (runtime.tryParse(value)) {
2976 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2977 << value;
2978 }
2979
2980 runtimeArg->render(args, cmdArgs);
2981 return runtime;
2982 }
2983
2984 // Otherwise, we'll need the ABI "version". Version numbers are
2985 // slightly confusing for historical reasons:
2986 // 1 - Traditional "fragile" ABI
2987 // 2 - Non-fragile ABI, version 1
2988 // 3 - Non-fragile ABI, version 2
2989 unsigned objcABIVersion = 1;
2990 // If -fobjc-abi-version= is present, use that to set the version.
2991 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2992 StringRef value = abiArg->getValue(args);
2993 if (value == "1")
2994 objcABIVersion = 1;
2995 else if (value == "2")
2996 objcABIVersion = 2;
2997 else if (value == "3")
2998 objcABIVersion = 3;
2999 else
3000 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3001 << value;
3002 } else {
3003 // Otherwise, determine if we are using the non-fragile ABI.
3004 bool nonFragileABIIsDefault =
3005 (rewriteKind == RK_NonFragile ||
3006 (rewriteKind == RK_None &&
3007 getToolChain().IsObjCNonFragileABIDefault()));
3008 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3009 options::OPT_fno_objc_nonfragile_abi,
3010 nonFragileABIIsDefault)) {
3011 // Determine the non-fragile ABI version to use.
3012#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3013 unsigned nonFragileABIVersion = 1;
3014#else
3015 unsigned nonFragileABIVersion = 2;
3016#endif
3017
3018 if (Arg *abiArg = args.getLastArg(
3019 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3020 StringRef value = abiArg->getValue(args);
3021 if (value == "1")
3022 nonFragileABIVersion = 1;
3023 else if (value == "2")
3024 nonFragileABIVersion = 2;
3025 else
3026 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3027 << value;
3028 }
3029
3030 objcABIVersion = 1 + nonFragileABIVersion;
3031 } else {
3032 objcABIVersion = 1;
3033 }
3034 }
3035
3036 // We don't actually care about the ABI version other than whether
3037 // it's non-fragile.
3038 bool isNonFragile = objcABIVersion != 1;
3039
3040 // If we have no runtime argument, ask the toolchain for its default runtime.
3041 // However, the rewriter only really supports the Mac runtime, so assume that.
3042 ObjCRuntime runtime;
3043 if (!runtimeArg) {
3044 switch (rewriteKind) {
3045 case RK_None:
3046 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3047 break;
3048 case RK_Fragile:
3049 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3050 break;
3051 case RK_NonFragile:
3052 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3053 break;
3054 }
3055
3056 // -fnext-runtime
3057 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3058 // On Darwin, make this use the default behavior for the toolchain.
3059 if (getToolChain().getTriple().isOSDarwin()) {
3060 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3061
3062 // Otherwise, build for a generic macosx port.
3063 } else {
3064 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3065 }
3066
3067 // -fgnu-runtime
3068 } else {
3069 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003070 // Legacy behaviour is to target the gnustep runtime if we are i
3071 // non-fragile mode or the GCC runtime in fragile mode.
3072 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003073 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003074 else
3075 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003076 }
3077
3078 cmdArgs.push_back(args.MakeArgString(
3079 "-fobjc-runtime=" + runtime.getAsString()));
3080 return runtime;
3081}
3082
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003083void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003084 const InputInfo &Output,
3085 const InputInfoList &Inputs,
3086 const ArgList &Args,
3087 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003088 ArgStringList CmdArgs;
3089
3090 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3091 const InputInfo &Input = Inputs[0];
3092
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003093 // Don't warn about "clang -w -c foo.s"
3094 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003095 // and "clang -emit-llvm -c foo.s"
3096 Args.ClaimAllArgs(options::OPT_emit_llvm);
3097 // and "clang -use-gold-plugin -c foo.s"
3098 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003099
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003100 // Invoke ourselves in -cc1as mode.
3101 //
3102 // FIXME: Implement custom jobs for internal actions.
3103 CmdArgs.push_back("-cc1as");
3104
3105 // Add the "effective" target triple.
3106 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003107 std::string TripleStr =
3108 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003109 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3110
3111 // Set the output mode, we currently only expect to be used as a real
3112 // assembler.
3113 CmdArgs.push_back("-filetype");
3114 CmdArgs.push_back("obj");
3115
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003116 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003117 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003118
Jim Grosbachfc308292012-02-10 20:37:10 +00003119 // Add target specific cpu and features flags.
3120 switch(getToolChain().getTriple().getArch()) {
3121 default:
3122 break;
3123
3124 case llvm::Triple::arm:
3125 case llvm::Triple::thumb:
3126 AddARMTargetArgs(Args, CmdArgs);
3127 break;
3128 }
3129
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003130 // Ignore explicit -force_cpusubtype_ALL option.
3131 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003132
Eric Christopher8f0a4032012-01-10 00:38:01 +00003133 // Determine the original source input.
3134 const Action *SourceAction = &JA;
3135 while (SourceAction->getKind() != Action::InputClass) {
3136 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3137 SourceAction = SourceAction->getInputs()[0];
3138 }
3139
3140 // Forward -g, assuming we are dealing with an actual assembly file.
3141 if (SourceAction->getType() == types::TY_Asm ||
3142 SourceAction->getType() == types::TY_PP_Asm) {
3143 Args.ClaimAllArgs(options::OPT_g_Group);
3144 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3145 if (!A->getOption().matches(options::OPT_g0))
3146 CmdArgs.push_back("-g");
3147 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003148
3149 // Optionally embed the -cc1as level arguments into the debug info, for build
3150 // analysis.
3151 if (getToolChain().UseDwarfDebugFlags()) {
3152 ArgStringList OriginalArgs;
3153 for (ArgList::const_iterator it = Args.begin(),
3154 ie = Args.end(); it != ie; ++it)
3155 (*it)->render(Args, OriginalArgs);
3156
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003157 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003158 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3159 Flags += Exec;
3160 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3161 Flags += " ";
3162 Flags += OriginalArgs[i];
3163 }
3164 CmdArgs.push_back("-dwarf-debug-flags");
3165 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3166 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003167
3168 // FIXME: Add -static support, once we have it.
3169
3170 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3171 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003172 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003173
3174 assert(Output.isFilename() && "Unexpected lipo output.");
3175 CmdArgs.push_back("-o");
3176 CmdArgs.push_back(Output.getFilename());
3177
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003178 assert(Input.isFilename() && "Invalid input.");
3179 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003180
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003181 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003182 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003183}
3184
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003185void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003186 const InputInfo &Output,
3187 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003188 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003189 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003190 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003191 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003192
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003193 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003194 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003195 Arg *A = *it;
Daniel Dunbar75877192009-03-19 07:55:12 +00003196 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003197 // Don't forward any -g arguments to assembly steps.
3198 if (isa<AssembleJobAction>(JA) &&
3199 A->getOption().matches(options::OPT_g_Group))
3200 continue;
3201
Daniel Dunbar75877192009-03-19 07:55:12 +00003202 // It is unfortunate that we have to claim here, as this means
3203 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003204 // platforms using a generic gcc, even if we are just using gcc
3205 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003206 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003207 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003208 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003209 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003210
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003211 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003212
3213 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003214 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00003215 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003216 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003217
3218 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003219 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003220 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003221 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003222 CmdArgs.push_back("ppc64");
3223 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003224 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003225 }
3226
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003227 // Try to force gcc to match the tool chain we want, if we recognize
3228 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003229 //
3230 // FIXME: The triple class should directly provide the information we want
3231 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003232 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003233 CmdArgs.push_back("-m32");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003234 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003235 CmdArgs.push_back("-m64");
3236
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003237 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003238 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003239 CmdArgs.push_back(Output.getFilename());
3240 } else {
3241 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003242 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003243 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003244
Tony Linthicum96319392011-12-12 21:14:55 +00003245 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3246 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003247
3248 // Only pass -x if gcc will understand it; otherwise hope gcc
3249 // understands the suffix correctly. The main use case this would go
3250 // wrong in is for linker inputs if they happened to have an odd
3251 // suffix; really the only way to get this to happen is a command
3252 // like '-x foobar a.c' which will treat a.c like a linker input.
3253 //
3254 // FIXME: For the linker case specifically, can we safely convert
3255 // inputs into '-Wl,' options?
3256 for (InputInfoList::const_iterator
3257 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3258 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003259
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003260 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003261 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3262 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003263 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003264 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003265 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003266 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003267 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003268
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003269 if (types::canTypeBeUserSpecified(II.getType())) {
3270 CmdArgs.push_back("-x");
3271 CmdArgs.push_back(types::getTypeName(II.getType()));
3272 }
3273
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003274 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003275 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003276 else {
3277 const Arg &A = II.getInputArg();
3278
3279 // Reverse translate some rewritten options.
3280 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3281 CmdArgs.push_back("-lstdc++");
3282 continue;
3283 }
3284
Daniel Dunbar115a7922009-03-19 07:29:38 +00003285 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003286 A.render(Args, CmdArgs);
3287 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003288 }
3289
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003290 const std::string customGCCName = D.getCCCGenericGCCName();
3291 const char *GCCName;
3292 if (!customGCCName.empty())
3293 GCCName = customGCCName.c_str();
3294 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003295 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003296 } else
3297 GCCName = "gcc";
3298
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003299 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003300 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003301 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003302}
3303
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003304void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3305 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003306 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003307}
3308
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003309void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3310 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003311 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003312}
3313
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003314void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3315 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003316 const Driver &D = getToolChain().getDriver();
3317
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003318 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003319 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3320 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003321 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00003322 else {
3323 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003324 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003325 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00003326
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003327 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00003328 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003329}
3330
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003331void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3332 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003333 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003334}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003335
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003336void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3337 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003338 // The types are (hopefully) good enough.
3339}
3340
Tony Linthicum96319392011-12-12 21:14:55 +00003341// Hexagon tools start.
3342void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3343 ArgStringList &CmdArgs) const {
3344
3345}
3346void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3347 const InputInfo &Output,
3348 const InputInfoList &Inputs,
3349 const ArgList &Args,
3350 const char *LinkingOutput) const {
3351
3352 const Driver &D = getToolChain().getDriver();
3353 ArgStringList CmdArgs;
3354
3355 std::string MarchString = "-march=";
3356 MarchString += getHexagonTargetCPU(Args);
3357 CmdArgs.push_back(Args.MakeArgString(MarchString));
3358
3359 RenderExtraToolArgs(JA, CmdArgs);
3360
3361 if (Output.isFilename()) {
3362 CmdArgs.push_back("-o");
3363 CmdArgs.push_back(Output.getFilename());
3364 } else {
3365 assert(Output.isNothing() && "Unexpected output");
3366 CmdArgs.push_back("-fsyntax-only");
3367 }
3368
3369
3370 // Only pass -x if gcc will understand it; otherwise hope gcc
3371 // understands the suffix correctly. The main use case this would go
3372 // wrong in is for linker inputs if they happened to have an odd
3373 // suffix; really the only way to get this to happen is a command
3374 // like '-x foobar a.c' which will treat a.c like a linker input.
3375 //
3376 // FIXME: For the linker case specifically, can we safely convert
3377 // inputs into '-Wl,' options?
3378 for (InputInfoList::const_iterator
3379 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3380 const InputInfo &II = *it;
3381
3382 // Don't try to pass LLVM or AST inputs to a generic gcc.
3383 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3384 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3385 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3386 << getToolChain().getTripleString();
3387 else if (II.getType() == types::TY_AST)
3388 D.Diag(clang::diag::err_drv_no_ast_support)
3389 << getToolChain().getTripleString();
3390
3391 if (II.isFilename())
3392 CmdArgs.push_back(II.getFilename());
3393 else
3394 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3395 II.getInputArg().render(Args, CmdArgs);
3396 }
3397
3398 const char *GCCName = "hexagon-as";
3399 const char *Exec =
3400 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3401 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3402
3403}
3404void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3405 ArgStringList &CmdArgs) const {
3406 // The types are (hopefully) good enough.
3407}
3408
3409void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3410 const InputInfo &Output,
3411 const InputInfoList &Inputs,
3412 const ArgList &Args,
3413 const char *LinkingOutput) const {
3414
3415 const Driver &D = getToolChain().getDriver();
3416 ArgStringList CmdArgs;
3417
3418 for (ArgList::const_iterator
3419 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3420 Arg *A = *it;
3421 if (A->getOption().hasForwardToGCC()) {
3422 // Don't forward any -g arguments to assembly steps.
3423 if (isa<AssembleJobAction>(JA) &&
3424 A->getOption().matches(options::OPT_g_Group))
3425 continue;
3426
3427 // It is unfortunate that we have to claim here, as this means
3428 // we will basically never report anything interesting for
3429 // platforms using a generic gcc, even if we are just using gcc
3430 // to get to the assembler.
3431 A->claim();
3432 A->render(Args, CmdArgs);
3433 }
3434 }
3435
3436 RenderExtraToolArgs(JA, CmdArgs);
3437
3438 // Add Arch Information
3439 Arg *A;
Sebastian Pop43115d42012-01-13 20:37:10 +00003440 if ((A = getLastHexagonArchArg(Args))) {
3441 if (A->getOption().matches(options::OPT_m_Joined))
3442 A->render(Args, CmdArgs);
Tony Linthicum96319392011-12-12 21:14:55 +00003443 else
Sebastian Pop43115d42012-01-13 20:37:10 +00003444 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00003445 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003446 else {
3447 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3448 }
3449
Tony Linthicum96319392011-12-12 21:14:55 +00003450 CmdArgs.push_back("-mqdsp6-compat");
3451
3452 const char *GCCName;
3453 if (C.getDriver().CCCIsCXX)
3454 GCCName = "hexagon-g++";
3455 else
3456 GCCName = "hexagon-gcc";
3457 const char *Exec =
3458 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3459
3460 if (Output.isFilename()) {
3461 CmdArgs.push_back("-o");
3462 CmdArgs.push_back(Output.getFilename());
3463 }
3464
3465 for (InputInfoList::const_iterator
3466 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3467 const InputInfo &II = *it;
3468
3469 // Don't try to pass LLVM or AST inputs to a generic gcc.
3470 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3471 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3472 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3473 << getToolChain().getTripleString();
3474 else if (II.getType() == types::TY_AST)
3475 D.Diag(clang::diag::err_drv_no_ast_support)
3476 << getToolChain().getTripleString();
3477
3478 if (II.isFilename())
3479 CmdArgs.push_back(II.getFilename());
3480 else
3481 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3482 II.getInputArg().render(Args, CmdArgs);
3483 }
3484 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3485
3486}
3487// Hexagon tools end.
3488
3489
Daniel Dunbar40f12652009-03-29 17:08:39 +00003490const char *darwin::CC1::getCC1Name(types::ID Type) const {
3491 switch (Type) {
3492 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00003493 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbar40f12652009-03-29 17:08:39 +00003494 case types::TY_Asm:
3495 case types::TY_C: case types::TY_CHeader:
3496 case types::TY_PP_C: case types::TY_PP_CHeader:
3497 return "cc1";
3498 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003499 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3500 case types::TY_PP_ObjCHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003501 return "cc1obj";
3502 case types::TY_CXX: case types::TY_CXXHeader:
3503 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3504 return "cc1plus";
3505 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003506 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3507 case types::TY_PP_ObjCXXHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003508 return "cc1objplus";
3509 }
3510}
3511
David Blaikie99ba9e32011-12-20 02:48:34 +00003512void darwin::CC1::anchor() {}
3513
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003514const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003515 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00003516 return Args.MakeArgString(
3517 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003518}
3519
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003520const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003521 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003522 const char *Str = getBaseInputName(Args, Inputs);
3523
Chris Lattner657ca662011-01-16 08:14:11 +00003524 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00003525 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003526
3527 return Str;
3528}
3529
3530const char *
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003531darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003532 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003533 // FIXME: Think about this more.
3534 std::string Res;
3535
3536 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3537 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003538 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00003539 } else {
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003540 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00003541 }
Daniel Dunbar88137642009-09-09 22:32:48 +00003542 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003543}
3544
Chad Rosier285f9a22011-08-17 18:24:55 +00003545void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher88b7cf02011-08-19 00:30:14 +00003546 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosier285f9a22011-08-17 18:24:55 +00003547 it != ie;) {
Chad Rosier8722a5d2011-08-18 17:56:32 +00003548
3549 StringRef Option = *it;
Chad Rosier80717972011-08-26 18:30:43 +00003550 bool RemoveOption = false;
Chad Rosier04225c12011-08-18 01:18:28 +00003551
Bob Wilson2872c8d2012-02-07 01:17:55 +00003552 // Erase both -fmodule-cache-path and its argument.
3553 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3554 it = CmdArgs.erase(it, it+2);
Chad Rosier80717972011-08-26 18:30:43 +00003555 ie = CmdArgs.end();
Chad Rosier04225c12011-08-18 01:18:28 +00003556 continue;
3557 }
3558
Bob Wilson2872c8d2012-02-07 01:17:55 +00003559 // Remove unsupported -f options.
3560 if (Option.startswith("-f")) {
3561 // Remove -f/-fno- to reduce the number of cases.
3562 if (Option.startswith("-fno-"))
3563 Option = Option.substr(5);
3564 else
3565 Option = Option.substr(2);
3566 RemoveOption = llvm::StringSwitch<bool>(Option)
3567 .Case("altivec", true)
3568 .Case("modules", true)
3569 .Case("diagnostics-show-note-include-stack", true)
3570 .Default(false);
3571 }
3572
Chad Rosier80717972011-08-26 18:30:43 +00003573 // Handle machine specific options.
3574 if (Option.startswith("-m")) {
3575 RemoveOption = llvm::StringSwitch<bool>(Option)
3576 .Case("-mthumb", true)
3577 .Case("-mno-thumb", true)
3578 .Case("-mno-fused-madd", true)
3579 .Case("-mlong-branch", true)
3580 .Case("-mlongcall", true)
3581 .Case("-mcpu=G4", true)
3582 .Case("-mcpu=G5", true)
3583 .Default(false);
3584 }
3585
3586 // Handle warning options.
3587 if (Option.startswith("-W")) {
3588 // Remove -W/-Wno- to reduce the number of cases.
3589 if (Option.startswith("-Wno-"))
3590 Option = Option.substr(5);
3591 else
3592 Option = Option.substr(2);
3593
3594 RemoveOption = llvm::StringSwitch<bool>(Option)
3595 .Case("address-of-temporary", true)
3596 .Case("ambiguous-member-template", true)
3597 .Case("analyzer-incompatible-plugin", true)
3598 .Case("array-bounds", true)
3599 .Case("array-bounds-pointer-arithmetic", true)
3600 .Case("bind-to-temporary-copy", true)
3601 .Case("bitwise-op-parentheses", true)
3602 .Case("bool-conversions", true)
3603 .Case("builtin-macro-redefined", true)
3604 .Case("c++-hex-floats", true)
3605 .Case("c++0x-compat", true)
3606 .Case("c++0x-extensions", true)
3607 .Case("c++0x-narrowing", true)
Richard Smith575fdda2011-10-13 23:32:09 +00003608 .Case("c++11-compat", true)
3609 .Case("c++11-extensions", true)
3610 .Case("c++11-narrowing", true)
Chad Rosier80717972011-08-26 18:30:43 +00003611 .Case("conditional-uninitialized", true)
3612 .Case("constant-conversion", true)
David Blaikie95187bd2012-03-15 04:50:32 +00003613 .Case("conversion-null", true)
Chad Rosier80717972011-08-26 18:30:43 +00003614 .Case("CFString-literal", true)
3615 .Case("constant-logical-operand", true)
3616 .Case("custom-atomic-properties", true)
3617 .Case("default-arg-special-member", true)
3618 .Case("delegating-ctor-cycles", true)
3619 .Case("delete-non-virtual-dtor", true)
3620 .Case("deprecated-implementations", true)
3621 .Case("deprecated-writable-strings", true)
3622 .Case("distributed-object-modifiers", true)
3623 .Case("duplicate-method-arg", true)
3624 .Case("dynamic-class-memaccess", true)
3625 .Case("enum-compare", true)
Ted Kremenek2c3d8fa2012-10-09 19:29:48 +00003626 .Case("enum-conversion", true)
Chad Rosier80717972011-08-26 18:30:43 +00003627 .Case("exit-time-destructors", true)
3628 .Case("gnu", true)
3629 .Case("gnu-designator", true)
3630 .Case("header-hygiene", true)
3631 .Case("idiomatic-parentheses", true)
3632 .Case("ignored-qualifiers", true)
3633 .Case("implicit-atomic-properties", true)
3634 .Case("incompatible-pointer-types", true)
3635 .Case("incomplete-implementation", true)
Ted Kremenek28e2aff2012-10-09 19:29:46 +00003636 .Case("int-conversion", true)
Chad Rosier80717972011-08-26 18:30:43 +00003637 .Case("initializer-overrides", true)
3638 .Case("invalid-noreturn", true)
3639 .Case("invalid-token-paste", true)
Ivan Krasin08f35a72011-10-06 02:46:34 +00003640 .Case("language-extension-token", true)
Chad Rosier80717972011-08-26 18:30:43 +00003641 .Case("literal-conversion", true)
3642 .Case("literal-range", true)
3643 .Case("local-type-template-args", true)
3644 .Case("logical-op-parentheses", true)
3645 .Case("method-signatures", true)
3646 .Case("microsoft", true)
3647 .Case("mismatched-tags", true)
3648 .Case("missing-method-return-type", true)
3649 .Case("non-pod-varargs", true)
3650 .Case("nonfragile-abi2", true)
3651 .Case("null-arithmetic", true)
3652 .Case("null-dereference", true)
3653 .Case("out-of-line-declaration", true)
3654 .Case("overriding-method-mismatch", true)
3655 .Case("readonly-setter-attrs", true)
3656 .Case("return-stack-address", true)
3657 .Case("self-assign", true)
3658 .Case("semicolon-before-method-body", true)
3659 .Case("sentinel", true)
3660 .Case("shift-overflow", true)
3661 .Case("shift-sign-overflow", true)
3662 .Case("sign-conversion", true)
3663 .Case("sizeof-array-argument", true)
3664 .Case("sizeof-pointer-memaccess", true)
3665 .Case("string-compare", true)
3666 .Case("super-class-method-mismatch", true)
3667 .Case("tautological-compare", true)
3668 .Case("typedef-redefinition", true)
3669 .Case("typename-missing", true)
3670 .Case("undefined-reinterpret-cast", true)
3671 .Case("unknown-warning-option", true)
3672 .Case("unnamed-type-template-args", true)
3673 .Case("unneeded-internal-declaration", true)
3674 .Case("unneeded-member-function", true)
3675 .Case("unused-comparison", true)
3676 .Case("unused-exception-parameter", true)
3677 .Case("unused-member-function", true)
3678 .Case("unused-result", true)
3679 .Case("vector-conversions", true)
3680 .Case("vla", true)
3681 .Case("used-but-marked-unused", true)
3682 .Case("weak-vtables", true)
3683 .Default(false);
3684 } // if (Option.startswith("-W"))
Chad Rosier04225c12011-08-18 01:18:28 +00003685 if (RemoveOption) {
Chad Rosier285f9a22011-08-17 18:24:55 +00003686 it = CmdArgs.erase(it);
Chad Rosiercc0de8c2011-08-17 18:51:56 +00003687 ie = CmdArgs.end();
Chad Rosier30601782011-08-17 23:08:45 +00003688 } else {
Chad Rosier285f9a22011-08-17 18:24:55 +00003689 ++it;
Chad Rosier30601782011-08-17 23:08:45 +00003690 }
Chad Rosier285f9a22011-08-17 18:24:55 +00003691 }
3692}
3693
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003694void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003695 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003696 const Driver &D = getToolChain().getDriver();
Daniel Dunbare2fd6642009-09-10 01:21:12 +00003697
3698 CheckCodeGenerationOptions(D, Args);
3699
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003700 // Derived from cc1 spec.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00003701 if ((!Args.hasArg(options::OPT_mkernel) ||
3702 (getDarwinToolChain().isTargetIPhoneOS() &&
3703 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3704 !Args.hasArg(options::OPT_static) &&
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003705 !Args.hasArg(options::OPT_mdynamic_no_pic))
3706 CmdArgs.push_back("-fPIC");
3707
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003708 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3709 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3710 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3711 CmdArgs.push_back("-fno-builtin-strcat");
3712 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3713 CmdArgs.push_back("-fno-builtin-strcpy");
3714 }
3715
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003716 if (Args.hasArg(options::OPT_g_Flag) &&
3717 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3718 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3719}
3720
3721void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3722 const InputInfoList &Inputs,
3723 const ArgStringList &OutputArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003724 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003725
3726 // Derived from cc1_options spec.
3727 if (Args.hasArg(options::OPT_fast) ||
3728 Args.hasArg(options::OPT_fastf) ||
3729 Args.hasArg(options::OPT_fastcp))
3730 CmdArgs.push_back("-O3");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003731
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003732 if (Arg *A = Args.getLastArg(options::OPT_pg))
3733 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003734 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003735 << A->getAsString(Args) << "-fomit-frame-pointer";
3736
3737 AddCC1Args(Args, CmdArgs);
3738
3739 if (!Args.hasArg(options::OPT_Q))
3740 CmdArgs.push_back("-quiet");
3741
3742 CmdArgs.push_back("-dumpbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003743 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003744
3745 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3746
3747 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3748 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3749
3750 // FIXME: The goal is to use the user provided -o if that is our
3751 // final output, otherwise to drive from the original input
3752 // name. Find a clean way to go about this.
3753 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3754 Args.hasArg(options::OPT_o)) {
3755 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3756 CmdArgs.push_back("-auxbase-strip");
3757 CmdArgs.push_back(OutputOpt->getValue(Args));
3758 } else {
3759 CmdArgs.push_back("-auxbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003760 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003761 }
3762
3763 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3764
3765 Args.AddAllArgs(CmdArgs, options::OPT_O);
3766 // FIXME: -Wall is getting some special treatment. Investigate.
3767 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3768 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003769 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003770 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003771 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3772 // Honor -std-default.
3773 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3774 "-std=", /*Joined=*/true);
3775 }
3776
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003777 if (Args.hasArg(options::OPT_v))
3778 CmdArgs.push_back("-version");
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00003779 if (Args.hasArg(options::OPT_pg) &&
3780 getToolChain().SupportsProfiling())
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003781 CmdArgs.push_back("-p");
3782 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003783
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003784 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003785 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3786 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3787 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3788 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3789 //
3790 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003791 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3792 options::OPT_fsyntax_only),
3793 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003794 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3795 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3796 (*it)->claim();
3797 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003798 }
3799 }
3800 } else
3801 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003802
Daniel Dunbar089f8722011-04-07 20:41:03 +00003803 // Claim Clang only -f options, they aren't worth warning about.
3804 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3805
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003806 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3807 if (Args.hasArg(options::OPT_Qn))
3808 CmdArgs.push_back("-fno-ident");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003809
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003810 // FIXME: This isn't correct.
3811 //Args.AddLastArg(CmdArgs, options::OPT__help)
3812 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3813
3814 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3815
3816 // FIXME: Still don't get what is happening here. Investigate.
3817 Args.AddAllArgs(CmdArgs, options::OPT__param);
3818
3819 if (Args.hasArg(options::OPT_fmudflap) ||
3820 Args.hasArg(options::OPT_fmudflapth)) {
3821 CmdArgs.push_back("-fno-builtin");
3822 CmdArgs.push_back("-fno-merge-constants");
3823 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003824
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003825 if (Args.hasArg(options::OPT_coverage)) {
3826 CmdArgs.push_back("-fprofile-arcs");
3827 CmdArgs.push_back("-ftest-coverage");
3828 }
3829
3830 if (types::isCXX(Inputs[0].getType()))
3831 CmdArgs.push_back("-D__private_extern__=extern");
3832}
3833
3834void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3835 const InputInfoList &Inputs,
3836 const ArgStringList &OutputArgs) const {
3837 // Derived from cpp_options
3838 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003839
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003840 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3841
3842 AddCC1Args(Args, CmdArgs);
3843
3844 // NOTE: The code below has some commonality with cpp_options, but
3845 // in classic gcc style ends up sending things in different
3846 // orders. This may be a good merge candidate once we drop pedantic
3847 // compatibility.
3848
3849 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003850 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003851 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003852 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3853 // Honor -std-default.
3854 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3855 "-std=", /*Joined=*/true);
3856 }
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003857 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3858 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003859
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003860 // The driver treats -fsyntax-only specially.
3861 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3862
Daniel Dunbar089f8722011-04-07 20:41:03 +00003863 // Claim Clang only -f options, they aren't worth warning about.
3864 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3865
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003866 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3867 !Args.hasArg(options::OPT_fno_working_directory))
3868 CmdArgs.push_back("-fworking-directory");
3869
3870 Args.AddAllArgs(CmdArgs, options::OPT_O);
3871 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3872 if (Args.hasArg(options::OPT_save_temps))
3873 CmdArgs.push_back("-fpch-preprocess");
3874}
3875
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003876void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003877 ArgStringList &CmdArgs,
Mike Stump1eb44332009-09-09 15:08:12 +00003878 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003879 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003880
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003881 CheckPreprocessingOptions(D, Args);
3882
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003883 // Derived from cpp_unique_options.
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003884 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3885 Args.AddLastArg(CmdArgs, options::OPT_C);
3886 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003887 if (!Args.hasArg(options::OPT_Q))
3888 CmdArgs.push_back("-quiet");
3889 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor4c2bcad2010-03-24 20:13:48 +00003890 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003891 Args.AddLastArg(CmdArgs, options::OPT_v);
3892 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3893 Args.AddLastArg(CmdArgs, options::OPT_P);
3894
3895 // FIXME: Handle %I properly.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003896 if (getToolChain().getArch() == llvm::Triple::x86_64) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003897 CmdArgs.push_back("-imultilib");
3898 CmdArgs.push_back("x86_64");
3899 }
3900
3901 if (Args.hasArg(options::OPT_MD)) {
3902 CmdArgs.push_back("-MD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003903 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003904 }
3905
3906 if (Args.hasArg(options::OPT_MMD)) {
3907 CmdArgs.push_back("-MMD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003908 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003909 }
3910
3911 Args.AddLastArg(CmdArgs, options::OPT_M);
3912 Args.AddLastArg(CmdArgs, options::OPT_MM);
3913 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3914 Args.AddLastArg(CmdArgs, options::OPT_MG);
3915 Args.AddLastArg(CmdArgs, options::OPT_MP);
3916 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3917 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3918 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3919 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3920 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3921 CmdArgs.push_back("-MQ");
3922 CmdArgs.push_back(OutputOpt->getValue(Args));
3923 }
3924 }
3925
3926 Args.AddLastArg(CmdArgs, options::OPT_remap);
3927 if (Args.hasArg(options::OPT_g3))
3928 CmdArgs.push_back("-dD");
3929 Args.AddLastArg(CmdArgs, options::OPT_H);
3930
3931 AddCPPArgs(Args, CmdArgs);
3932
3933 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3934 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3935
3936 for (InputInfoList::const_iterator
3937 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3938 const InputInfo &II = *it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003939
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003940 CmdArgs.push_back(II.getFilename());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003941 }
3942
3943 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3944 options::OPT_Xpreprocessor);
3945
3946 if (Args.hasArg(options::OPT_fmudflap)) {
3947 CmdArgs.push_back("-D_MUDFLAP");
3948 CmdArgs.push_back("-include");
3949 CmdArgs.push_back("mf-runtime.h");
3950 }
3951
3952 if (Args.hasArg(options::OPT_fmudflapth)) {
3953 CmdArgs.push_back("-D_MUDFLAP");
3954 CmdArgs.push_back("-D_MUDFLAPTH");
3955 CmdArgs.push_back("-include");
3956 CmdArgs.push_back("mf-runtime.h");
3957 }
3958}
3959
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003960void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003961 ArgStringList &CmdArgs) const {
3962 // Derived from cpp spec.
3963
3964 if (Args.hasArg(options::OPT_static)) {
3965 // The gcc spec is broken here, it refers to dynamic but
3966 // that has been translated. Start by being bug compatible.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003967
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003968 // if (!Args.hasArg(arglist.parser.dynamicOption))
3969 CmdArgs.push_back("-D__STATIC__");
3970 } else
3971 CmdArgs.push_back("-D__DYNAMIC__");
3972
3973 if (Args.hasArg(options::OPT_pthread))
3974 CmdArgs.push_back("-D_REENTRANT");
3975}
3976
Daniel Dunbar40f12652009-03-29 17:08:39 +00003977void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003978 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003979 const InputInfoList &Inputs,
3980 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00003981 const char *LinkingOutput) const {
3982 ArgStringList CmdArgs;
3983
3984 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3985
3986 CmdArgs.push_back("-E");
3987
3988 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbar40f12652009-03-29 17:08:39 +00003989 Args.hasArg(options::OPT_traditional_cpp))
3990 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003991
Daniel Dunbar40f12652009-03-29 17:08:39 +00003992 ArgStringList OutputArgs;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003993 assert(Output.isFilename() && "Unexpected CC1 output.");
3994 OutputArgs.push_back("-o");
3995 OutputArgs.push_back(Output.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00003996
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +00003997 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbar9120f172009-03-29 22:27:40 +00003998 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3999 } else {
4000 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4001 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4002 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004003
Daniel Dunbar8a2073a2009-04-03 01:27:06 +00004004 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
4005
Chad Rosier4fe4d732011-09-08 00:38:00 +00004006 RemoveCC1UnsupportedArgs(CmdArgs);
4007
Daniel Dunbar40f12652009-03-29 17:08:39 +00004008 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004009 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004010 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004011 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00004012}
4013
4014void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004015 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004016 const InputInfoList &Inputs,
4017 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00004018 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004019 const Driver &D = getToolChain().getDriver();
Daniel Dunbar40f12652009-03-29 17:08:39 +00004020 ArgStringList CmdArgs;
4021
4022 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4023
Bob Wilson651f3d42012-04-01 23:03:29 +00004024 // Silence warning about unused --serialize-diagnostics
4025 Args.ClaimAllArgs(options::OPT__serialize_diags);
4026
Daniel Dunbar40f12652009-03-29 17:08:39 +00004027 types::ID InputType = Inputs[0].getType();
David Blaikied624a5b2012-04-04 20:43:14 +00004028 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004029 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004030 << A->getAsString(Args) << "-E";
4031
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004032 if (JA.getType() == types::TY_LLVM_IR ||
4033 JA.getType() == types::TY_LTO_IR)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004034 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004035 else if (JA.getType() == types::TY_LLVM_BC ||
4036 JA.getType() == types::TY_LTO_BC)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004037 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004038 else if (Output.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004039 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004040 << getToolChain().getTripleString();
Daniel Dunbarae24a882010-02-11 17:33:45 +00004041 else if (JA.getType() != types::TY_PP_Asm &&
4042 JA.getType() != types::TY_PCH)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004043 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004044 << getTypeName(JA.getType());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004045
4046 ArgStringList OutputArgs;
4047 if (Output.getType() != types::TY_PCH) {
4048 OutputArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004049 if (Output.isNothing())
Daniel Dunbar40f12652009-03-29 17:08:39 +00004050 OutputArgs.push_back("/dev/null");
4051 else
4052 OutputArgs.push_back(Output.getFilename());
4053 }
4054
4055 // There is no need for this level of compatibility, but it makes
4056 // diffing easier.
4057 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4058 Args.hasArg(options::OPT_S));
4059
4060 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004061 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbar40f12652009-03-29 17:08:39 +00004062 if (OutputArgsEarly) {
4063 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4064 } else {
4065 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4066 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4067 }
4068 } else {
4069 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004070
Daniel Dunbar40f12652009-03-29 17:08:39 +00004071 for (InputInfoList::const_iterator
4072 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4073 const InputInfo &II = *it;
4074
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004075 // Reject AST inputs.
4076 if (II.getType() == types::TY_AST) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004077 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004078 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004079 return;
4080 }
4081
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004082 CmdArgs.push_back(II.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004083 }
4084
4085 if (OutputArgsEarly) {
4086 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4087 } else {
4088 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4089 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4090 }
4091 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004092
Daniel Dunbar40f12652009-03-29 17:08:39 +00004093 if (Output.getType() == types::TY_PCH) {
4094 assert(Output.isFilename() && "Invalid PCH output.");
4095
4096 CmdArgs.push_back("-o");
4097 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4098 // to be a good reason.
Chad Rosier8c221b82011-08-01 19:58:48 +00004099 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004100 D.GetTemporaryPath("cc", "s"));
Chad Rosier8c221b82011-08-01 19:58:48 +00004101 C.addTempFile(TmpPath);
4102 CmdArgs.push_back(TmpPath);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004103
Eric Christopher88b7cf02011-08-19 00:30:14 +00004104 // If we're emitting a pch file with the last 4 characters of ".pth"
4105 // and falling back to llvm-gcc we want to use ".gch" instead.
4106 std::string OutputFile(Output.getFilename());
4107 size_t loc = OutputFile.rfind(".pth");
4108 if (loc != std::string::npos)
4109 OutputFile.replace(loc, 4, ".gch");
4110 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4111 CmdArgs.push_back(Tmp);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004112 }
Daniel Dunbar40f12652009-03-29 17:08:39 +00004113
Chad Rosier285f9a22011-08-17 18:24:55 +00004114 RemoveCC1UnsupportedArgs(CmdArgs);
4115
Daniel Dunbar40f12652009-03-29 17:08:39 +00004116 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004117 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004118 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004119 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00004120}
4121
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004122void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004123 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004124 const InputInfoList &Inputs,
4125 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004126 const char *LinkingOutput) const {
4127 ArgStringList CmdArgs;
4128
4129 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4130 const InputInfo &Input = Inputs[0];
4131
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004132 // Determine the original source input.
4133 const Action *SourceAction = &JA;
4134 while (SourceAction->getKind() != Action::InputClass) {
4135 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4136 SourceAction = SourceAction->getInputs()[0];
4137 }
4138
4139 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004140 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004141 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004142 if (Args.hasArg(options::OPT_gstabs))
4143 CmdArgs.push_back("--gstabs");
4144 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004145 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004146 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004147
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004148 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004149 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004150
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004151 // Use -force_cpusubtype_ALL on x86 by default.
4152 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4153 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004154 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4155 CmdArgs.push_back("-force_cpusubtype_ALL");
4156
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004157 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004158 (((Args.hasArg(options::OPT_mkernel) ||
4159 Args.hasArg(options::OPT_fapple_kext)) &&
4160 (!getDarwinToolChain().isTargetIPhoneOS() ||
4161 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4162 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004163 CmdArgs.push_back("-static");
4164
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004165 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4166 options::OPT_Xassembler);
4167
4168 assert(Output.isFilename() && "Unexpected lipo output.");
4169 CmdArgs.push_back("-o");
4170 CmdArgs.push_back(Output.getFilename());
4171
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004172 assert(Input.isFilename() && "Invalid input.");
4173 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004174
4175 // asm_final spec is empty.
4176
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004177 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004178 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004179 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004180}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004181
David Blaikie99ba9e32011-12-20 02:48:34 +00004182void darwin::DarwinTool::anchor() {}
4183
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004184void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4185 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004186 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004187
Daniel Dunbar02633b52009-03-26 16:23:12 +00004188 // Derived from darwin_arch spec.
4189 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004190 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004191
Daniel Dunbareeff4062010-01-22 02:04:58 +00004192 // FIXME: Is this needed anymore?
4193 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004194 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004195}
4196
Bill Wendling6acf8b42012-10-02 18:02:50 +00004197bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4198 // We only need to generate a temp path for LTO if we aren't compiling object
4199 // files. When compiling source files, we run 'dsymutil' after linking. We
4200 // don't run 'dsymutil' when compiling object files.
4201 for (InputInfoList::const_iterator
4202 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4203 if (it->getType() != types::TY_Object)
4204 return true;
4205
4206 return false;
4207}
4208
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004209void darwin::Link::AddLinkArgs(Compilation &C,
4210 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004211 ArgStringList &CmdArgs,
4212 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004213 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004214 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004215
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004216 unsigned Version[3] = { 0, 0, 0 };
4217 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4218 bool HadExtra;
4219 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4220 Version[1], Version[2], HadExtra) ||
4221 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004222 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004223 << A->getAsString(Args);
4224 }
4225
4226 // Newer linkers support -demangle, pass it if supported and not disabled by
4227 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004228 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004229 // Don't pass -demangle to ld_classic.
4230 //
4231 // FIXME: This is a temporary workaround, ld should be handling this.
4232 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4233 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004234 if (getToolChain().getArch() == llvm::Triple::x86) {
4235 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4236 options::OPT_Wl_COMMA),
4237 ie = Args.filtered_end(); it != ie; ++it) {
4238 const Arg *A = *it;
4239 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004240 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004241 UsesLdClassic = true;
4242 }
4243 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004244 if (!UsesLdClassic)
4245 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004246 }
4247
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004248 // If we are using LTO, then automatically create a temporary file path for
4249 // the linker to use, so that it's lifetime will extend past a possible
4250 // dsymutil step.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004251 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004252 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004253 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004254 C.addTempFile(TmpPath);
4255 CmdArgs.push_back("-object_path_lto");
4256 CmdArgs.push_back(TmpPath);
4257 }
4258
Daniel Dunbar02633b52009-03-26 16:23:12 +00004259 // Derived from the "link" spec.
4260 Args.AddAllArgs(CmdArgs, options::OPT_static);
4261 if (!Args.hasArg(options::OPT_static))
4262 CmdArgs.push_back("-dynamic");
4263 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4264 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4265 // here. How do we wish to handle such things?
4266 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004267
Daniel Dunbar02633b52009-03-26 16:23:12 +00004268 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004269 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004270 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004271 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004272
4273 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4274 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4275 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4276
4277 Arg *A;
4278 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4279 (A = Args.getLastArg(options::OPT_current__version)) ||
4280 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004281 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004282 << A->getAsString(Args) << "-dynamiclib";
4283
4284 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4285 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4286 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4287 } else {
4288 CmdArgs.push_back("-dylib");
4289
4290 Arg *A;
4291 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4292 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4293 (A = Args.getLastArg(options::OPT_client__name)) ||
4294 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4295 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4296 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004297 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004298 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004299
Daniel Dunbar02633b52009-03-26 16:23:12 +00004300 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4301 "-dylib_compatibility_version");
4302 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4303 "-dylib_current_version");
4304
Daniel Dunbara6d38492010-01-22 02:04:52 +00004305 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004306
4307 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4308 "-dylib_install_name");
4309 }
4310
4311 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4312 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4313 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004314 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004315 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004316 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4317 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4318 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4319 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4320 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4321 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004322 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004323 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4324 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4325 Args.AddAllArgs(CmdArgs, options::OPT_init);
4326
Daniel Dunbarce911f52011-04-28 21:23:41 +00004327 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004328 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004329
4330 // If we had an explicit -mios-simulator-version-min argument, honor that,
4331 // otherwise use the traditional deployment targets. We can't just check the
4332 // is-sim attribute because existing code follows this path, and the linker
4333 // may not handle the argument.
4334 //
4335 // FIXME: We may be able to remove this, once we can verify no one depends on
4336 // it.
4337 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4338 CmdArgs.push_back("-ios_simulator_version_min");
4339 else if (DarwinTC.isTargetIPhoneOS())
4340 CmdArgs.push_back("-iphoneos_version_min");
4341 else
4342 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004343 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004344
Daniel Dunbar02633b52009-03-26 16:23:12 +00004345 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4346 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4347 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4348 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4349 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004350
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004351 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4352 options::OPT_fno_pie,
4353 options::OPT_fno_PIE)) {
4354 if (A->getOption().matches(options::OPT_fpie) ||
4355 A->getOption().matches(options::OPT_fPIE))
4356 CmdArgs.push_back("-pie");
4357 else
4358 CmdArgs.push_back("-no_pie");
4359 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004360
4361 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4362 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4363 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4364 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4365 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4366 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4367 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4368 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4369 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4370 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4371 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4372 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4373 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4374 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4375 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4376 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004377
Daniel Dunbarcc957192011-05-02 21:03:47 +00004378 // Give --sysroot= preference, over the Apple specific behavior to also use
4379 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004380 StringRef sysroot = C.getSysRoot();
4381 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004382 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004383 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004384 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4385 CmdArgs.push_back("-syslibroot");
4386 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004387 }
4388
Daniel Dunbar02633b52009-03-26 16:23:12 +00004389 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4390 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4391 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4392 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4393 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004394 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004395 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4396 Args.AddAllArgs(CmdArgs, options::OPT_y);
4397 Args.AddLastArg(CmdArgs, options::OPT_w);
4398 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4399 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4400 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4401 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4402 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4403 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4404 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4405 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4406 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4407 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4408 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4409 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4410}
4411
4412void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004413 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004414 const InputInfoList &Inputs,
4415 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004416 const char *LinkingOutput) const {
4417 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004418
Daniel Dunbar02633b52009-03-26 16:23:12 +00004419 // The logic here is derived from gcc's behavior; most of which
4420 // comes from specs (starting with link_command). Consult gcc for
4421 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004422 ArgStringList CmdArgs;
4423
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004424 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4425 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4426 options::OPT_ccc_arcmt_migrate)) {
4427 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4428 (*I)->claim();
4429 const char *Exec =
4430 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4431 CmdArgs.push_back(Output.getFilename());
4432 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4433 return;
4434 }
4435
Daniel Dunbar02633b52009-03-26 16:23:12 +00004436 // I'm not sure why this particular decomposition exists in gcc, but
4437 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004438 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004439
Daniel Dunbar02633b52009-03-26 16:23:12 +00004440 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4441 Args.AddAllArgs(CmdArgs, options::OPT_s);
4442 Args.AddAllArgs(CmdArgs, options::OPT_t);
4443 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4444 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004445 Args.AddLastArg(CmdArgs, options::OPT_e);
4446 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4447 Args.AddAllArgs(CmdArgs, options::OPT_r);
4448
Daniel Dunbar270073c2010-10-18 22:08:36 +00004449 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4450 // members of static archive libraries which implement Objective-C classes or
4451 // categories.
4452 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4453 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004454
Daniel Dunbar02633b52009-03-26 16:23:12 +00004455 CmdArgs.push_back("-o");
4456 CmdArgs.push_back(Output.getFilename());
4457
Chad Rosier18937312012-05-16 23:45:12 +00004458 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004459 !Args.hasArg(options::OPT_nostartfiles)) {
4460 // Derived from startfile spec.
4461 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004462 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004463 if (getDarwinToolChain().isTargetIOSSimulator()) {
4464 // The simulator doesn't have a versioned crt1 file.
4465 CmdArgs.push_back("-ldylib1.o");
4466 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004467 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4468 CmdArgs.push_back("-ldylib1.o");
4469 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004470 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004471 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004472 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004473 CmdArgs.push_back("-ldylib1.10.5.o");
4474 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004475 } else {
4476 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004477 if (!Args.hasArg(options::OPT_static)) {
4478 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004479 if (getDarwinToolChain().isTargetIOSSimulator()) {
4480 // The simulator doesn't have a versioned crt1 file.
4481 CmdArgs.push_back("-lbundle1.o");
4482 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004483 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4484 CmdArgs.push_back("-lbundle1.o");
4485 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004486 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004487 CmdArgs.push_back("-lbundle1.o");
4488 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004489 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004490 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004491 if (Args.hasArg(options::OPT_pg) &&
4492 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004493 if (Args.hasArg(options::OPT_static) ||
4494 Args.hasArg(options::OPT_object) ||
4495 Args.hasArg(options::OPT_preload)) {
4496 CmdArgs.push_back("-lgcrt0.o");
4497 } else {
4498 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004499
Daniel Dunbar02633b52009-03-26 16:23:12 +00004500 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004501 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004502 // By default on OS X 10.8 and later, we don't link with a crt1.o
4503 // file and the linker knows to use _main as the entry point. But,
4504 // when compiling with -pg, we need to link with the gcrt1.o file,
4505 // so pass the -no_new_main option to tell the linker to use the
4506 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004507 if (getDarwinToolChain().isTargetMacOS() &&
4508 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4509 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004510 } else {
4511 if (Args.hasArg(options::OPT_static) ||
4512 Args.hasArg(options::OPT_object) ||
4513 Args.hasArg(options::OPT_preload)) {
4514 CmdArgs.push_back("-lcrt0.o");
4515 } else {
4516 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004517 if (getDarwinToolChain().isTargetIOSSimulator()) {
4518 // The simulator doesn't have a versioned crt1 file.
4519 CmdArgs.push_back("-lcrt1.o");
4520 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004521 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4522 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004523 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004524 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004525 } else {
4526 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4527 CmdArgs.push_back("-lcrt1.o");
4528 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4529 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004530 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004531 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004532
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004533 // darwin_crt2 spec is empty.
4534 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004535 }
4536 }
4537 }
4538 }
4539
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004540 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4541 Args.hasArg(options::OPT_shared_libgcc) &&
4542 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004543 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004544 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004545 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004546 }
4547 }
4548
4549 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004550
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004551 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4552 // symbols may appear. Mark all of them as dynamic_lookup.
4553 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4554 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4555 options::OPT_fno_address_sanitizer, false)) {
4556 if (Args.hasArg(options::OPT_dynamiclib) ||
4557 Args.hasArg(options::OPT_bundle)) {
4558 CmdArgs.push_back("-undefined");
4559 CmdArgs.push_back("dynamic_lookup");
4560 }
4561 }
4562
Daniel Dunbar02633b52009-03-26 16:23:12 +00004563 if (Args.hasArg(options::OPT_fopenmp))
4564 // This is more complicated in gcc...
4565 CmdArgs.push_back("-lgomp");
4566
Douglas Gregor04e326b2012-05-15 21:00:27 +00004567 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4568
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004569 if (isObjCRuntimeLinked(Args) &&
4570 !Args.hasArg(options::OPT_nostdlib) &&
4571 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004572 // Avoid linking compatibility stubs on i386 mac.
4573 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004574 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004575 // If we don't have ARC or subscripting runtime support, link in the
4576 // runtime stubs. We have to do this *before* adding any of the normal
4577 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004578 ObjCRuntime runtime =
4579 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004580 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004581 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004582 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004583 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004584 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004585 CmdArgs.push_back("-framework");
4586 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004587 // Link libobj.
4588 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004589 }
John McCallf85e1932011-06-15 23:02:42 +00004590
Daniel Dunbar02633b52009-03-26 16:23:12 +00004591 if (LinkingOutput) {
4592 CmdArgs.push_back("-arch_multiple");
4593 CmdArgs.push_back("-final_output");
4594 CmdArgs.push_back(LinkingOutput);
4595 }
4596
Daniel Dunbar02633b52009-03-26 16:23:12 +00004597 if (Args.hasArg(options::OPT_fnested_functions))
4598 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004599
Daniel Dunbar02633b52009-03-26 16:23:12 +00004600 if (!Args.hasArg(options::OPT_nostdlib) &&
4601 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004602 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004603 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004604
Daniel Dunbar02633b52009-03-26 16:23:12 +00004605 // link_ssp spec is empty.
4606
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004607 // Let the tool chain choose which runtime library to link.
4608 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004609 }
4610
Chad Rosier18937312012-05-16 23:45:12 +00004611 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004612 !Args.hasArg(options::OPT_nostartfiles)) {
4613 // endfile_spec is empty.
4614 }
4615
4616 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4617 Args.AddAllArgs(CmdArgs, options::OPT_F);
4618
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004619 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004620 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004621 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004622}
4623
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004624void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004625 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004626 const InputInfoList &Inputs,
4627 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004628 const char *LinkingOutput) const {
4629 ArgStringList CmdArgs;
4630
4631 CmdArgs.push_back("-create");
4632 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004633
4634 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004635 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004636
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004637 for (InputInfoList::const_iterator
4638 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4639 const InputInfo &II = *it;
4640 assert(II.isFilename() && "Unexpected lipo input.");
4641 CmdArgs.push_back(II.getFilename());
4642 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004643 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004644 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004645 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004646}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004647
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004648void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004649 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004650 const InputInfoList &Inputs,
4651 const ArgList &Args,
4652 const char *LinkingOutput) const {
4653 ArgStringList CmdArgs;
4654
Daniel Dunbar03e92302011-05-09 17:23:16 +00004655 CmdArgs.push_back("-o");
4656 CmdArgs.push_back(Output.getFilename());
4657
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004658 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4659 const InputInfo &Input = Inputs[0];
4660 assert(Input.isFilename() && "Unexpected dsymutil input.");
4661 CmdArgs.push_back(Input.getFilename());
4662
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004663 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004664 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004665 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004666}
4667
Eric Christopherf8571862011-08-23 17:56:55 +00004668void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4669 const InputInfo &Output,
4670 const InputInfoList &Inputs,
4671 const ArgList &Args,
4672 const char *LinkingOutput) const {
4673 ArgStringList CmdArgs;
4674 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004675 CmdArgs.push_back("--debug-info");
4676 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004677 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004678
4679 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4680 const InputInfo &Input = Inputs[0];
4681 assert(Input.isFilename() && "Unexpected verify input");
4682
4683 // Grabbing the output of the earlier dsymutil run.
4684 CmdArgs.push_back(Input.getFilename());
4685
4686 const char *Exec =
4687 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4688 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4689}
4690
David Chisnall31c46902012-02-15 13:39:01 +00004691void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4692 const InputInfo &Output,
4693 const InputInfoList &Inputs,
4694 const ArgList &Args,
4695 const char *LinkingOutput) const {
4696 ArgStringList CmdArgs;
4697
4698 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4699 options::OPT_Xassembler);
4700
4701 CmdArgs.push_back("-o");
4702 CmdArgs.push_back(Output.getFilename());
4703
4704 for (InputInfoList::const_iterator
4705 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4706 const InputInfo &II = *it;
4707 CmdArgs.push_back(II.getFilename());
4708 }
4709
4710 const char *Exec =
4711 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4712 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4713}
4714
4715
4716void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4717 const InputInfo &Output,
4718 const InputInfoList &Inputs,
4719 const ArgList &Args,
4720 const char *LinkingOutput) const {
4721 // FIXME: Find a real GCC, don't hard-code versions here
4722 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4723 const llvm::Triple &T = getToolChain().getTriple();
4724 std::string LibPath = "/usr/lib/";
4725 llvm::Triple::ArchType Arch = T.getArch();
4726 switch (Arch) {
4727 case llvm::Triple::x86:
4728 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4729 T.getOSName()).str() + "/4.5.2/";
4730 break;
4731 case llvm::Triple::x86_64:
4732 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4733 T.getOSName()).str();
4734 GCCLibPath += "/4.5.2/amd64/";
4735 LibPath += "amd64/";
4736 break;
4737 default:
4738 assert(0 && "Unsupported architecture");
4739 }
4740
4741 ArgStringList CmdArgs;
4742
David Chisnall41d476d2012-02-29 15:06:12 +00004743 // Demangle C++ names in errors
4744 CmdArgs.push_back("-C");
4745
David Chisnall31c46902012-02-15 13:39:01 +00004746 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4747 (!Args.hasArg(options::OPT_shared))) {
4748 CmdArgs.push_back("-e");
4749 CmdArgs.push_back("_start");
4750 }
4751
4752 if (Args.hasArg(options::OPT_static)) {
4753 CmdArgs.push_back("-Bstatic");
4754 CmdArgs.push_back("-dn");
4755 } else {
4756 CmdArgs.push_back("-Bdynamic");
4757 if (Args.hasArg(options::OPT_shared)) {
4758 CmdArgs.push_back("-shared");
4759 } else {
4760 CmdArgs.push_back("--dynamic-linker");
4761 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4762 }
4763 }
4764
4765 if (Output.isFilename()) {
4766 CmdArgs.push_back("-o");
4767 CmdArgs.push_back(Output.getFilename());
4768 } else {
4769 assert(Output.isNothing() && "Invalid output.");
4770 }
4771
4772 if (!Args.hasArg(options::OPT_nostdlib) &&
4773 !Args.hasArg(options::OPT_nostartfiles)) {
4774 if (!Args.hasArg(options::OPT_shared)) {
4775 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4776 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004777 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004778 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4779 } else {
4780 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004781 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4782 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004783 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004784 if (getToolChain().getDriver().CCCIsCXX)
4785 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004786 }
4787
4788 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4789
4790 Args.AddAllArgs(CmdArgs, options::OPT_L);
4791 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4792 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00004793 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00004794
4795 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4796
4797 if (!Args.hasArg(options::OPT_nostdlib) &&
4798 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00004799 if (getToolChain().getDriver().CCCIsCXX)
4800 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00004801 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00004802 if (!Args.hasArg(options::OPT_shared)) {
4803 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00004804 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00004805 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00004806 }
David Chisnall31c46902012-02-15 13:39:01 +00004807 }
4808
4809 if (!Args.hasArg(options::OPT_nostdlib) &&
4810 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00004811 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004812 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00004813 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004814
4815 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4816
4817 const char *Exec =
4818 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4819 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4820}
4821
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004822void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004823 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004824 const InputInfoList &Inputs,
4825 const ArgList &Args,
4826 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004827 ArgStringList CmdArgs;
4828
4829 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4830 options::OPT_Xassembler);
4831
4832 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004833 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004834
4835 for (InputInfoList::const_iterator
4836 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4837 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004838 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004839 }
4840
4841 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004842 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004843 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004844}
4845
4846void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004847 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004848 const InputInfoList &Inputs,
4849 const ArgList &Args,
4850 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004851 ArgStringList CmdArgs;
4852
4853 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004854 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004855 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004856 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004857 }
4858
4859 if (Args.hasArg(options::OPT_static)) {
4860 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004861 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004862 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004863// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004864 CmdArgs.push_back("-Bdynamic");
4865 if (Args.hasArg(options::OPT_shared)) {
4866 CmdArgs.push_back("-shared");
4867 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00004868 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004869 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4870 }
4871 }
4872
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004873 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004874 CmdArgs.push_back("-o");
4875 CmdArgs.push_back(Output.getFilename());
4876 } else {
4877 assert(Output.isNothing() && "Invalid output.");
4878 }
4879
4880 if (!Args.hasArg(options::OPT_nostdlib) &&
4881 !Args.hasArg(options::OPT_nostartfiles)) {
4882 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00004883 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004884 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004885 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004886 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004887 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004888 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004889 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004890 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004891 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004892 }
Chris Lattner38e317d2010-07-07 16:01:42 +00004893 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004894 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004895 }
4896
Daniel Dunbar294691e2009-11-04 06:24:38 +00004897 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4898 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004899 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004900
4901 Args.AddAllArgs(CmdArgs, options::OPT_L);
4902 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4903 Args.AddAllArgs(CmdArgs, options::OPT_e);
4904
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004905 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004906
4907 if (!Args.hasArg(options::OPT_nostdlib) &&
4908 !Args.hasArg(options::OPT_nodefaultlibs)) {
4909 // FIXME: For some reason GCC passes -lgcc before adding
4910 // the default system libraries. Just mimic this for now.
4911 CmdArgs.push_back("-lgcc");
4912
4913 if (Args.hasArg(options::OPT_pthread))
4914 CmdArgs.push_back("-pthread");
4915 if (!Args.hasArg(options::OPT_shared))
4916 CmdArgs.push_back("-lc");
4917 CmdArgs.push_back("-lgcc");
4918 }
4919
4920 if (!Args.hasArg(options::OPT_nostdlib) &&
4921 !Args.hasArg(options::OPT_nostartfiles)) {
4922 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004923 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004924 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004925 }
4926
Bill Wendling3f4be6f2011-06-27 19:15:03 +00004927 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00004928
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004929 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004930 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004931 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004932}
4933
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004934void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004935 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004936 const InputInfoList &Inputs,
4937 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00004938 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004939 ArgStringList CmdArgs;
4940
4941 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4942 options::OPT_Xassembler);
4943
4944 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004945 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004946
4947 for (InputInfoList::const_iterator
4948 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4949 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004950 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004951 }
4952
4953 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004954 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004955 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004956}
4957
4958void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004959 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004960 const InputInfoList &Inputs,
4961 const ArgList &Args,
4962 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004963 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004964 ArgStringList CmdArgs;
4965
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004966 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004967 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004968 CmdArgs.push_back("-e");
4969 CmdArgs.push_back("__start");
4970 }
4971
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004972 if (Args.hasArg(options::OPT_static)) {
4973 CmdArgs.push_back("-Bstatic");
4974 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00004975 if (Args.hasArg(options::OPT_rdynamic))
4976 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004977 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004978 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004979 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004980 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004981 } else {
4982 CmdArgs.push_back("-dynamic-linker");
4983 CmdArgs.push_back("/usr/libexec/ld.so");
4984 }
4985 }
4986
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004987 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004988 CmdArgs.push_back("-o");
4989 CmdArgs.push_back(Output.getFilename());
4990 } else {
4991 assert(Output.isNothing() && "Invalid output.");
4992 }
4993
4994 if (!Args.hasArg(options::OPT_nostdlib) &&
4995 !Args.hasArg(options::OPT_nostartfiles)) {
4996 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00004997 if (Args.hasArg(options::OPT_pg))
4998 CmdArgs.push_back(Args.MakeArgString(
4999 getToolChain().GetFilePath("gcrt0.o")));
5000 else
5001 CmdArgs.push_back(Args.MakeArgString(
5002 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005003 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005004 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005005 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005006 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005007 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005008 }
5009 }
5010
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005011 std::string Triple = getToolChain().getTripleString();
5012 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005013 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005014 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005015 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005016
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005017 Args.AddAllArgs(CmdArgs, options::OPT_L);
5018 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5019 Args.AddAllArgs(CmdArgs, options::OPT_e);
5020
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005021 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005022
5023 if (!Args.hasArg(options::OPT_nostdlib) &&
5024 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00005025 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005026 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005027 if (Args.hasArg(options::OPT_pg))
5028 CmdArgs.push_back("-lm_p");
5029 else
5030 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005031 }
5032
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005033 // FIXME: For some reason GCC passes -lgcc before adding
5034 // the default system libraries. Just mimic this for now.
5035 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005036
Eric Christopherdc6cc872012-09-13 06:32:34 +00005037 if (Args.hasArg(options::OPT_pthread)) {
5038 if (!Args.hasArg(options::OPT_shared) &&
5039 Args.hasArg(options::OPT_pg))
5040 CmdArgs.push_back("-lpthread_p");
5041 else
5042 CmdArgs.push_back("-lpthread");
5043 }
5044
Chandler Carruth657849c2011-12-17 22:32:42 +00005045 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005046 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005047 CmdArgs.push_back("-lc_p");
5048 else
5049 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005050 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005051
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005052 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005053 }
5054
5055 if (!Args.hasArg(options::OPT_nostdlib) &&
5056 !Args.hasArg(options::OPT_nostartfiles)) {
5057 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005058 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005059 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005060 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005061 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005062 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005063 }
5064
5065 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005066 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005067 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005068}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005069
Eli Friedman42f74f22012-08-08 23:57:20 +00005070void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5071 const InputInfo &Output,
5072 const InputInfoList &Inputs,
5073 const ArgList &Args,
5074 const char *LinkingOutput) const {
5075 ArgStringList CmdArgs;
5076
5077 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5078 options::OPT_Xassembler);
5079
5080 CmdArgs.push_back("-o");
5081 CmdArgs.push_back(Output.getFilename());
5082
5083 for (InputInfoList::const_iterator
5084 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5085 const InputInfo &II = *it;
5086 CmdArgs.push_back(II.getFilename());
5087 }
5088
5089 const char *Exec =
5090 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5091 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5092}
5093
5094void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5095 const InputInfo &Output,
5096 const InputInfoList &Inputs,
5097 const ArgList &Args,
5098 const char *LinkingOutput) const {
5099 const Driver &D = getToolChain().getDriver();
5100 ArgStringList CmdArgs;
5101
5102 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5103 (!Args.hasArg(options::OPT_shared))) {
5104 CmdArgs.push_back("-e");
5105 CmdArgs.push_back("__start");
5106 }
5107
5108 if (Args.hasArg(options::OPT_static)) {
5109 CmdArgs.push_back("-Bstatic");
5110 } else {
5111 if (Args.hasArg(options::OPT_rdynamic))
5112 CmdArgs.push_back("-export-dynamic");
5113 CmdArgs.push_back("--eh-frame-hdr");
5114 CmdArgs.push_back("-Bdynamic");
5115 if (Args.hasArg(options::OPT_shared)) {
5116 CmdArgs.push_back("-shared");
5117 } else {
5118 CmdArgs.push_back("-dynamic-linker");
5119 CmdArgs.push_back("/usr/libexec/ld.so");
5120 }
5121 }
5122
5123 if (Output.isFilename()) {
5124 CmdArgs.push_back("-o");
5125 CmdArgs.push_back(Output.getFilename());
5126 } else {
5127 assert(Output.isNothing() && "Invalid output.");
5128 }
5129
5130 if (!Args.hasArg(options::OPT_nostdlib) &&
5131 !Args.hasArg(options::OPT_nostartfiles)) {
5132 if (!Args.hasArg(options::OPT_shared)) {
5133 if (Args.hasArg(options::OPT_pg))
5134 CmdArgs.push_back(Args.MakeArgString(
5135 getToolChain().GetFilePath("gcrt0.o")));
5136 else
5137 CmdArgs.push_back(Args.MakeArgString(
5138 getToolChain().GetFilePath("crt0.o")));
5139 CmdArgs.push_back(Args.MakeArgString(
5140 getToolChain().GetFilePath("crtbegin.o")));
5141 } else {
5142 CmdArgs.push_back(Args.MakeArgString(
5143 getToolChain().GetFilePath("crtbeginS.o")));
5144 }
5145 }
5146
5147 Args.AddAllArgs(CmdArgs, options::OPT_L);
5148 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5149 Args.AddAllArgs(CmdArgs, options::OPT_e);
5150
5151 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5152
5153 if (!Args.hasArg(options::OPT_nostdlib) &&
5154 !Args.hasArg(options::OPT_nodefaultlibs)) {
5155 if (D.CCCIsCXX) {
5156 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5157 if (Args.hasArg(options::OPT_pg))
5158 CmdArgs.push_back("-lm_p");
5159 else
5160 CmdArgs.push_back("-lm");
5161 }
5162
5163 if (Args.hasArg(options::OPT_pthread))
5164 CmdArgs.push_back("-lpthread");
5165 if (!Args.hasArg(options::OPT_shared)) {
5166 if (Args.hasArg(options::OPT_pg))
5167 CmdArgs.push_back("-lc_p");
5168 else
5169 CmdArgs.push_back("-lc");
5170 }
5171
5172 std::string myarch = "-lclang_rt.";
5173 const llvm::Triple &T = getToolChain().getTriple();
5174 llvm::Triple::ArchType Arch = T.getArch();
5175 switch (Arch) {
5176 case llvm::Triple::arm:
5177 myarch += ("arm");
5178 break;
5179 case llvm::Triple::x86:
5180 myarch += ("i386");
5181 break;
5182 case llvm::Triple::x86_64:
5183 myarch += ("amd64");
5184 break;
5185 default:
5186 assert(0 && "Unsupported architecture");
5187 }
5188 CmdArgs.push_back(Args.MakeArgString(myarch));
5189 }
5190
5191 if (!Args.hasArg(options::OPT_nostdlib) &&
5192 !Args.hasArg(options::OPT_nostartfiles)) {
5193 if (!Args.hasArg(options::OPT_shared))
5194 CmdArgs.push_back(Args.MakeArgString(
5195 getToolChain().GetFilePath("crtend.o")));
5196 else
5197 CmdArgs.push_back(Args.MakeArgString(
5198 getToolChain().GetFilePath("crtendS.o")));
5199 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005200
5201 const char *Exec =
5202 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5203 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005204}
5205
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005206void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005207 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005208 const InputInfoList &Inputs,
5209 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005210 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005211 ArgStringList CmdArgs;
5212
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005213 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5214 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005215 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005216 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005217 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005218 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005219 else if (getToolChain().getArch() == llvm::Triple::mips ||
5220 getToolChain().getArch() == llvm::Triple::mipsel ||
5221 getToolChain().getArch() == llvm::Triple::mips64 ||
5222 getToolChain().getArch() == llvm::Triple::mips64el) {
5223 StringRef CPUName;
5224 StringRef ABIName;
5225 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005226
Eric Christopherc55da4b2012-09-05 21:32:44 +00005227 CmdArgs.push_back("-march");
5228 CmdArgs.push_back(CPUName.data());
5229
5230 // Convert ABI name to the GNU tools acceptable variant.
5231 if (ABIName == "o32")
5232 ABIName = "32";
5233 else if (ABIName == "n64")
5234 ABIName = "64";
5235
5236 CmdArgs.push_back("-mabi");
5237 CmdArgs.push_back(ABIName.data());
5238
5239 if (getToolChain().getArch() == llvm::Triple::mips ||
5240 getToolChain().getArch() == llvm::Triple::mips64)
5241 CmdArgs.push_back("-EB");
5242 else
5243 CmdArgs.push_back("-EL");
5244
5245 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5246 options::OPT_fpic, options::OPT_fno_pic,
5247 options::OPT_fPIE, options::OPT_fno_PIE,
5248 options::OPT_fpie, options::OPT_fno_pie);
5249 if (LastPICArg &&
5250 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5251 LastPICArg->getOption().matches(options::OPT_fpic) ||
5252 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5253 LastPICArg->getOption().matches(options::OPT_fpie))) {
5254 CmdArgs.push_back("-KPIC");
5255 }
5256 }
Eric Christophered734732010-03-02 02:41:08 +00005257
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005258 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5259 options::OPT_Xassembler);
5260
5261 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005262 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005263
5264 for (InputInfoList::const_iterator
5265 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5266 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005267 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005268 }
5269
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005270 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005271 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005272 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005273}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005274
5275void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005276 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005277 const InputInfoList &Inputs,
5278 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005279 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005280 const toolchains::FreeBSD& ToolChain =
5281 static_cast<const toolchains::FreeBSD&>(getToolChain());
5282 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005283 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005284
5285 // Silence warning for "clang -g foo.o -o foo"
5286 Args.ClaimAllArgs(options::OPT_g_Group);
5287 // and "clang -emit-llvm foo.o -o foo"
5288 Args.ClaimAllArgs(options::OPT_emit_llvm);
5289 // and for "clang -w foo.o -o foo". Other warning options are already
5290 // handled somewhere else.
5291 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005292
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005293 if (!D.SysRoot.empty())
5294 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5295
Roman Divacky94380162012-08-28 15:09:03 +00005296 if (Args.hasArg(options::OPT_pie))
5297 CmdArgs.push_back("-pie");
5298
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005299 if (Args.hasArg(options::OPT_static)) {
5300 CmdArgs.push_back("-Bstatic");
5301 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005302 if (Args.hasArg(options::OPT_rdynamic))
5303 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005304 CmdArgs.push_back("--eh-frame-hdr");
5305 if (Args.hasArg(options::OPT_shared)) {
5306 CmdArgs.push_back("-Bshareable");
5307 } else {
5308 CmdArgs.push_back("-dynamic-linker");
5309 CmdArgs.push_back("/libexec/ld-elf.so.1");
5310 }
Roman Divacky94380162012-08-28 15:09:03 +00005311 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5312 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005313 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5314 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5315 CmdArgs.push_back("--hash-style=both");
5316 }
5317 }
5318 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005319 }
5320
5321 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5322 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005323 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005324 CmdArgs.push_back("-m");
5325 CmdArgs.push_back("elf_i386_fbsd");
5326 }
5327
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005328 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005329 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005330 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005331 }
5332
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005333 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005334 CmdArgs.push_back("-o");
5335 CmdArgs.push_back(Output.getFilename());
5336 } else {
5337 assert(Output.isNothing() && "Invalid output.");
5338 }
5339
5340 if (!Args.hasArg(options::OPT_nostdlib) &&
5341 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005342 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005343 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005344 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005345 crt1 = "gcrt1.o";
5346 else if (Args.hasArg(options::OPT_pie))
5347 crt1 = "Scrt1.o";
5348 else
5349 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005350 }
Roman Divacky94380162012-08-28 15:09:03 +00005351 if (crt1)
5352 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5353
5354 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5355
5356 const char *crtbegin = NULL;
5357 if (Args.hasArg(options::OPT_static))
5358 crtbegin = "crtbeginT.o";
5359 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5360 crtbegin = "crtbeginS.o";
5361 else
5362 crtbegin = "crtbegin.o";
5363
5364 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005365 }
5366
5367 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005368 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005369 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5370 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005371 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005372 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5373 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005374 Args.AddAllArgs(CmdArgs, options::OPT_s);
5375 Args.AddAllArgs(CmdArgs, options::OPT_t);
5376 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5377 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005378
Roman Divacky94380162012-08-28 15:09:03 +00005379 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005380
5381 if (!Args.hasArg(options::OPT_nostdlib) &&
5382 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005383 if (D.CCCIsCXX) {
Roman Divacky94380162012-08-28 15:09:03 +00005384 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005385 if (Args.hasArg(options::OPT_pg))
5386 CmdArgs.push_back("-lm_p");
5387 else
5388 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005389 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005390 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5391 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005392 if (Args.hasArg(options::OPT_pg))
5393 CmdArgs.push_back("-lgcc_p");
5394 else
5395 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005396 if (Args.hasArg(options::OPT_static)) {
5397 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005398 } else if (Args.hasArg(options::OPT_pg)) {
5399 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005400 } else {
5401 CmdArgs.push_back("--as-needed");
5402 CmdArgs.push_back("-lgcc_s");
5403 CmdArgs.push_back("--no-as-needed");
5404 }
5405
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005406 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005407 if (Args.hasArg(options::OPT_pg))
5408 CmdArgs.push_back("-lpthread_p");
5409 else
5410 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005411 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005412
Roman Divackyc16bb762011-02-10 16:59:40 +00005413 if (Args.hasArg(options::OPT_pg)) {
5414 if (Args.hasArg(options::OPT_shared))
5415 CmdArgs.push_back("-lc");
5416 else
5417 CmdArgs.push_back("-lc_p");
5418 CmdArgs.push_back("-lgcc_p");
5419 } else {
5420 CmdArgs.push_back("-lc");
5421 CmdArgs.push_back("-lgcc");
5422 }
5423
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005424 if (Args.hasArg(options::OPT_static)) {
5425 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005426 } else if (Args.hasArg(options::OPT_pg)) {
5427 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005428 } else {
5429 CmdArgs.push_back("--as-needed");
5430 CmdArgs.push_back("-lgcc_s");
5431 CmdArgs.push_back("--no-as-needed");
5432 }
5433 }
5434
5435 if (!Args.hasArg(options::OPT_nostdlib) &&
5436 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005437 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005438 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005439 else
5440 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005442 }
5443
Roman Divacky94380162012-08-28 15:09:03 +00005444 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005445
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005446 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005447 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005448 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005449}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005450
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005451void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5452 const InputInfo &Output,
5453 const InputInfoList &Inputs,
5454 const ArgList &Args,
5455 const char *LinkingOutput) const {
5456 ArgStringList CmdArgs;
5457
5458 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5459 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005460 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005461 CmdArgs.push_back("--32");
5462
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005463 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005464 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005465 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005466 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005467 CmdArgs.push_back("-EL");
5468
5469 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5470 options::OPT_Xassembler);
5471
5472 CmdArgs.push_back("-o");
5473 CmdArgs.push_back(Output.getFilename());
5474
5475 for (InputInfoList::const_iterator
5476 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5477 const InputInfo &II = *it;
5478 CmdArgs.push_back(II.getFilename());
5479 }
5480
David Chisnall5adcec12011-09-27 22:03:18 +00005481 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005482 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5483}
5484
5485void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5486 const InputInfo &Output,
5487 const InputInfoList &Inputs,
5488 const ArgList &Args,
5489 const char *LinkingOutput) const {
5490 const Driver &D = getToolChain().getDriver();
5491 ArgStringList CmdArgs;
5492
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005493 if (!D.SysRoot.empty())
5494 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5495
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005496 if (Args.hasArg(options::OPT_static)) {
5497 CmdArgs.push_back("-Bstatic");
5498 } else {
5499 if (Args.hasArg(options::OPT_rdynamic))
5500 CmdArgs.push_back("-export-dynamic");
5501 CmdArgs.push_back("--eh-frame-hdr");
5502 if (Args.hasArg(options::OPT_shared)) {
5503 CmdArgs.push_back("-Bshareable");
5504 } else {
5505 CmdArgs.push_back("-dynamic-linker");
5506 CmdArgs.push_back("/libexec/ld.elf_so");
5507 }
5508 }
5509
5510 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5511 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005512 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005513 CmdArgs.push_back("-m");
5514 CmdArgs.push_back("elf_i386");
5515 }
5516
5517 if (Output.isFilename()) {
5518 CmdArgs.push_back("-o");
5519 CmdArgs.push_back(Output.getFilename());
5520 } else {
5521 assert(Output.isNothing() && "Invalid output.");
5522 }
5523
5524 if (!Args.hasArg(options::OPT_nostdlib) &&
5525 !Args.hasArg(options::OPT_nostartfiles)) {
5526 if (!Args.hasArg(options::OPT_shared)) {
5527 CmdArgs.push_back(Args.MakeArgString(
5528 getToolChain().GetFilePath("crt0.o")));
5529 CmdArgs.push_back(Args.MakeArgString(
5530 getToolChain().GetFilePath("crti.o")));
5531 CmdArgs.push_back(Args.MakeArgString(
5532 getToolChain().GetFilePath("crtbegin.o")));
5533 } else {
5534 CmdArgs.push_back(Args.MakeArgString(
5535 getToolChain().GetFilePath("crti.o")));
5536 CmdArgs.push_back(Args.MakeArgString(
5537 getToolChain().GetFilePath("crtbeginS.o")));
5538 }
5539 }
5540
5541 Args.AddAllArgs(CmdArgs, options::OPT_L);
5542 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5543 Args.AddAllArgs(CmdArgs, options::OPT_e);
5544 Args.AddAllArgs(CmdArgs, options::OPT_s);
5545 Args.AddAllArgs(CmdArgs, options::OPT_t);
5546 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5547 Args.AddAllArgs(CmdArgs, options::OPT_r);
5548
5549 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5550
5551 if (!Args.hasArg(options::OPT_nostdlib) &&
5552 !Args.hasArg(options::OPT_nodefaultlibs)) {
5553 if (D.CCCIsCXX) {
5554 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5555 CmdArgs.push_back("-lm");
5556 }
5557 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5558 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005559 if (Args.hasArg(options::OPT_static)) {
5560 CmdArgs.push_back("-lgcc_eh");
5561 } else {
5562 CmdArgs.push_back("--as-needed");
5563 CmdArgs.push_back("-lgcc_s");
5564 CmdArgs.push_back("--no-as-needed");
5565 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005566 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005567
5568 if (Args.hasArg(options::OPT_pthread))
5569 CmdArgs.push_back("-lpthread");
5570 CmdArgs.push_back("-lc");
5571
5572 CmdArgs.push_back("-lgcc");
5573 if (Args.hasArg(options::OPT_static)) {
5574 CmdArgs.push_back("-lgcc_eh");
5575 } else {
5576 CmdArgs.push_back("--as-needed");
5577 CmdArgs.push_back("-lgcc_s");
5578 CmdArgs.push_back("--no-as-needed");
5579 }
5580 }
5581
5582 if (!Args.hasArg(options::OPT_nostdlib) &&
5583 !Args.hasArg(options::OPT_nostartfiles)) {
5584 if (!Args.hasArg(options::OPT_shared))
5585 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5586 "crtend.o")));
5587 else
5588 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5589 "crtendS.o")));
5590 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5591 "crtn.o")));
5592 }
5593
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005594 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005595
David Chisnall5adcec12011-09-27 22:03:18 +00005596 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005597 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5598}
5599
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005600void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5601 const InputInfo &Output,
5602 const InputInfoList &Inputs,
5603 const ArgList &Args,
5604 const char *LinkingOutput) const {
5605 ArgStringList CmdArgs;
5606
5607 // Add --32/--64 to make sure we get the format we want.
5608 // This is incomplete
5609 if (getToolChain().getArch() == llvm::Triple::x86) {
5610 CmdArgs.push_back("--32");
5611 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5612 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005613 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5614 CmdArgs.push_back("-a32");
5615 CmdArgs.push_back("-mppc");
5616 CmdArgs.push_back("-many");
5617 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5618 CmdArgs.push_back("-a64");
5619 CmdArgs.push_back("-mppc64");
5620 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005621 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005622 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005623 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5624 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005625
5626 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5627 getToolChain().getTriple());
5628 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005629
5630 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5631 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5632 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005633 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5634 getToolChain().getArch() == llvm::Triple::mipsel ||
5635 getToolChain().getArch() == llvm::Triple::mips64 ||
5636 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005637 StringRef CPUName;
5638 StringRef ABIName;
5639 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005640
Simon Atanasyan073a7802012-04-07 22:31:29 +00005641 CmdArgs.push_back("-march");
5642 CmdArgs.push_back(CPUName.data());
5643
5644 // Convert ABI name to the GNU tools acceptable variant.
5645 if (ABIName == "o32")
5646 ABIName = "32";
5647 else if (ABIName == "n64")
5648 ABIName = "64";
5649
5650 CmdArgs.push_back("-mabi");
5651 CmdArgs.push_back(ABIName.data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005652
5653 if (getToolChain().getArch() == llvm::Triple::mips ||
5654 getToolChain().getArch() == llvm::Triple::mips64)
5655 CmdArgs.push_back("-EB");
5656 else
5657 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005658
5659 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5660 options::OPT_fpic, options::OPT_fno_pic,
5661 options::OPT_fPIE, options::OPT_fno_PIE,
5662 options::OPT_fpie, options::OPT_fno_pie);
5663 if (LastPICArg &&
5664 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5665 LastPICArg->getOption().matches(options::OPT_fpic) ||
5666 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5667 LastPICArg->getOption().matches(options::OPT_fpie))) {
5668 CmdArgs.push_back("-KPIC");
5669 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005670 }
5671
5672 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5673 options::OPT_Xassembler);
5674
5675 CmdArgs.push_back("-o");
5676 CmdArgs.push_back(Output.getFilename());
5677
5678 for (InputInfoList::const_iterator
5679 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5680 const InputInfo &II = *it;
5681 CmdArgs.push_back(II.getFilename());
5682 }
5683
5684 const char *Exec =
5685 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5686 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5687}
5688
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005689static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5690 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005691 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005692 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005693 Args.hasArg(options::OPT_static_libgcc);
5694 if (!D.CCCIsCXX)
5695 CmdArgs.push_back("-lgcc");
5696
5697 if (StaticLibgcc) {
5698 if (D.CCCIsCXX)
5699 CmdArgs.push_back("-lgcc");
5700 } else {
5701 if (!D.CCCIsCXX)
5702 CmdArgs.push_back("--as-needed");
5703 CmdArgs.push_back("-lgcc_s");
5704 if (!D.CCCIsCXX)
5705 CmdArgs.push_back("--no-as-needed");
5706 }
5707
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005708 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005709 CmdArgs.push_back("-lgcc_eh");
5710 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5711 CmdArgs.push_back("-lgcc");
5712}
5713
Rafael Espindolac1da9812010-11-07 20:14:31 +00005714void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5715 const InputInfo &Output,
5716 const InputInfoList &Inputs,
5717 const ArgList &Args,
5718 const char *LinkingOutput) const {
5719 const toolchains::Linux& ToolChain =
5720 static_cast<const toolchains::Linux&>(getToolChain());
5721 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005722 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chien94a71422012-09-02 09:30:11 +00005723 llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005724
Rafael Espindolac1da9812010-11-07 20:14:31 +00005725 ArgStringList CmdArgs;
5726
Rafael Espindola26f14c32010-11-15 18:28:16 +00005727 // Silence warning for "clang -g foo.o -o foo"
5728 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005729 // and "clang -emit-llvm foo.o -o foo"
5730 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00005731 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00005732 // handled somewhere else.
5733 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00005734
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005735 if (!D.SysRoot.empty())
5736 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005737
Rafael Espindolafdda1712010-11-17 22:26:15 +00005738 if (Args.hasArg(options::OPT_pie))
5739 CmdArgs.push_back("-pie");
5740
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00005741 if (Args.hasArg(options::OPT_rdynamic))
5742 CmdArgs.push_back("-export-dynamic");
5743
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00005744 if (Args.hasArg(options::OPT_s))
5745 CmdArgs.push_back("-s");
5746
Rafael Espindolac1da9812010-11-07 20:14:31 +00005747 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5748 e = ToolChain.ExtraOpts.end();
5749 i != e; ++i)
5750 CmdArgs.push_back(i->c_str());
5751
5752 if (!Args.hasArg(options::OPT_static)) {
5753 CmdArgs.push_back("--eh-frame-hdr");
5754 }
5755
5756 CmdArgs.push_back("-m");
5757 if (ToolChain.getArch() == llvm::Triple::x86)
5758 CmdArgs.push_back("elf_i386");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005759 else 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 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005762 else if (ToolChain.getArch() == llvm::Triple::ppc)
5763 CmdArgs.push_back("elf32ppclinux");
5764 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5765 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00005766 else if (ToolChain.getArch() == llvm::Triple::mips)
5767 CmdArgs.push_back("elf32btsmip");
5768 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5769 CmdArgs.push_back("elf32ltsmip");
5770 else if (ToolChain.getArch() == llvm::Triple::mips64)
5771 CmdArgs.push_back("elf64btsmip");
5772 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5773 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005774 else
5775 CmdArgs.push_back("elf_x86_64");
5776
5777 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00005778 if (ToolChain.getArch() == llvm::Triple::arm
5779 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005780 CmdArgs.push_back("-Bstatic");
5781 else
5782 CmdArgs.push_back("-static");
5783 } else if (Args.hasArg(options::OPT_shared)) {
5784 CmdArgs.push_back("-shared");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005785 if ((ToolChain.getArch() == llvm::Triple::arm
5786 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5787 CmdArgs.push_back("-Bsymbolic");
5788 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005789 }
5790
5791 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00005792 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00005793 (!Args.hasArg(options::OPT_static) &&
5794 !Args.hasArg(options::OPT_shared))) {
5795 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005796 if (isAndroid)
5797 CmdArgs.push_back("/system/bin/linker");
5798 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005799 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregorf0594d82011-03-06 19:11:49 +00005800 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liu6cc9dc82012-07-30 11:05:56 +00005801 ToolChain.getArch() == llvm::Triple::thumb) {
5802 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5803 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5804 else
5805 CmdArgs.push_back("/lib/ld-linux.so.3");
5806 }
Eli Friedman5bea4f62011-11-08 19:43:37 +00005807 else if (ToolChain.getArch() == llvm::Triple::mips ||
5808 ToolChain.getArch() == llvm::Triple::mipsel)
5809 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan8491cb22012-04-06 20:14:27 +00005810 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5811 ToolChain.getArch() == llvm::Triple::mips64el)
5812 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005813 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005814 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005815 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005816 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005817 else
5818 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5819 }
5820
5821 CmdArgs.push_back("-o");
5822 CmdArgs.push_back(Output.getFilename());
5823
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005824 if (!Args.hasArg(options::OPT_nostdlib) &&
5825 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005826 if (!isAndroid) {
5827 const char *crt1 = NULL;
5828 if (!Args.hasArg(options::OPT_shared)){
5829 if (Args.hasArg(options::OPT_pie))
5830 crt1 = "Scrt1.o";
5831 else
5832 crt1 = "crt1.o";
5833 }
5834 if (crt1)
5835 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005836
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005837 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5838 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005839
Rafael Espindola89414b32010-11-12 03:00:39 +00005840 const char *crtbegin;
5841 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005842 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005843 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005844 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005845 else if (Args.hasArg(options::OPT_pie))
5846 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005847 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005848 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005849 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00005850
5851 // Add crtfastmath.o if available and fast math is enabled.
5852 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00005853 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005854
5855 Args.AddAllArgs(CmdArgs, options::OPT_L);
5856
5857 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5858
Roman Divacky58e5ac92011-03-01 17:53:14 +00005859 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5860 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005861 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005862
Rafael Espindolac5151542012-04-09 23:53:34 +00005863 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5864 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5865 // forward.
5866 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5867 CmdArgs.push_back("-plugin");
5868 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5869 CmdArgs.push_back(Args.MakeArgString(Plugin));
5870 }
5871
Nick Lewyckye276cfc2012-08-17 03:39:16 +00005872 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5873 CmdArgs.push_back("--no-demangle");
5874
Rafael Espindolac1da9812010-11-07 20:14:31 +00005875 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5876
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005877 if (D.CCCIsCXX &&
5878 !Args.hasArg(options::OPT_nostdlib) &&
5879 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00005880 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5881 !Args.hasArg(options::OPT_static);
5882 if (OnlyLibstdcxxStatic)
5883 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005884 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00005885 if (OnlyLibstdcxxStatic)
5886 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005887 CmdArgs.push_back("-lm");
5888 }
5889
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005890 // Call this before we add the C run-time.
5891 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00005892 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005893
Rafael Espindola89414b32010-11-12 03:00:39 +00005894 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005895 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5896 if (Args.hasArg(options::OPT_static))
5897 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00005898
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005899 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00005900
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005901 if (Args.hasArg(options::OPT_pthread) ||
5902 Args.hasArg(options::OPT_pthreads))
5903 CmdArgs.push_back("-lpthread");
5904
5905 CmdArgs.push_back("-lc");
5906
5907 if (Args.hasArg(options::OPT_static))
5908 CmdArgs.push_back("--end-group");
5909 else
5910 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5911 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00005912
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005913 if (!Args.hasArg(options::OPT_nostartfiles)) {
5914 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005915 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005916 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005917 else if (Args.hasArg(options::OPT_pie))
5918 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005919 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005920 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005921
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005922 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005923 if (!isAndroid)
5924 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005925 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005926 }
5927
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005928 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Richard Smith4def70d2012-10-09 19:52:38 +00005929 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005930
Rafael Espindolac1da9812010-11-07 20:14:31 +00005931 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5932}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005933
Chris Lattner38e317d2010-07-07 16:01:42 +00005934void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005935 const InputInfo &Output,
5936 const InputInfoList &Inputs,
5937 const ArgList &Args,
5938 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005939 ArgStringList CmdArgs;
5940
5941 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5942 options::OPT_Xassembler);
5943
5944 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005945 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005946
5947 for (InputInfoList::const_iterator
5948 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5949 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005950 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005951 }
5952
5953 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00005954 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005955 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005956}
5957
5958void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005959 const InputInfo &Output,
5960 const InputInfoList &Inputs,
5961 const ArgList &Args,
5962 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005963 const Driver &D = getToolChain().getDriver();
5964 ArgStringList CmdArgs;
5965
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005966 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005967 CmdArgs.push_back("-o");
5968 CmdArgs.push_back(Output.getFilename());
5969 } else {
5970 assert(Output.isNothing() && "Invalid output.");
5971 }
5972
5973 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00005974 !Args.hasArg(options::OPT_nostartfiles)) {
5975 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5976 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5977 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5978 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5979 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005980
5981 Args.AddAllArgs(CmdArgs, options::OPT_L);
5982 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5983 Args.AddAllArgs(CmdArgs, options::OPT_e);
5984
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005985 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005986
Eli Friedman6d402dc2011-12-08 23:54:21 +00005987 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5988
Chris Lattner38e317d2010-07-07 16:01:42 +00005989 if (!Args.hasArg(options::OPT_nostdlib) &&
5990 !Args.hasArg(options::OPT_nodefaultlibs)) {
5991 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005992 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005993 CmdArgs.push_back("-lm");
5994 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005995 }
5996
5997 if (!Args.hasArg(options::OPT_nostdlib) &&
5998 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00005999 if (Args.hasArg(options::OPT_pthread))
6000 CmdArgs.push_back("-lpthread");
6001 CmdArgs.push_back("-lc");
6002 CmdArgs.push_back("-lCompilerRT-Generic");
6003 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6004 CmdArgs.push_back(
6005 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006006 }
6007
Eli Friedman6d402dc2011-12-08 23:54:21 +00006008 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006009 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006010}
6011
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006012/// DragonFly Tools
6013
6014// For now, DragonFly Assemble does just about the same as for
6015// FreeBSD, but this may change soon.
6016void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006017 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006018 const InputInfoList &Inputs,
6019 const ArgList &Args,
6020 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006021 ArgStringList CmdArgs;
6022
6023 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6024 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006025 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006026 CmdArgs.push_back("--32");
6027
6028 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6029 options::OPT_Xassembler);
6030
6031 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006032 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006033
6034 for (InputInfoList::const_iterator
6035 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6036 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006037 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006038 }
6039
6040 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006041 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006043}
6044
6045void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006046 const InputInfo &Output,
6047 const InputInfoList &Inputs,
6048 const ArgList &Args,
6049 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006050 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006051 ArgStringList CmdArgs;
6052
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006053 if (!D.SysRoot.empty())
6054 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6055
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006056 if (Args.hasArg(options::OPT_static)) {
6057 CmdArgs.push_back("-Bstatic");
6058 } else {
6059 if (Args.hasArg(options::OPT_shared))
6060 CmdArgs.push_back("-Bshareable");
6061 else {
6062 CmdArgs.push_back("-dynamic-linker");
6063 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6064 }
6065 }
6066
6067 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6068 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006069 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006070 CmdArgs.push_back("-m");
6071 CmdArgs.push_back("elf_i386");
6072 }
6073
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006074 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006075 CmdArgs.push_back("-o");
6076 CmdArgs.push_back(Output.getFilename());
6077 } else {
6078 assert(Output.isNothing() && "Invalid output.");
6079 }
6080
6081 if (!Args.hasArg(options::OPT_nostdlib) &&
6082 !Args.hasArg(options::OPT_nostartfiles)) {
6083 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006084 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006085 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006086 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006087 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006088 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006089 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006090 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00006091 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006092 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006093 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006094 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006095 }
6096 }
6097
6098 Args.AddAllArgs(CmdArgs, options::OPT_L);
6099 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6100 Args.AddAllArgs(CmdArgs, options::OPT_e);
6101
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006102 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006103
6104 if (!Args.hasArg(options::OPT_nostdlib) &&
6105 !Args.hasArg(options::OPT_nodefaultlibs)) {
6106 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6107 // rpaths
6108 CmdArgs.push_back("-L/usr/lib/gcc41");
6109
6110 if (!Args.hasArg(options::OPT_static)) {
6111 CmdArgs.push_back("-rpath");
6112 CmdArgs.push_back("/usr/lib/gcc41");
6113
6114 CmdArgs.push_back("-rpath-link");
6115 CmdArgs.push_back("/usr/lib/gcc41");
6116
6117 CmdArgs.push_back("-rpath");
6118 CmdArgs.push_back("/usr/lib");
6119
6120 CmdArgs.push_back("-rpath-link");
6121 CmdArgs.push_back("/usr/lib");
6122 }
6123
Rafael Espindola405861d2010-07-20 12:59:03 +00006124 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006125 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006126 CmdArgs.push_back("-lm");
6127 }
6128
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006129 if (Args.hasArg(options::OPT_shared)) {
6130 CmdArgs.push_back("-lgcc_pic");
6131 } else {
6132 CmdArgs.push_back("-lgcc");
6133 }
6134
6135
6136 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006137 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006138
6139 if (!Args.hasArg(options::OPT_nolibc)) {
6140 CmdArgs.push_back("-lc");
6141 }
6142
6143 if (Args.hasArg(options::OPT_shared)) {
6144 CmdArgs.push_back("-lgcc_pic");
6145 } else {
6146 CmdArgs.push_back("-lgcc");
6147 }
6148 }
6149
6150 if (!Args.hasArg(options::OPT_nostdlib) &&
6151 !Args.hasArg(options::OPT_nostartfiles)) {
6152 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006153 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006154 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006155 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006156 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006157 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006158 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006159 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006160 }
6161
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006162 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006163
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006164 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006165 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006166 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006167}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006168
6169void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6170 const InputInfo &Output,
6171 const InputInfoList &Inputs,
6172 const ArgList &Args,
6173 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006174 ArgStringList CmdArgs;
6175
6176 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006177 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6178 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006179 } else {
6180 assert(Output.isNothing() && "Invalid output.");
6181 }
6182
6183 if (!Args.hasArg(options::OPT_nostdlib) &&
6184 !Args.hasArg(options::OPT_nostartfiles)) {
6185 CmdArgs.push_back("-defaultlib:libcmt");
6186 }
6187
6188 CmdArgs.push_back("-nologo");
6189
Michael J. Spencera2284f52012-06-18 16:56:04 +00006190 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6191
6192 // Add filenames immediately.
6193 for (InputInfoList::const_iterator
6194 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6195 if (it->isFilename())
6196 CmdArgs.push_back(it->getFilename());
6197 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006198
6199 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006200 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006201 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6202}