blob: ed67f7b9a1e432ff00b2f2b1d0424b2d6bccf556 [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;
222 if (Output.getType() == types::TY_Dependencies) {
Daniel Dunbar7c1e4652010-08-02 02:38:21 +0000223 DepFile = Output.getFilename();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000224 } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
225 DepFile = MF->getValue(Args);
Peter Collingbourne5d4d9802011-11-21 00:01:05 +0000226 C.addFailureResultFile(DepFile);
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")
445 .Cases("cortex-a8", "cortex-a9", "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")
Chad Rosierae1aee62011-10-07 17:48:56 +0000449 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000450}
451
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000452/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
453//
454// FIXME: tblgen this.
455static std::string getARMTargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue(Args);
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 StringRef MArch;
470 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
471 // Otherwise, if we have -march= choose the base CPU for that arch.
472 MArch = A->getValue(Args);
473 } else {
474 // Otherwise, use the Arch from the triple.
475 MArch = Triple.getArchName();
476 }
477
478 // Handle -march=native.
479 std::string NativeMArch;
480 if (MArch == "native") {
481 std::string CPU = llvm::sys::getHostCPUName();
482 if (CPU != "generic") {
483 // Translate the native cpu into the architecture. The switch below will
484 // then chose the minimum cpu for that arch.
485 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
486 MArch = NativeMArch;
487 }
488 }
489
490 return llvm::StringSwitch<const char *>(MArch)
491 .Cases("armv2", "armv2a","arm2")
492 .Case("armv3", "arm6")
493 .Case("armv3m", "arm7m")
494 .Cases("armv4", "armv4t", "arm7tdmi")
495 .Cases("armv5", "armv5t", "arm10tdmi")
496 .Cases("armv5e", "armv5te", "arm1022e")
497 .Case("armv5tej", "arm926ej-s")
498 .Cases("armv6", "armv6k", "arm1136jf-s")
499 .Case("armv6j", "arm1136j-s")
500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
501 .Case("armv6t2", "arm1156t2-s")
502 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
503 .Cases("armv7r", "armv7-r", "cortex-r4")
504 .Cases("armv7m", "armv7-m", "cortex-m3")
505 .Case("ep9312", "ep9312")
506 .Case("iwmmxt", "iwmmxt")
507 .Case("xscale", "xscale")
508 .Cases("armv6m", "armv6-m", "cortex-m0")
509 // If all else failed, return the most base CPU LLVM supports.
510 .Default("arm7tdmi");
511}
512
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000513// FIXME: Move to target hook.
514static bool isSignedCharDefault(const llvm::Triple &Triple) {
515 switch (Triple.getArch()) {
516 default:
517 return true;
518
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000519 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000520 case llvm::Triple::ppc:
521 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000522 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000523 return true;
524 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000525 }
526}
527
Chad Rosier99317272012-04-04 20:51:35 +0000528// Handle -mfpu=.
529//
530// FIXME: Centralize feature selection, defaulting shouldn't be also in the
531// frontend target.
532static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
533 ArgStringList &CmdArgs) {
534 StringRef FPU = A->getValue(Args);
535
536 // Set the target features based on the FPU.
537 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
538 // Disable any default FPU support.
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp2");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-vfp3");
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-neon");
545 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+vfp3");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("+d16");
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("-neon");
552 } else if (FPU == "vfp") {
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("+vfp2");
555 CmdArgs.push_back("-target-feature");
556 CmdArgs.push_back("-neon");
557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+vfp3");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "neon") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+neon");
565 } else
566 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
567}
568
Chad Rosier7a938fa2012-04-04 20:39:32 +0000569// Handle -mfpmath=.
570static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000571 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier7a938fa2012-04-04 20:39:32 +0000572 StringRef FPMath = A->getValue(Args);
573
574 // Set the target features based on the FPMath.
575 if (FPMath == "neon") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000578
579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp")
580 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
581
Chad Rosier7a938fa2012-04-04 20:39:32 +0000582 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
583 FPMath == "vfp4") {
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000586
587 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000588 } else
589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Anton Korobeynikove2571792012-04-09 13:38:30 +0000592// Select the float ABI as determined by -msoft-float, -mhard-float, and
593// -mfloat-abi=.
594static StringRef getARMFloatABI(const Driver &D,
595 const ArgList &Args,
596 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000597 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000598 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
599 options::OPT_mhard_float,
600 options::OPT_mfloat_abi_EQ)) {
601 if (A->getOption().matches(options::OPT_msoft_float))
602 FloatABI = "soft";
603 else if (A->getOption().matches(options::OPT_mhard_float))
604 FloatABI = "hard";
605 else {
606 FloatABI = A->getValue(Args);
607 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000608 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000609 << A->getAsString(Args);
610 FloatABI = "soft";
611 }
612 }
613 }
614
615 // If unspecified, choose the default based on the platform.
616 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000617 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000618 case llvm::Triple::Darwin:
619 case llvm::Triple::MacOSX:
620 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000621 // Darwin defaults to "softfp" for v6 and v7.
622 //
623 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000624 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000625 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000626 if (StringRef(ArchName).startswith("v6") ||
627 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000628 FloatABI = "softfp";
629 else
630 FloatABI = "soft";
631 break;
632 }
633
634 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000635 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
642 case llvm::Triple::EABI:
643 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
644 FloatABI = "softfp";
645 break;
Chandler Carruthb43550b2012-01-10 19:47:42 +0000646 case llvm::Triple::ANDROIDEABI: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000647 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000648 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000649 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000650 FloatABI = "softfp";
651 else
652 FloatABI = "soft";
653 break;
654 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000655 default:
656 // Assume "soft", but warn the user we are guessing.
657 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000658 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000659 break;
660 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000661 }
662 }
663
Anton Korobeynikove2571792012-04-09 13:38:30 +0000664 return FloatABI;
665}
666
667
668void Clang::AddARMTargetArgs(const ArgList &Args,
669 ArgStringList &CmdArgs,
670 bool KernelOrKext) const {
671 const Driver &D = getToolChain().getDriver();
672 llvm::Triple Triple = getToolChain().getTriple();
673
674 // Select the ABI to use.
675 //
676 // FIXME: Support -meabi.
677 const char *ABIName = 0;
678 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
679 ABIName = A->getValue(Args);
680 } else {
681 // Select the default based on the platform.
682 switch(Triple.getEnvironment()) {
683 case llvm::Triple::ANDROIDEABI:
684 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000685 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000686 ABIName = "aapcs-linux";
687 break;
688 case llvm::Triple::EABI:
689 ABIName = "aapcs";
690 break;
691 default:
692 ABIName = "apcs-gnu";
693 }
694 }
695 CmdArgs.push_back("-target-abi");
696 CmdArgs.push_back(ABIName);
697
698 // Set the CPU based on -march= and -mcpu=.
699 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000700 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikove2571792012-04-09 13:38:30 +0000701
702 // Determine floating point ABI from the options & target defaults.
703 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000704 if (FloatABI == "soft") {
705 // Floating point operations and argument passing are soft.
706 //
707 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000708 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000709 CmdArgs.push_back("-mfloat-abi");
710 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000711 } else if (FloatABI == "softfp") {
712 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000713 CmdArgs.push_back("-mfloat-abi");
714 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000715 } else {
716 // Floating point operations and argument passing are hard.
717 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000718 CmdArgs.push_back("-mfloat-abi");
719 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000720 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000721
722 // Set appropriate target features for floating point mode.
723 //
724 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
725 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
726 // stripped out by the ARM target.
727
728 // Use software floating point operations?
729 if (FloatABI == "soft") {
730 CmdArgs.push_back("-target-feature");
731 CmdArgs.push_back("+soft-float");
732 }
733
734 // Use software floating point argument passing?
735 if (FloatABI != "hard") {
736 CmdArgs.push_back("-target-feature");
737 CmdArgs.push_back("+soft-float-abi");
738 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000739
740 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000742 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000743
Chad Rosier7a938fa2012-04-04 20:39:32 +0000744 // Honor -mfpmath=.
745 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000746 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000747
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000748 // Setting -msoft-float effectively disables NEON because of the GCC
749 // implementation, although the same isn't true of VFP or VFP3.
750 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000751 CmdArgs.push_back("-target-feature");
752 CmdArgs.push_back("-neon");
753 }
754
755 // Kernel code has more strict alignment requirements.
756 if (KernelOrKext) {
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000757 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000758 CmdArgs.push_back("-arm-long-calls");
759
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000760 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000761 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000762
763 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000764 CmdArgs.push_back("-backend-option");
765 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000766 }
Chad Rosier1b906052011-08-26 00:26:29 +0000767
768 // Setting -mno-global-merge disables the codegen global merge pass. Setting
769 // -mglobal-merge has no effect as the pass is enabled by default.
770 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
771 options::OPT_mno_global_merge)) {
772 if (A->getOption().matches(options::OPT_mno_global_merge))
773 CmdArgs.push_back("-mno-global-merge");
774 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000775
Chad Rosier005af272012-05-16 21:19:55 +0000776 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000777 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000778}
779
Akira Hatanaka9f360622011-09-26 21:07:52 +0000780// Get default architecture.
781static const char* getMipsArchFromCPU(StringRef CPUName) {
Akira Hatanaka592d26e2011-11-29 23:09:24 +0000782 if (CPUName == "mips32" || CPUName == "mips32r2")
Akira Hatanaka9f360622011-09-26 21:07:52 +0000783 return "mips";
784
Akira Hatanaka592d26e2011-11-29 23:09:24 +0000785 assert((CPUName == "mips64" || CPUName == "mips64r2") &&
Akira Hatanaka9f360622011-09-26 21:07:52 +0000786 "Unexpected cpu name.");
787
788 return "mips64";
789}
790
Akira Hatanakac85900f2011-11-30 19:31:38 +0000791// Check that ArchName is a known Mips architecture name.
792static bool checkMipsArchName(StringRef ArchName) {
793 return ArchName == "mips" ||
794 ArchName == "mipsel" ||
795 ArchName == "mips64" ||
796 ArchName == "mips64el";
797}
798
Akira Hatanaka9f360622011-09-26 21:07:52 +0000799// Get default target cpu.
Akira Hatanakac85900f2011-11-30 19:31:38 +0000800static const char* getMipsCPUFromArch(StringRef ArchName) {
Akira Hatanaka9f360622011-09-26 21:07:52 +0000801 if (ArchName == "mips" || ArchName == "mipsel")
Akira Hatanaka592d26e2011-11-29 23:09:24 +0000802 return "mips32";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000803
Akira Hatanakac85900f2011-11-30 19:31:38 +0000804 assert((ArchName == "mips64" || ArchName == "mips64el") &&
805 "Unexpected arch name.");
806
807 return "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000808}
809
810// Get default ABI.
811static const char* getMipsABIFromArch(StringRef ArchName) {
812 if (ArchName == "mips" || ArchName == "mipsel")
813 return "o32";
814
815 assert((ArchName == "mips64" || ArchName == "mips64el") &&
816 "Unexpected arch name.");
817 return "n64";
818}
819
Simon Atanasyana2768be2012-04-07 22:09:23 +0000820// Get CPU and ABI names. They are not independent
821// so we have to calculate them together.
822static void getMipsCPUAndABI(const ArgList &Args,
823 const ToolChain &TC,
824 StringRef &CPUName,
825 StringRef &ABIName) {
Akira Hatanaka9f360622011-09-26 21:07:52 +0000826 StringRef ArchName;
Akira Hatanaka9f360622011-09-26 21:07:52 +0000827
Simon Atanasyana2768be2012-04-07 22:09:23 +0000828 // Select target cpu and architecture.
Akira Hatanaka9f360622011-09-26 21:07:52 +0000829 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
830 CPUName = A->getValue(Args);
831 ArchName = getMipsArchFromCPU(CPUName);
832 }
833 else {
Simon Atanasyana2768be2012-04-07 22:09:23 +0000834 ArchName = Args.MakeArgString(TC.getArchName());
Akira Hatanakac85900f2011-11-30 19:31:38 +0000835 if (!checkMipsArchName(ArchName))
Simon Atanasyana2768be2012-04-07 22:09:23 +0000836 TC.getDriver().Diag(diag::err_drv_invalid_arch_name) << ArchName;
Akira Hatanakac85900f2011-11-30 19:31:38 +0000837 else
838 CPUName = getMipsCPUFromArch(ArchName);
Akira Hatanaka9f360622011-09-26 21:07:52 +0000839 }
Akira Hatanaka9f360622011-09-26 21:07:52 +0000840
Eric Christophered734732010-03-02 02:41:08 +0000841 // Select the ABI to use.
Akira Hatanaka9f360622011-09-26 21:07:52 +0000842 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christophered734732010-03-02 02:41:08 +0000843 ABIName = A->getValue(Args);
Akira Hatanaka9f360622011-09-26 21:07:52 +0000844 else
845 ABIName = getMipsABIFromArch(ArchName);
Simon Atanasyana2768be2012-04-07 22:09:23 +0000846}
847
Simon Atanasyan5e627792012-06-02 15:06:29 +0000848// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
849// and -mfloat-abi=.
850static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000851 // Select the float ABI as determined by -msoft-float, -mhard-float,
852 // and -mfloat-abi=.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000853 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000854 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000855 options::OPT_mhard_float,
856 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000857 if (A->getOption().matches(options::OPT_msoft_float))
858 FloatABI = "soft";
859 else if (A->getOption().matches(options::OPT_mhard_float))
860 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000861 else {
862 FloatABI = A->getValue(Args);
863 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000864 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000865 FloatABI = "hard";
866 }
867 }
Eric Christophered734732010-03-02 02:41:08 +0000868 }
869
870 // If unspecified, choose the default based on the platform.
871 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000872 // Assume "hard", because it's a default value used by gcc.
873 // When we start to recognize specific target MIPS processors,
874 // we will be able to select the default more correctly.
875 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000876 }
877
Simon Atanasyan5e627792012-06-02 15:06:29 +0000878 return FloatABI;
879}
880
Simon Atanasyandc536f52012-07-05 18:51:43 +0000881static void AddTargetFeature(const ArgList &Args,
882 ArgStringList &CmdArgs,
883 OptSpecifier OnOpt,
884 OptSpecifier OffOpt,
885 StringRef FeatureName) {
886 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
887 CmdArgs.push_back("-target-feature");
888 if (A->getOption().matches(OnOpt))
889 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
890 else
891 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
892 }
893}
894
Simon Atanasyan5e627792012-06-02 15:06:29 +0000895void Clang::AddMIPSTargetArgs(const ArgList &Args,
896 ArgStringList &CmdArgs) const {
897 const Driver &D = getToolChain().getDriver();
898 StringRef CPUName;
899 StringRef ABIName;
900 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
901
902 CmdArgs.push_back("-target-cpu");
903 CmdArgs.push_back(CPUName.data());
904
905 CmdArgs.push_back("-target-abi");
906 CmdArgs.push_back(ABIName.data());
907
908 StringRef FloatABI = getMipsFloatABI(D, Args);
909
Eric Christophered734732010-03-02 02:41:08 +0000910 if (FloatABI == "soft") {
911 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000912 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("soft");
915
916 // FIXME: Note, this is a hack. We need to pass the selected float
917 // mode to the MipsTargetInfoBase to define appropriate macros there.
918 // Now it is the only method.
919 CmdArgs.push_back("-target-feature");
920 CmdArgs.push_back("+soft-float");
921 }
922 else if (FloatABI == "single") {
923 // Restrict the use of hardware floating-point
924 // instructions to 32-bit operations.
925 CmdArgs.push_back("-target-feature");
926 CmdArgs.push_back("+single-float");
927 }
928 else {
929 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +0000930 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000931 CmdArgs.push_back("-mfloat-abi");
932 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +0000933 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +0000934
Simon Atanasyandc536f52012-07-05 18:51:43 +0000935 AddTargetFeature(Args, CmdArgs,
936 options::OPT_mips16, options::OPT_mno_mips16,
937 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +0000938 AddTargetFeature(Args, CmdArgs,
939 options::OPT_mdsp, options::OPT_mno_dsp,
940 "dsp");
941 AddTargetFeature(Args, CmdArgs,
942 options::OPT_mdspr2, options::OPT_mno_dspr2,
943 "dspr2");
Eric Christophered734732010-03-02 02:41:08 +0000944}
945
Hal Finkel02a84272012-06-11 22:35:19 +0000946/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
947static std::string getPPCTargetCPU(const ArgList &Args) {
948 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
949 StringRef CPUName = A->getValue(Args);
950
951 if (CPUName == "native") {
952 std::string CPU = llvm::sys::getHostCPUName();
953 if (!CPU.empty() && CPU != "generic")
954 return CPU;
955 else
956 return "";
957 }
958
959 return llvm::StringSwitch<const char *>(CPUName)
960 .Case("common", "generic")
961 .Case("440", "440")
962 .Case("440fp", "440")
963 .Case("450", "450")
964 .Case("601", "601")
965 .Case("602", "602")
966 .Case("603", "603")
967 .Case("603e", "603e")
968 .Case("603ev", "603ev")
969 .Case("604", "604")
970 .Case("604e", "604e")
971 .Case("620", "620")
972 .Case("G3", "g3")
973 .Case("7400", "7400")
974 .Case("G4", "g4")
975 .Case("7450", "7450")
976 .Case("G4+", "g4+")
977 .Case("750", "750")
978 .Case("970", "970")
979 .Case("G5", "g5")
980 .Case("a2", "a2")
981 .Case("power6", "pwr6")
982 .Case("power7", "pwr7")
983 .Case("powerpc", "ppc")
984 .Case("powerpc64", "ppc64")
985 .Default("");
986 }
987
988 return "";
989}
990
991void Clang::AddPPCTargetArgs(const ArgList &Args,
992 ArgStringList &CmdArgs) const {
993 std::string TargetCPUName = getPPCTargetCPU(Args);
994
995 // LLVM may default to generating code for the native CPU,
996 // but, like gcc, we default to a more generic option for
997 // each architecture. (except on Darwin)
998 llvm::Triple Triple = getToolChain().getTriple();
999 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1000 if (Triple.getArch() == llvm::Triple::ppc64)
1001 TargetCPUName = "ppc64";
1002 else
1003 TargetCPUName = "ppc";
1004 }
1005
1006 if (!TargetCPUName.empty()) {
1007 CmdArgs.push_back("-target-cpu");
1008 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1009 }
1010}
1011
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001012void Clang::AddSparcTargetArgs(const ArgList &Args,
1013 ArgStringList &CmdArgs) const {
1014 const Driver &D = getToolChain().getDriver();
1015
1016 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001017 CmdArgs.push_back("-target-cpu");
Benjamin Kramera11d3092011-12-26 14:18:37 +00001018 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001019 }
1020
1021 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001022 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001023 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1024 options::OPT_mhard_float)) {
1025 if (A->getOption().matches(options::OPT_msoft_float))
1026 FloatABI = "soft";
1027 else if (A->getOption().matches(options::OPT_mhard_float))
1028 FloatABI = "hard";
1029 }
1030
1031 // If unspecified, choose the default based on the platform.
1032 if (FloatABI.empty()) {
1033 switch (getToolChain().getTriple().getOS()) {
1034 default:
1035 // Assume "soft", but warn the user we are guessing.
1036 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +00001037 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001038 break;
1039 }
1040 }
1041
1042 if (FloatABI == "soft") {
1043 // Floating point operations and argument passing are soft.
1044 //
1045 // FIXME: This changes CPP defines, we need -target-soft-float.
1046 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001047 CmdArgs.push_back("-target-feature");
1048 CmdArgs.push_back("+soft-float");
1049 } else {
1050 assert(FloatABI == "hard" && "Invalid float abi!");
1051 CmdArgs.push_back("-mhard-float");
1052 }
1053}
1054
Daniel Dunbar6acda162009-09-09 22:33:08 +00001055void Clang::AddX86TargetArgs(const ArgList &Args,
1056 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001057 if (!Args.hasFlag(options::OPT_mred_zone,
1058 options::OPT_mno_red_zone,
1059 true) ||
1060 Args.hasArg(options::OPT_mkernel) ||
1061 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001062 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001063
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001064 if (Args.hasFlag(options::OPT_msoft_float,
1065 options::OPT_mno_soft_float,
1066 false))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001067 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001068
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001069 const char *CPUName = 0;
Daniel Dunbar6acda162009-09-09 22:33:08 +00001070 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001071 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001072 // FIXME: Reject attempts to use -march=native unless the target matches
1073 // the host.
1074 //
1075 // FIXME: We should also incorporate the detected target features for use
1076 // with -native.
1077 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone0cc3092012-05-09 17:53:10 +00001078 if (!CPU.empty() && CPU != "generic")
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001079 CPUName = Args.MakeArgString(CPU);
1080 } else
1081 CPUName = A->getValue(Args);
1082 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001083
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001084 // Select the default CPU if none was given (or detection failed).
1085 if (!CPUName) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00001086 // FIXME: Need target hooks.
Bob Wilson905c45f2011-10-14 05:03:44 +00001087 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001088 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001089 CPUName = "core2";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001090 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001091 CPUName = "yonah";
Chris Lattner86ed3a32010-04-11 19:29:39 +00001092 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001093 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001094 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001095 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001096 CPUName = "i586";
Daniel Dunbar95c04572010-08-01 23:13:54 +00001097 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001098 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001099 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001100 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001101 CPUName = "i486";
Eli Friedman42f74f22012-08-08 23:57:20 +00001102 } else if (getToolChain().getOS().startswith("bitrig")) {
1103 if (getToolChain().getArch() == llvm::Triple::x86_64)
1104 CPUName = "x86-64";
1105 else if (getToolChain().getArch() == llvm::Triple::x86)
1106 CPUName = "i686";
Roman Divacky451f8ca2011-03-01 18:11:37 +00001107 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001108 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001109 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001110 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001111 CPUName = "i486";
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001112 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001113 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001114 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001115 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001116 CPUName = "i486";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001117 } else {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001118 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001119 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001120 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001121 CPUName = "pentium4";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001122 }
1123 }
1124
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001125 if (CPUName) {
Daniel Dunbar38b48af2009-12-18 06:30:12 +00001126 CmdArgs.push_back("-target-cpu");
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001127 CmdArgs.push_back(CPUName);
1128 }
1129
Eli Friedmand18eeca2011-07-02 00:34:19 +00001130 // The required algorithm here is slightly strange: the options are applied
1131 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1132 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1133 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1134 // former correctly, but not the latter; handle directly-overridden
1135 // attributes here.
1136 llvm::StringMap<unsigned> PrevFeature;
1137 std::vector<const char*> Features;
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001138 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1139 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001140 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001141 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001142
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001143 // Skip over "-m".
1144 assert(Name.startswith("-m") && "Invalid feature name.");
1145 Name = Name.substr(2);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001146
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001147 bool IsNegative = Name.startswith("no-");
1148 if (IsNegative)
1149 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001150
Eli Friedmand18eeca2011-07-02 00:34:19 +00001151 unsigned& Prev = PrevFeature[Name];
1152 if (Prev)
1153 Features[Prev - 1] = 0;
1154 Prev = Features.size() + 1;
1155 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1156 }
1157 for (unsigned i = 0; i < Features.size(); i++) {
1158 if (Features[i]) {
1159 CmdArgs.push_back("-target-feature");
1160 CmdArgs.push_back(Features[i]);
1161 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001162 }
1163}
1164
Tony Linthicum96319392011-12-12 21:14:55 +00001165static Arg* getLastHexagonArchArg (const ArgList &Args)
1166{
1167 Arg * A = NULL;
1168
Sebastian Pop43115d42012-01-13 20:37:10 +00001169 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1170 it != ie; ++it) {
1171 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum96319392011-12-12 21:14:55 +00001172 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1173 A = *it;
1174 A->claim();
1175 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001176 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1177 StringRef Value = (*it)->getValue(Args,0);
1178 if (Value.startswith("v")) {
1179 A = *it;
1180 A->claim();
1181 }
1182 }
Tony Linthicum96319392011-12-12 21:14:55 +00001183 }
1184 return A;
1185}
1186
Sebastian Pop43115d42012-01-13 20:37:10 +00001187static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum96319392011-12-12 21:14:55 +00001188{
1189 Arg *A;
1190 llvm::StringRef WhichHexagon;
1191
Sebastian Pop43115d42012-01-13 20:37:10 +00001192 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum96319392011-12-12 21:14:55 +00001193 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop43115d42012-01-13 20:37:10 +00001194 WhichHexagon = A->getValue(Args);
1195 if (WhichHexagon == "")
1196 return "v4";
1197 else
1198 return WhichHexagon;
Tony Linthicum96319392011-12-12 21:14:55 +00001199 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001200 else
1201 return "v4";
Tony Linthicum96319392011-12-12 21:14:55 +00001202}
1203
1204void Clang::AddHexagonTargetArgs(const ArgList &Args,
1205 ArgStringList &CmdArgs) const {
1206 llvm::Triple Triple = getToolChain().getTriple();
1207
1208 CmdArgs.push_back("-target-cpu");
Sebastian Pop43115d42012-01-13 20:37:10 +00001209 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00001210 CmdArgs.push_back("-fno-signed-char");
1211 CmdArgs.push_back("-nobuiltininc");
1212
Sirish Pande5f9688b2012-05-10 20:19:54 +00001213 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum96319392011-12-12 21:14:55 +00001214 CmdArgs.push_back("-mqdsp6-compat");
1215
1216 if (Arg *A = Args.getLastArg(options::OPT_G,
1217 options::OPT_msmall_data_threshold_EQ)) {
1218 std::string SmallDataThreshold="-small-data-threshold=";
1219 SmallDataThreshold += A->getValue(Args);
1220 CmdArgs.push_back ("-mllvm");
1221 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1222 A->claim();
1223 }
1224
Sirish Pande5f9688b2012-05-10 20:19:54 +00001225 if (!Args.hasArg(options::OPT_fno_short_enums))
1226 CmdArgs.push_back("-fshort-enums");
1227 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1228 CmdArgs.push_back ("-mllvm");
1229 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1230 }
Tony Linthicum96319392011-12-12 21:14:55 +00001231 CmdArgs.push_back ("-mllvm");
1232 CmdArgs.push_back ("-machine-sink-split=0");
1233}
1234
Eric Christopher88b7cf02011-08-19 00:30:14 +00001235static bool
John McCall260611a2012-06-20 06:18:46 +00001236shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001237 const llvm::Triple &Triple) {
1238 // We use the zero-cost exception tables for Objective-C if the non-fragile
1239 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1240 // later.
John McCall260611a2012-06-20 06:18:46 +00001241 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001242 return true;
1243
Bob Wilson905c45f2011-10-14 05:03:44 +00001244 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001245 return false;
1246
Eric Christopheraa7333c2011-07-02 00:20:22 +00001247 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001248 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001249 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001250}
1251
Anders Carlsson15348ae2011-02-28 02:27:16 +00001252/// addExceptionArgs - Adds exception related arguments to the driver command
1253/// arguments. There's a master flag, -fexceptions and also language specific
1254/// flags to enable/disable C++ and Objective-C exceptions.
1255/// This makes it possible to for example disable C++ exceptions but enable
1256/// Objective-C exceptions.
1257static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1258 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001259 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001260 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001261 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001262 if (KernelOrKext) {
1263 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1264 // arguments now to avoid warnings about unused arguments.
1265 Args.ClaimAllArgs(options::OPT_fexceptions);
1266 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1267 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1268 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1269 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1270 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001271 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001272 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001273
1274 // Exceptions are enabled by default.
1275 bool ExceptionsEnabled = true;
1276
1277 // This keeps track of whether exceptions were explicitly turned on or off.
1278 bool DidHaveExplicitExceptionFlag = false;
1279
Rafael Espindolaf759df02009-10-01 13:33:33 +00001280 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1281 options::OPT_fno_exceptions)) {
1282 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001283 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001284 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001285 ExceptionsEnabled = false;
1286
1287 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001288 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001289
Anders Carlsson15348ae2011-02-28 02:27:16 +00001290 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001291
Anders Carlsson15348ae2011-02-28 02:27:16 +00001292 // Exception tables and cleanups can be enabled with -fexceptions even if the
1293 // language itself doesn't support exceptions.
1294 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1295 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001296
Daniel Dunbard47ea692011-03-17 23:28:31 +00001297 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1298 // is not necessarily sensible, but follows GCC.
1299 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001300 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001301 options::OPT_fno_objc_exceptions,
1302 true)) {
1303 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001304
Eric Christopher88b7cf02011-08-19 00:30:14 +00001305 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001306 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001307 }
1308
1309 if (types::isCXX(InputType)) {
1310 bool CXXExceptionsEnabled = ExceptionsEnabled;
1311
Eric Christopher88b7cf02011-08-19 00:30:14 +00001312 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1313 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001314 options::OPT_fexceptions,
1315 options::OPT_fno_exceptions)) {
1316 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1317 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001318 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001319 CXXExceptionsEnabled = false;
1320 }
1321
1322 if (CXXExceptionsEnabled) {
1323 CmdArgs.push_back("-fcxx-exceptions");
1324
1325 ShouldUseExceptionTables = true;
1326 }
1327 }
1328
1329 if (ShouldUseExceptionTables)
1330 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001331}
1332
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001333static bool ShouldDisableCFI(const ArgList &Args,
1334 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001335 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001336 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001337 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001338 // we disable them if we think the .s file will be passed to it.
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001339 Default = Args.hasFlag(options::OPT_integrated_as,
1340 options::OPT_no_integrated_as,
1341 TC.IsIntegratedAssemblerDefault());
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001342 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001343 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1344 options::OPT_fno_dwarf2_cfi_asm,
1345 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001346}
1347
Nick Lewyckyea523d72011-10-17 23:05:52 +00001348static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1349 const ToolChain &TC) {
1350 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1351 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1352 options::OPT_no_integrated_as,
1353 IsIADefault);
1354 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1355 options::OPT_fno_dwarf_directory_asm,
1356 UseIntegratedAs);
1357 return !UseDwarfDirectory;
1358}
1359
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001360/// \brief Check whether the given input tree contains any compilation actions.
1361static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001362 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001363 return true;
1364
1365 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1366 if (ContainsCompileAction(*it))
1367 return true;
1368
1369 return false;
1370}
1371
1372/// \brief Check if -relax-all should be passed to the internal assembler.
1373/// This is done by default when compiling non-assembler source with -O0.
1374static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1375 bool RelaxDefault = true;
1376
1377 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1378 RelaxDefault = A->getOption().matches(options::OPT_O0);
1379
1380 if (RelaxDefault) {
1381 RelaxDefault = false;
1382 for (ActionList::const_iterator it = C.getActions().begin(),
1383 ie = C.getActions().end(); it != ie; ++it) {
1384 if (ContainsCompileAction(*it)) {
1385 RelaxDefault = true;
1386 break;
1387 }
1388 }
1389 }
1390
1391 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1392 RelaxDefault);
1393}
1394
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001395/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1396/// This needs to be called before we add the C run-time (malloc, etc).
1397static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001398 ArgStringList &CmdArgs) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001399 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001400 options::OPT_fno_address_sanitizer, false))
1401 return;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001402 if(TC.getTriple().getEnvironment() == llvm::Triple::ANDROIDEABI) {
1403 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanov83738622012-06-04 11:15:05 +00001404 if (!Args.hasArg(options::OPT_pie))
1405 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001406 // For an executable, we add a .preinit_array stub.
1407 CmdArgs.push_back("-u");
1408 CmdArgs.push_back("__asan_preinit");
1409 CmdArgs.push_back("-lasan");
1410 }
Daniel Dunbar8cd0d252011-12-07 23:22:17 +00001411
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001412 CmdArgs.push_back("-lasan_preload");
1413 CmdArgs.push_back("-ldl");
1414 } else {
1415 if (!Args.hasArg(options::OPT_shared)) {
1416 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1417 // resource directory.
1418 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1419 llvm::sys::path::append(LibAsan, "lib", "linux",
1420 (Twine("libclang_rt.asan-") +
1421 TC.getArchName() + ".a"));
1422 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1423 CmdArgs.push_back("-lpthread");
1424 CmdArgs.push_back("-ldl");
1425 CmdArgs.push_back("-export-dynamic");
1426 }
1427 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001428}
1429
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001430/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1431/// This needs to be called before we add the C run-time (malloc, etc).
1432static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1433 ArgStringList &CmdArgs) {
1434 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1435 options::OPT_fno_thread_sanitizer, false))
1436 return;
1437 if (!Args.hasArg(options::OPT_shared)) {
1438 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1439 // resource directory.
1440 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1441 llvm::sys::path::append(LibTsan, "lib", "linux",
1442 (Twine("libclang_rt.tsan-") +
1443 TC.getArchName() + ".a"));
1444 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1445 CmdArgs.push_back("-lpthread");
1446 CmdArgs.push_back("-ldl");
1447 CmdArgs.push_back("-export-dynamic");
1448 }
1449}
1450
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001451static bool shouldUseFramePointer(const ArgList &Args,
1452 const llvm::Triple &Triple) {
1453 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1454 options::OPT_fomit_frame_pointer))
1455 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1456
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001457 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001458 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1459 Triple.getArch() == llvm::Triple::x86) &&
1460 Triple.getOS() == llvm::Triple::Linux) {
1461 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1462 if (!A->getOption().matches(options::OPT_O0))
1463 return false;
1464 }
1465
1466 return true;
1467}
1468
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001469void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001470 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001471 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001472 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001473 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001474 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1475 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001476 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001477 ArgStringList CmdArgs;
1478
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001479 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1480
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001481 // Invoke ourselves in -cc1 mode.
1482 //
1483 // FIXME: Implement custom jobs for internal actions.
1484 CmdArgs.push_back("-cc1");
1485
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001486 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001487 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001488 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001489 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001490
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001491 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001492 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001493
Daniel Dunbar1d460332009-03-18 10:01:51 +00001494 if (isa<AnalyzeJobAction>(JA)) {
1495 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1496 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001497 } else if (isa<MigrateJobAction>(JA)) {
1498 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001499 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001500 if (Output.getType() == types::TY_Dependencies)
1501 CmdArgs.push_back("-Eonly");
1502 else
1503 CmdArgs.push_back("-E");
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001504 } else if (isa<AssembleJobAction>(JA)) {
1505 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001506
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001507 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001508 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001509
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001510 // When using an integrated assembler, translate -Wa, and -Xassembler
1511 // options.
1512 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1513 options::OPT_Xassembler),
1514 ie = Args.filtered_end(); it != ie; ++it) {
1515 const Arg *A = *it;
1516 A->claim();
1517
1518 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001519 StringRef Value = A->getValue(Args, i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001520
1521 if (Value == "-force_cpusubtype_ALL") {
1522 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001523 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001524 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001525 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001526 CmdArgs.push_back("-mllvm");
1527 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001528 } else if (Value == "--noexecstack") {
1529 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001530 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001531 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001532 << A->getOption().getName() << Value;
1533 }
1534 }
1535 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001536
1537 // Also ignore explicit -force_cpusubtype_ALL option.
1538 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001539 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001540 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001541 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001542
Aaron Ballman761322b2012-07-31 01:21:00 +00001543 if (JA.getType() == types::TY_Nothing)
1544 CmdArgs.push_back("-fsyntax-only");
1545 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001546 CmdArgs.push_back("-emit-pch");
1547 else
1548 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001549 } else {
1550 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001551
Daniel Dunbar1d460332009-03-18 10:01:51 +00001552 if (JA.getType() == types::TY_Nothing) {
1553 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001554 } else if (JA.getType() == types::TY_LLVM_IR ||
1555 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001556 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001557 } else if (JA.getType() == types::TY_LLVM_BC ||
1558 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001559 CmdArgs.push_back("-emit-llvm-bc");
1560 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001561 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001562 } else if (JA.getType() == types::TY_AST) {
1563 CmdArgs.push_back("-emit-pch");
Daniel Dunbar64952502010-02-11 03:16:21 +00001564 } else if (JA.getType() == types::TY_RewrittenObjC) {
1565 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001566 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001567 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1568 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001569 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001570 } else {
1571 assert(JA.getType() == types::TY_PP_Asm &&
1572 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001573 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001574 }
1575
Daniel Dunbar1d460332009-03-18 10:01:51 +00001576 // The make clang go fast button.
1577 CmdArgs.push_back("-disable-free");
1578
John McCallb689afb2010-02-13 03:50:24 +00001579 // Disable the verification pass in -asserts builds.
1580#ifdef NDEBUG
1581 CmdArgs.push_back("-disable-llvm-verifier");
1582#endif
1583
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001584 // Set the main file name, so that debug info works even with
1585 // -save-temps.
1586 CmdArgs.push_back("-main-file-name");
1587 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1588
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001589 // Some flags which affect the language (via preprocessor
1590 // defines). See darwin::CC1::AddCPPArgs.
1591 if (Args.hasArg(options::OPT_static))
1592 CmdArgs.push_back("-static-define");
1593
Daniel Dunbar1d460332009-03-18 10:01:51 +00001594 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001595 // Enable region store model by default.
1596 CmdArgs.push_back("-analyzer-store=region");
1597
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001598 // Treat blocks as analysis entry points.
1599 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1600
Ted Kremenek51885072011-03-24 00:28:47 +00001601 CmdArgs.push_back("-analyzer-eagerly-assume");
1602
Anna Zaks66253352012-03-08 23:16:35 +00001603 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaks278f1f82012-03-01 22:37:46 +00001604
Daniel Dunbar1d460332009-03-18 10:01:51 +00001605 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001606 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001607 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001608
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001609 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1610 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001611
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001612 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001613 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001614
1615 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001616
1617 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00001618 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1619 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1620 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1621 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1622 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1623 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001624 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001625
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001626 // Set the output format. The default is plist, for (lame) historical
1627 // reasons.
1628 CmdArgs.push_back("-analyzer-output");
1629 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1630 CmdArgs.push_back(A->getValue(Args));
1631 else
1632 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001633
Ted Kremenek0647a7b2010-03-22 22:32:05 +00001634 // Disable the presentation of standard compiler warnings when
1635 // using --analyze. We only want to show static analyzer diagnostics
1636 // or frontend errors.
1637 CmdArgs.push_back("-w");
1638
Daniel Dunbar1d460332009-03-18 10:01:51 +00001639 // Add -Xanalyzer arguments when running as analyzer.
1640 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00001641 }
1642
Daniel Dunbare2fd6642009-09-10 01:21:12 +00001643 CheckCodeGenerationOptions(D, Args);
1644
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001645 // Perform argument translation for LLVM backend. This
1646 // takes some care in reconciling with llvm-gcc. The
1647 // issue is that llvm-gcc translates these options based on
1648 // the values in cc1, whereas we are processing based on
1649 // the driver arguments.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001650
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001651 // This comes from the default translation the driver + cc1
1652 // would do to enable flag_pic.
Simon Atanasyan003ab662012-05-29 18:50:33 +00001653
1654 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1655 options::OPT_fpic, options::OPT_fno_pic,
1656 options::OPT_fPIE, options::OPT_fno_PIE,
1657 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001658 bool PICDisabled = false;
1659 bool PICEnabled = false;
1660 bool PICForPIE = false;
1661 if (LastPICArg) {
1662 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1663 LastPICArg->getOption().matches(options::OPT_fpie));
1664 PICEnabled = (PICForPIE ||
1665 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1666 LastPICArg->getOption().matches(options::OPT_fpic));
1667 PICDisabled = !PICEnabled;
1668 }
1669 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1670 // PIC or PIE options above, if these show up, PIC is disabled.
1671 if (Args.hasArg(options::OPT_mkernel))
1672 PICDisabled = true;
1673 if (Args.hasArg(options::OPT_static))
1674 PICDisabled = true;
1675 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1676
1677 // Select the relocation model.
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001678 const char *Model = getToolChain().GetForcedPicModel();
1679 if (!Model) {
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001680 if (DynamicNoPIC)
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001681 Model = "dynamic-no-pic";
1682 else if (PICDisabled)
1683 Model = "static";
1684 else if (PICEnabled)
1685 Model = "pic";
Daniel Dunbar1d460332009-03-18 10:01:51 +00001686 else
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001687 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbar1d460332009-03-18 10:01:51 +00001688 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001689 StringRef ModelStr = Model ? Model : "";
1690 if (Model && ModelStr != "pic") {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001691 CmdArgs.push_back("-mrelocation-model");
1692 CmdArgs.push_back(Model);
1693 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001694
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001695 // Infer the __PIC__ and __PIE__ values.
1696 if (ModelStr == "pic" && PICForPIE) {
1697 CmdArgs.push_back("-pie-level");
1698 CmdArgs.push_back((LastPICArg &&
1699 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1700 "2" : "1");
1701 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar76743522009-11-29 02:39:08 +00001702 CmdArgs.push_back("-pic-level");
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001703 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1704 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1705 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001706 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001707
Tanya Lattner59876c22009-11-04 01:18:09 +00001708 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1709 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00001710 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001711
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001712 // LLVM Code Generator Options.
1713
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001714 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1715 CmdArgs.push_back("-mregparm");
1716 CmdArgs.push_back(A->getValue(Args));
1717 }
1718
Roman Divackycfe9af22011-03-01 17:40:53 +00001719 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1720 CmdArgs.push_back("-mrtd");
1721
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001722 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001723 CmdArgs.push_back("-mdisable-fp-elim");
1724 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1725 options::OPT_fno_zero_initialized_in_bss))
1726 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar398c6102011-02-04 02:20:39 +00001727 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1728 options::OPT_fno_strict_aliasing,
1729 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00001730 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00001731 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1732 false))
1733 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00001734 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1735 options::OPT_fno_optimize_sibling_calls))
1736 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001737
Chandler Carruthabf07a72012-01-02 14:19:45 +00001738 // Handle various floating point optimization flags, mapping them to the
1739 // appropriate LLVM code generation flags. The pattern for all of these is to
1740 // default off the codegen optimizations, and if any flag enables them and no
1741 // flag disables them after the flag enabling them, enable the codegen
1742 // optimization. This is complicated by several "umbrella" flags.
1743 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1744 options::OPT_ffinite_math_only,
1745 options::OPT_fno_finite_math_only,
1746 options::OPT_fhonor_infinities,
1747 options::OPT_fno_honor_infinities))
1748 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1749 A->getOption().getID() != options::OPT_fhonor_infinities)
1750 CmdArgs.push_back("-menable-no-infs");
1751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1752 options::OPT_ffinite_math_only,
1753 options::OPT_fno_finite_math_only,
1754 options::OPT_fhonor_nans,
1755 options::OPT_fno_honor_nans))
1756 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1757 A->getOption().getID() != options::OPT_fhonor_nans)
1758 CmdArgs.push_back("-menable-no-nans");
1759
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00001760 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1761 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruthabf07a72012-01-02 14:19:45 +00001762 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1763 options::OPT_fmath_errno,
Chandler Carruth4f50c502012-04-26 02:10:51 +00001764 options::OPT_fno_math_errno))
1765 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1766 if (MathErrno)
1767 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001768
1769 // There are several flags which require disabling very specific
1770 // optimizations. Any of these being disabled forces us to turn off the
1771 // entire set of LLVM optimizations, so collect them through all the flag
1772 // madness.
1773 bool AssociativeMath = false;
1774 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1775 options::OPT_funsafe_math_optimizations,
1776 options::OPT_fno_unsafe_math_optimizations,
1777 options::OPT_fassociative_math,
1778 options::OPT_fno_associative_math))
1779 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1780 A->getOption().getID() != options::OPT_fno_associative_math)
1781 AssociativeMath = true;
1782 bool ReciprocalMath = false;
1783 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1784 options::OPT_funsafe_math_optimizations,
1785 options::OPT_fno_unsafe_math_optimizations,
1786 options::OPT_freciprocal_math,
1787 options::OPT_fno_reciprocal_math))
1788 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1789 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1790 ReciprocalMath = true;
1791 bool SignedZeros = true;
1792 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1793 options::OPT_funsafe_math_optimizations,
1794 options::OPT_fno_unsafe_math_optimizations,
1795 options::OPT_fsigned_zeros,
1796 options::OPT_fno_signed_zeros))
1797 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1798 A->getOption().getID() != options::OPT_fsigned_zeros)
1799 SignedZeros = false;
1800 bool TrappingMath = true;
1801 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1802 options::OPT_funsafe_math_optimizations,
1803 options::OPT_fno_unsafe_math_optimizations,
1804 options::OPT_ftrapping_math,
1805 options::OPT_fno_trapping_math))
1806 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1807 A->getOption().getID() != options::OPT_ftrapping_math)
1808 TrappingMath = false;
1809 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1810 !TrappingMath)
1811 CmdArgs.push_back("-menable-unsafe-fp-math");
1812
Lang Hamesc9686712012-07-06 00:59:19 +00001813
1814 // Validate and pass through -fp-contract option.
1815 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1816 options::OPT_ffp_contract)) {
1817 if (A->getOption().getID() == options::OPT_ffp_contract) {
1818 StringRef Val = A->getValue(Args);
1819 if (Val == "fast" || Val == "on" || Val == "off") {
1820 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1821 } else {
1822 D.Diag(diag::err_drv_unsupported_option_argument)
1823 << A->getOption().getName() << Val;
1824 }
1825 } else { // A is OPT_ffast_math
1826 // If fast-math is set then set the fp-contract mode to fast.
1827 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1828 }
1829 }
1830
Bob Wilson455e72e2012-07-19 03:52:53 +00001831 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1832 // and if we find them, tell the frontend to provide the appropriate
1833 // preprocessor macros. This is distinct from enabling any optimizations as
1834 // these options induce language changes which must survive serialization
1835 // and deserialization, etc.
Chandler Carruthabf07a72012-01-02 14:19:45 +00001836 if (Args.hasArg(options::OPT_ffast_math))
1837 CmdArgs.push_back("-ffast-math");
Bob Wilson455e72e2012-07-19 03:52:53 +00001838 if (Args.hasArg(options::OPT_ffinite_math_only))
1839 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001840
Daniel Dunbar1b718482010-05-14 22:00:22 +00001841 // Decide whether to use verbose asm. Verbose assembly is the default on
1842 // toolchains which have the integrated assembler on by default.
1843 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1844 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00001845 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00001846 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001847 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001848
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001849 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1850 CmdArgs.push_back("-mdebug-pass");
1851 CmdArgs.push_back("Structure");
1852 }
1853 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1854 CmdArgs.push_back("-mdebug-pass");
1855 CmdArgs.push_back("Arguments");
1856 }
1857
John McCalld0c2ec42010-02-19 02:45:38 +00001858 // Enable -mconstructor-aliases except on darwin, where we have to
1859 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00001860 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00001861 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00001862
John McCall32096692011-03-18 02:56:14 +00001863 // Darwin's kernel doesn't support guard variables; just die if we
1864 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00001865 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00001866 CmdArgs.push_back("-fforbid-guard-variables");
1867
Douglas Gregor6f755502011-02-01 15:15:22 +00001868 if (Args.hasArg(options::OPT_mms_bitfields)) {
1869 CmdArgs.push_back("-mms-bitfields");
1870 }
John McCalld0c2ec42010-02-19 02:45:38 +00001871
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001872 // This is a coarse approximation of what llvm-gcc actually does, both
1873 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1874 // complicated ways.
1875 bool AsynchronousUnwindTables =
1876 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1877 options::OPT_fno_asynchronous_unwind_tables,
1878 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001879 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001880 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1881 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001882 CmdArgs.push_back("-munwind-tables");
1883
Rafael Espindola8af669f2012-06-19 01:26:10 +00001884 getToolChain().addClangTargetOptions(CmdArgs);
1885
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001886 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1887 CmdArgs.push_back("-mlimit-float-precision");
1888 CmdArgs.push_back(A->getValue(Args));
1889 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001890
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001891 // FIXME: Handle -mtune=.
1892 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001893
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001894 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001895 CmdArgs.push_back("-mcode-model");
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001896 CmdArgs.push_back(A->getValue(Args));
1897 }
1898
Daniel Dunbar6acda162009-09-09 22:33:08 +00001899 // Add target specific cpu and features flags.
1900 switch(getToolChain().getTriple().getArch()) {
1901 default:
1902 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001903
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001904 case llvm::Triple::arm:
1905 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00001906 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001907 break;
1908
Eric Christophered734732010-03-02 02:41:08 +00001909 case llvm::Triple::mips:
1910 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00001911 case llvm::Triple::mips64:
1912 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00001913 AddMIPSTargetArgs(Args, CmdArgs);
1914 break;
1915
Hal Finkel02a84272012-06-11 22:35:19 +00001916 case llvm::Triple::ppc:
1917 case llvm::Triple::ppc64:
1918 AddPPCTargetArgs(Args, CmdArgs);
1919 break;
1920
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001921 case llvm::Triple::sparc:
1922 AddSparcTargetArgs(Args, CmdArgs);
1923 break;
1924
Daniel Dunbar6acda162009-09-09 22:33:08 +00001925 case llvm::Triple::x86:
1926 case llvm::Triple::x86_64:
1927 AddX86TargetArgs(Args, CmdArgs);
1928 break;
Tony Linthicum96319392011-12-12 21:14:55 +00001929
1930 case llvm::Triple::hexagon:
1931 AddHexagonTargetArgs(Args, CmdArgs);
1932 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001933 }
1934
Tony Linthicum96319392011-12-12 21:14:55 +00001935
1936
Daniel Dunbarc176bc62010-08-11 23:07:47 +00001937 // Pass the linker version in use.
1938 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1939 CmdArgs.push_back("-target-linker-version");
1940 CmdArgs.push_back(A->getValue(Args));
1941 }
1942
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001943 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbar1ad66482010-07-01 01:31:45 +00001944 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001945 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson905c45f2011-10-14 05:03:44 +00001946 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00001947 CmdArgs.push_back("-momit-leaf-frame-pointer");
1948
Daniel Dunbarb30575c2010-05-12 18:19:58 +00001949 // Explicitly error on some things we know we don't support and can't just
1950 // ignore.
1951 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00001952 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1953 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00001954 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00001955 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00001956 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00001957 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1958 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00001959 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00001960 << Unsupported->getOption().getName();
1961 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00001962 }
1963
Daniel Dunbar1d460332009-03-18 10:01:51 +00001964 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00001965 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00001966 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00001967 CmdArgs.push_back("-header-include-file");
1968 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1969 D.CCPrintHeadersFilename : "-");
1970 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00001971 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00001972 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001973
Chad Rosier2b819102011-08-02 17:58:04 +00001974 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00001975 CmdArgs.push_back("-diagnostic-log-file");
1976 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1977 D.CCLogDiagnosticsFilename : "-");
1978 }
1979
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00001980 // Use the last option from "-g" group. "-gline-tables-only" is
1981 // preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00001982 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00001983 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1984 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1985 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonov7f326072012-06-21 08:22:39 +00001986 } else if (!A->getOption().matches(options::OPT_g0) &&
1987 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00001988 CmdArgs.push_back("-g");
Chad Rosier2875bda2011-11-04 19:28:44 +00001989 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00001990 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00001991
Alexey Samsonov7f326072012-06-21 08:22:39 +00001992 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1993 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1994
Rafael Espindola9cf933a2010-05-06 21:06:04 +00001995 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1996 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1997
Chris Lattner7255a2d2010-06-22 00:03:40 +00001998 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1999
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002000 if (Args.hasArg(options::OPT_ftest_coverage) ||
2001 Args.hasArg(options::OPT_coverage))
2002 CmdArgs.push_back("-femit-coverage-notes");
2003 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2004 Args.hasArg(options::OPT_coverage))
2005 CmdArgs.push_back("-femit-coverage-data");
2006
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002007 if (C.getArgs().hasArg(options::OPT_c) ||
2008 C.getArgs().hasArg(options::OPT_S)) {
2009 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002010 CmdArgs.push_back("-coverage-file");
2011 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002012 }
2013 }
2014
Daniel Dunbara268fc02011-10-11 18:20:10 +00002015 // Pass options for controlling the default header search paths.
2016 if (Args.hasArg(options::OPT_nostdinc)) {
2017 CmdArgs.push_back("-nostdsysteminc");
2018 CmdArgs.push_back("-nobuiltininc");
2019 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002020 if (Args.hasArg(options::OPT_nostdlibinc))
2021 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002022 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2023 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2024 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002025
Daniel Dunbar5f122322009-12-15 01:02:52 +00002026 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002027 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002028 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002029
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002030 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2031
Ted Kremenek30660a82012-03-06 20:06:33 +00002032 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002033 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002034 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002035 options::OPT_ccc_arcmt_modify,
2036 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002037 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002038 switch (A->getOption().getID()) {
2039 default:
2040 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002041 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002042 CmdArgs.push_back("-arcmt-check");
2043 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002044 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002045 CmdArgs.push_back("-arcmt-modify");
2046 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002047 case options::OPT_ccc_arcmt_migrate:
2048 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002049 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002050 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002051
2052 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2053 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002054 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002055 }
2056 }
2057 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002058
Ted Kremenek30660a82012-03-06 20:06:33 +00002059 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2060 if (ARCMTEnabled) {
2061 D.Diag(diag::err_drv_argument_not_allowed_with)
2062 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2063 }
2064 CmdArgs.push_back("-mt-migrate-directory");
2065 CmdArgs.push_back(A->getValue(Args));
2066
2067 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2068 options::OPT_objcmt_migrate_subscripting)) {
2069 // None specified, means enable them all.
2070 CmdArgs.push_back("-objcmt-migrate-literals");
2071 CmdArgs.push_back("-objcmt-migrate-subscripting");
2072 } else {
2073 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2074 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2075 }
2076 }
2077
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002078 // Add preprocessing options like -I, -D, etc. if we are using the
2079 // preprocessor.
2080 //
2081 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002082 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne54db68b2011-11-06 00:40:05 +00002083 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002084
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002085 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2086 // that "The compiler can only warn and ignore the option if not recognized".
2087 // When building with ccache, it will pass -D options to clang even on
2088 // preprocessed inputs and configure concludes that -fPIC is not supported.
2089 Args.ClaimAllArgs(options::OPT_D);
2090
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002091 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002092 // others.
2093 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002094 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002095 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002096 else if (A->getOption().matches(options::OPT_O) &&
2097 A->getValue(Args)[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002098 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002099 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002100 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002101 }
2102
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002103 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002104 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2105 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002106 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002107 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002108
2109 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2110 // (-ansi is equivalent to -std=c89).
2111 //
2112 // If a std is supplied, only add -trigraphs if it follows the
2113 // option.
2114 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2115 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002116 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002117 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002118 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002119 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002120 else
2121 Std->render(Args, CmdArgs);
2122
Daniel Dunbar0e100312010-06-14 21:23:08 +00002123 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2124 options::OPT_trigraphs))
2125 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002126 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002127 } else {
2128 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002129 //
2130 // FIXME: Clang doesn't correctly handle -std= when the input language
2131 // doesn't match. For the time being just ignore this for C++ inputs;
2132 // eventually we want to do all the standard defaulting here instead of
2133 // splitting it between the driver and clang -cc1.
2134 if (!types::isCXX(InputType))
NAKAMURA Takumi6a1f94b2012-07-12 03:14:56 +00002135 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2136 "-std=", /*Joined=*/true);
Daniel Dunbard573d262009-04-07 22:13:21 +00002137 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002138 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002139
Chandler Carruth50465d12011-04-23 06:30:43 +00002140 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2141 // '-fconst-strings'; this better indicates its actual behavior.
2142 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2143 false)) {
2144 // For perfect compatibility with GCC, we do this even in the presence of
2145 // '-w'. This flag names something other than a warning for GCC.
2146 CmdArgs.push_back("-fconst-strings");
2147 }
2148
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002149 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002150 // during C++ compilation, which it is by default. GCC keeps this define even
2151 // in the presence of '-w', match this behavior bug-for-bug.
2152 if (types::isCXX(InputType) &&
2153 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2154 true)) {
2155 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002156 }
2157
Chandler Carruthc304ba32010-05-22 02:21:53 +00002158 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2159 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2160 if (Asm->getOption().matches(options::OPT_fasm))
2161 CmdArgs.push_back("-fgnu-keywords");
2162 else
2163 CmdArgs.push_back("-fno-gnu-keywords");
2164 }
2165
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002166 if (ShouldDisableCFI(Args, getToolChain()))
2167 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002168
Nick Lewyckyea523d72011-10-17 23:05:52 +00002169 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2170 CmdArgs.push_back("-fno-dwarf-directory-asm");
2171
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002172 if (const char *pwd = ::getenv("PWD")) {
2173 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2174 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumi813a4072011-10-22 10:25:25 +00002175 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002176 std::string CompDir = pwd;
2177 CmdArgs.push_back("-fdebug-compilation-dir");
2178 CmdArgs.push_back(Args.MakeArgString(CompDir));
2179 }
2180 }
2181
Richard Smithc18c4232011-11-21 19:36:32 +00002182 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2183 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002184 CmdArgs.push_back("-ftemplate-depth");
2185 CmdArgs.push_back(A->getValue(Args));
2186 }
2187
Richard Smithc18c4232011-11-21 19:36:32 +00002188 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2189 CmdArgs.push_back("-fconstexpr-depth");
2190 CmdArgs.push_back(A->getValue(Args));
2191 }
2192
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002193 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2194 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002195 if (A->getNumValues()) {
2196 StringRef bytes = A->getValue(Args);
2197 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2198 } else
2199 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002200 }
2201
Nuno Lopesb3198a82012-05-08 22:10:46 +00002202 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2203 options::OPT_fbounds_checking_EQ)) {
2204 if (A->getNumValues()) {
2205 StringRef val = A->getValue(Args);
2206 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2207 } else
2208 CmdArgs.push_back("-fbounds-checking=1");
2209 }
2210
Daniel Dunbare4bdae72009-11-19 04:00:53 +00002211 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002212 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002213
Daniel Dunbar294691e2009-11-04 06:24:38 +00002214 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2215 CmdArgs.push_back("-fconstant-string-class");
2216 CmdArgs.push_back(A->getValue(Args));
2217 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002218
Chris Lattner124fca52010-01-09 21:54:33 +00002219 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2220 CmdArgs.push_back("-ftabstop");
2221 CmdArgs.push_back(A->getValue(Args));
2222 }
2223
Chris Lattner0f0c9632010-04-07 20:49:23 +00002224 CmdArgs.push_back("-ferror-limit");
2225 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2226 CmdArgs.push_back(A->getValue(Args));
2227 else
2228 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002229
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002230 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2231 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregor6c1cb992010-05-04 17:13:42 +00002232 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002233 }
2234
2235 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2236 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregor575cf372010-04-20 07:18:24 +00002237 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002238 }
2239
Richard Smith08d6e032011-12-16 19:06:07 +00002240 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2241 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2242 CmdArgs.push_back(A->getValue(Args));
2243 }
2244
Daniel Dunbar55efe142009-11-04 06:24:47 +00002245 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002246 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002247 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbara28690e2009-11-30 08:40:54 +00002248 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002249 } else {
2250 // If -fmessage-length=N was not specified, determine whether this is a
2251 // terminal and, if so, implicitly define -fmessage-length appropriately.
2252 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002253 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002254 }
2255
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002256 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2257 CmdArgs.push_back("-fvisibility");
2258 CmdArgs.push_back(A->getValue(Args));
2259 }
2260
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002261 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002262
Hans Wennborgde981f32012-06-28 08:01:44 +00002263 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2264
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002265 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002266 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2267 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002268 CmdArgs.push_back("-ffreestanding");
2269
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002270 // Forward -f (flag) options which we can pass directly.
Mike Stump9c276ae2009-12-12 01:27:46 +00002271 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002272 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002273 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002274 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002275 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002276 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002277 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002278 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2279 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002280
2281 // Report and error for -faltivec on anything other then PowerPC.
2282 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2283 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2284 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2285 D.Diag(diag::err_drv_argument_only_allowed_with)
2286 << A->getAsString(Args) << "ppc/ppc64";
2287
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002288 if (getToolChain().SupportsProfiling())
2289 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002290
Kostya Serebryany1b4eca62011-11-16 17:34:26 +00002291 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2292 options::OPT_fno_address_sanitizer, false))
2293 CmdArgs.push_back("-faddress-sanitizer");
2294
Kostya Serebryany3c931222012-03-01 22:27:08 +00002295 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2296 options::OPT_fno_thread_sanitizer, false))
2297 CmdArgs.push_back("-fthread-sanitizer");
2298
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002299 // -flax-vector-conversions is default.
2300 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2301 options::OPT_fno_lax_vector_conversions))
2302 CmdArgs.push_back("-fno-lax-vector-conversions");
2303
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002304 if (Args.getLastArg(options::OPT_fapple_kext))
2305 CmdArgs.push_back("-fapple-kext");
2306
David Blaikie940152f2012-06-14 18:55:27 +00002307 if (Args.hasFlag(options::OPT_frewrite_includes,
2308 options::OPT_fno_rewrite_includes, false))
2309 CmdArgs.push_back("-frewrite-includes");
2310
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002311 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002312 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002313 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002314 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2315 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002316
2317 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2318 CmdArgs.push_back("-ftrapv-handler");
2319 CmdArgs.push_back(A->getValue(Args));
2320 }
2321
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002322 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002323
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002324 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2325 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2326 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2327 options::OPT_fno_wrapv)) {
2328 if (A->getOption().matches(options::OPT_fwrapv))
2329 CmdArgs.push_back("-fwrapv");
2330 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2331 options::OPT_fno_strict_overflow)) {
2332 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2333 CmdArgs.push_back("-fwrapv");
2334 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002335 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002336 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002337
Daniel Dunbar5345c392009-09-03 04:54:28 +00002338 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2339
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002340 // -stack-protector=0 is default.
2341 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002342 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2343 options::OPT_fstack_protector_all,
2344 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002345 if (A->getOption().matches(options::OPT_fstack_protector))
2346 StackProtectorLevel = 1;
2347 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2348 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002349 } else {
2350 StackProtectorLevel =
2351 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2352 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002353 if (StackProtectorLevel) {
2354 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002355 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Bill Wendling45483f72009-06-28 07:36:13 +00002356 }
2357
Nick Lewycky4e785c92011-12-06 03:33:03 +00002358 // Translate -mstackrealign
2359 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2360 false)) {
2361 CmdArgs.push_back("-backend-option");
2362 CmdArgs.push_back("-force-align-stack");
2363 }
2364 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2365 false)) {
2366 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2367 }
2368
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002369 if (Args.hasArg(options::OPT_mstack_alignment)) {
2370 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2371 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002372 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002373
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002374 // Forward -f options with positive and negative forms; we translate
2375 // these by hand.
2376
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002377 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002378 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002379 CmdArgs.push_back("-fapple-kext");
2380 if (!Args.hasArg(options::OPT_fbuiltin))
2381 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002382 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002383 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002384 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002385 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002386 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002387
Nuno Lopesfc284482009-12-16 16:59:22 +00002388 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2389 options::OPT_fno_assume_sane_operator_new))
2390 CmdArgs.push_back("-fno-assume-sane-operator-new");
2391
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002392 // -fblocks=0 is default.
2393 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002394 getToolChain().IsBlocksDefault()) ||
2395 (Args.hasArg(options::OPT_fgnu_runtime) &&
2396 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2397 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002398 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002399
2400 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2401 !getToolChain().hasBlocksRuntime())
2402 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002403 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002404
Douglas Gregor64554ba2012-01-18 15:19:58 +00002405 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2406 // users must also pass -fcxx-modules. The latter flag will disappear once the
2407 // modules implementation is solid for C++/Objective-C++ programs as well.
2408 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2409 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2410 options::OPT_fno_cxx_modules,
2411 false);
2412 if (AllowedInCXX || !types::isCXX(InputType))
2413 CmdArgs.push_back("-fmodules");
2414 }
Douglas Gregor7025d2c2012-01-03 17:13:05 +00002415
John McCall32579cf2010-04-09 19:12:06 +00002416 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00002417 if (Args.hasFlag(options::OPT_fno_access_control,
2418 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00002419 false))
John McCall7002f4c2010-04-09 19:03:51 +00002420 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00002421
Anders Carlssona4c24752010-11-21 00:09:52 +00002422 // -felide-constructors is the default.
2423 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2424 options::OPT_felide_constructors,
2425 false))
2426 CmdArgs.push_back("-fno-elide-constructors");
2427
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002428 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002429 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2430 KernelOrKext)
Daniel Dunbar53e84842009-11-19 04:55:23 +00002431 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00002432
Tony Linthicum96319392011-12-12 21:14:55 +00002433 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002434 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00002435 options::OPT_fno_short_enums,
2436 getToolChain().getTriple().getArch() ==
2437 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002438 CmdArgs.push_back("-fshort-enums");
2439
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002440 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002441 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002442 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00002443 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00002444
Anders Carlssona508b7d2010-02-06 23:23:06 +00002445 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00002446 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00002447 options::OPT_fno_threadsafe_statics))
2448 CmdArgs.push_back("-fno-threadsafe-statics");
2449
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002450 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002451 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2452 options::OPT_fno_use_cxa_atexit,
2453 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00002454 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00002455 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2456 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002457 CmdArgs.push_back("-fno-use-cxa-atexit");
2458
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002459 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002460 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002461 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2462 CmdArgs.push_back("-fms-extensions");
2463
Chad Rosierf925e042012-07-20 21:20:33 +00002464 // -fms-inline-asm.
Chad Rosierd256f862012-07-20 23:12:26 +00002465 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2466 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosierf925e042012-07-20 21:20:33 +00002467
Francois Pichetae556082011-09-17 04:32:15 +00002468 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00002469 if (Args.hasFlag(options::OPT_fms_compatibility,
2470 options::OPT_fno_ms_compatibility,
2471 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2472 Args.hasFlag(options::OPT_fms_extensions,
2473 options::OPT_fno_ms_extensions,
2474 true))))
Francois Pichetae556082011-09-17 04:32:15 +00002475 CmdArgs.push_back("-fms-compatibility");
2476
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002477 // -fmsc-version=1300 is default.
2478 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2479 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2480 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002481 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002482 if (msc_ver.empty())
2483 CmdArgs.push_back("-fmsc-version=1300");
2484 else
2485 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2486 }
2487
2488
Dawn Perchik400b6072010-09-02 23:59:25 +00002489 // -fborland-extensions=0 is default.
2490 if (Args.hasFlag(options::OPT_fborland_extensions,
2491 options::OPT_fno_borland_extensions, false))
2492 CmdArgs.push_back("-fborland-extensions");
2493
Francois Pichet8efcc012011-09-01 16:38:08 +00002494 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2495 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00002496 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2497 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00002498 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00002499 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00002500
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002501 // -fgnu-keywords default varies depending on language; only pass if
2502 // specified.
2503 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00002504 options::OPT_fno_gnu_keywords))
2505 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002506
Rafael Espindola01ba8542011-06-02 17:30:53 +00002507 if (Args.hasFlag(options::OPT_fgnu89_inline,
2508 options::OPT_fno_gnu89_inline,
2509 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00002510 CmdArgs.push_back("-fgnu89-inline");
2511
Chad Rosierfc055f92012-03-15 22:31:42 +00002512 if (Args.hasArg(options::OPT_fno_inline))
2513 CmdArgs.push_back("-fno-inline");
2514
Chad Rosier634a4b12012-03-06 21:17:19 +00002515 if (Args.hasArg(options::OPT_fno_inline_functions))
2516 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00002517
John McCall260611a2012-06-20 06:18:46 +00002518 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00002519
John McCall260611a2012-06-20 06:18:46 +00002520 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2521 // legacy is the default.
2522 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002523 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2524 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00002525 objcRuntime.isLegacyDispatchDefaultForArch(
2526 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002527 if (getToolChain().UseObjCMixedDispatch())
2528 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2529 else
2530 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2531 }
2532 }
2533
Nico Weberdf423542012-03-09 21:19:44 +00002534 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2535 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00002536 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002537 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2538 }
2539
John McCall9f084a32011-07-06 00:26:06 +00002540 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2541 // NOTE: This logic is duplicated in ToolChains.cpp.
2542 bool ARC = isObjCAutoRefCount(Args);
2543 if (ARC) {
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00002544 if (!getToolChain().SupportsObjCARC())
2545 D.Diag(diag::err_arc_unsupported);
2546
John McCall9f084a32011-07-06 00:26:06 +00002547 CmdArgs.push_back("-fobjc-arc");
2548
Chandler Carruth7ffa0322011-11-04 07:34:47 +00002549 // FIXME: It seems like this entire block, and several around it should be
2550 // wrapped in isObjC, but for now we just use it here as this is where it
2551 // was being used previously.
2552 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2553 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2554 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2555 else
2556 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2557 }
2558
John McCall9f084a32011-07-06 00:26:06 +00002559 // Allow the user to enable full exceptions code emission.
2560 // We define off for Objective-CC, on for Objective-C++.
2561 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2562 options::OPT_fno_objc_arc_exceptions,
2563 /*default*/ types::isCXX(InputType)))
2564 CmdArgs.push_back("-fobjc-arc-exceptions");
2565 }
2566
2567 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2568 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00002569 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00002570 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002571
John McCall9f084a32011-07-06 00:26:06 +00002572 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2573 // takes precedence.
2574 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2575 if (!GCArg)
2576 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2577 if (GCArg) {
2578 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002579 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00002580 << GCArg->getAsString(Args);
2581 } else if (getToolChain().SupportsObjCGC()) {
2582 GCArg->render(Args, CmdArgs);
2583 } else {
2584 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002585 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00002586 << GCArg->getAsString(Args);
2587 }
2588 }
2589
John McCalld71315c2011-06-22 00:53:57 +00002590 // Add exception args.
2591 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00002592 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00002593
2594 if (getToolChain().UseSjLjExceptions())
2595 CmdArgs.push_back("-fsjlj-exceptions");
2596
2597 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00002598 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2599 options::OPT_fno_assume_sane_operator_new))
2600 CmdArgs.push_back("-fno-assume-sane-operator-new");
2601
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00002602 // -fconstant-cfstrings is default, and may be subject to argument translation
2603 // on Darwin.
2604 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2605 options::OPT_fno_constant_cfstrings) ||
2606 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2607 options::OPT_mno_constant_cfstrings))
2608 CmdArgs.push_back("-fno-constant-cfstrings");
2609
John Thompsona6fda122009-11-05 20:14:16 +00002610 // -fshort-wchar default varies depending on platform; only
2611 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00002612 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2613 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00002614
Daniel Dunbaree848a72009-10-29 02:39:57 +00002615 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2616 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00002617 //
2618 // FIXME: This is gross; that translation should be pulled from the
2619 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002620 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00002621 options::OPT_fno_pascal_strings,
2622 false) ||
2623 Args.hasFlag(options::OPT_mpascal_strings,
2624 options::OPT_mno_pascal_strings,
2625 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002626 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002627
Daniel Dunbar88934e82011-10-05 21:04:55 +00002628 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2629 // -fno-pack-struct doesn't apply to -fpack-struct=.
2630 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00002631 std::string PackStructStr = "-fpack-struct=";
2632 PackStructStr += A->getValue(Args);
2633 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00002634 } else if (Args.hasFlag(options::OPT_fpack_struct,
2635 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00002636 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00002637 }
2638
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002639 if (Args.hasArg(options::OPT_mkernel) ||
2640 Args.hasArg(options::OPT_fapple_kext)) {
2641 if (!Args.hasArg(options::OPT_fcommon))
2642 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00002643 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002644 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00002645
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002646 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002647 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002648 CmdArgs.push_back("-fno-common");
2649
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002650 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002651 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00002652 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002653 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002654 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002655 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2656
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002657 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2658 if (!Args.hasFlag(options::OPT_ffor_scope,
2659 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002660 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002661 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2662
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00002663 // -fcaret-diagnostics is default.
2664 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2665 options::OPT_fno_caret_diagnostics, true))
2666 CmdArgs.push_back("-fno-caret-diagnostics");
2667
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002668 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00002669 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002670 options::OPT_fno_diagnostics_fixit_info))
2671 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002672
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002673 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00002674 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002675 options::OPT_fno_diagnostics_show_option))
2676 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00002677
Chris Lattner6fbe8392010-05-04 21:55:25 +00002678 if (const Arg *A =
2679 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2680 CmdArgs.push_back("-fdiagnostics-show-category");
2681 CmdArgs.push_back(A->getValue(Args));
2682 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002683
Douglas Gregorc9471b02011-05-21 17:07:29 +00002684 if (const Arg *A =
2685 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2686 CmdArgs.push_back("-fdiagnostics-format");
2687 CmdArgs.push_back(A->getValue(Args));
2688 }
2689
Chandler Carruthabaca7a2011-03-27 01:50:55 +00002690 if (Arg *A = Args.getLastArg(
2691 options::OPT_fdiagnostics_show_note_include_stack,
2692 options::OPT_fno_diagnostics_show_note_include_stack)) {
2693 if (A->getOption().matches(
2694 options::OPT_fdiagnostics_show_note_include_stack))
2695 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2696 else
2697 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2698 }
2699
Daniel Dunbar838be482009-11-04 06:24:57 +00002700 // Color diagnostics are the default, unless the terminal doesn't support
2701 // them.
2702 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidisf765d762010-09-23 12:56:06 +00002703 options::OPT_fno_color_diagnostics,
2704 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00002705 CmdArgs.push_back("-fcolor-diagnostics");
2706
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00002707 if (!Args.hasFlag(options::OPT_fshow_source_location,
2708 options::OPT_fno_show_source_location))
2709 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002710
Douglas Gregorc9471b02011-05-21 17:07:29 +00002711 if (!Args.hasFlag(options::OPT_fshow_column,
2712 options::OPT_fno_show_column,
2713 true))
2714 CmdArgs.push_back("-fno-show-column");
2715
Douglas Gregora0068fc2010-07-09 17:35:33 +00002716 if (!Args.hasFlag(options::OPT_fspell_checking,
2717 options::OPT_fno_spell_checking))
2718 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002719
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002720
Daniel Dunbar16894392010-11-02 19:42:04 +00002721 // Silently ignore -fasm-blocks for now.
2722 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2723 false);
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002724
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00002725 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2726 A->render(Args, CmdArgs);
2727
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002728 // -fdollars-in-identifiers default varies depending on platform and
2729 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00002730 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002731 options::OPT_fno_dollars_in_identifiers)) {
2732 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00002733 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002734 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00002735 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002736 }
2737
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002738 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2739 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00002740 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002741 options::OPT_fno_unit_at_a_time)) {
2742 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002743 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002744 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002745
Eli Friedman19bda3a2011-11-02 01:53:16 +00002746 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2747 options::OPT_fno_apple_pragma_pack, false))
2748 CmdArgs.push_back("-fapple-pragma-pack");
2749
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002750 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002751 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002752 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002753#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00002754 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002755 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2756 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2757 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2758 CmdArgs.push_back("-fno-builtin-strcat");
2759 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2760 CmdArgs.push_back("-fno-builtin-strcpy");
2761 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002762#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002763
Daniel Dunbard98750f2011-03-18 21:23:40 +00002764 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00002765 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00002766 options::OPT_traditional_cpp)) {
2767 if (isa<PreprocessJobAction>(JA))
2768 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002769 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00002770 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00002771 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002772
Daniel Dunbar1d460332009-03-18 10:01:51 +00002773 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00002774 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00002775
2776 // Handle serialized diagnostics.
2777 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2778 CmdArgs.push_back("-serialize-diagnostic-file");
2779 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2780 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002781
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002782 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2783 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00002784 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002785 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2786 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002787 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00002788
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002789 // We translate this by hand to the -cc1 argument, since nightly test uses
2790 // it and developers have been trained to spell it with -mllvm.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002791 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002792 CmdArgs.push_back("-disable-llvm-optzns");
2793 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002794 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002795 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002796
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002797 if (Output.getType() == types::TY_Dependencies) {
2798 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00002799 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002800 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00002801 CmdArgs.push_back(Output.getFilename());
2802 } else {
2803 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002804 }
2805
Daniel Dunbar1d460332009-03-18 10:01:51 +00002806 for (InputInfoList::const_iterator
2807 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2808 const InputInfo &II = *it;
2809 CmdArgs.push_back("-x");
2810 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00002811 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00002812 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002813 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00002814 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002815 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002816
Chris Lattnere6113de2009-11-03 19:50:27 +00002817 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2818
Daniel Dunbara001c1c2010-07-18 21:16:15 +00002819 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002820
2821 // Optionally embed the -cc1 level arguments into the debug info, for build
2822 // analysis.
2823 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00002824 ArgStringList OriginalArgs;
2825 for (ArgList::const_iterator it = Args.begin(),
2826 ie = Args.end(); it != ie; ++it)
2827 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002828
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00002829 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002830 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00002831 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002832 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00002833 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002834 }
2835 CmdArgs.push_back("-dwarf-debug-flags");
2836 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2837 }
2838
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00002839 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00002840
Roman Divackybe4c8702011-02-10 16:52:03 +00002841 if (Arg *A = Args.getLastArg(options::OPT_pg))
2842 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002843 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00002844 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002845
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002846 // Claim some arguments which clang supports automatically.
2847
Daniel Dunbarf4046862010-04-15 06:18:42 +00002848 // -fpch-preprocess is used with gcc to add a special marker in the output to
2849 // include the PCH file. Clang's PTH solution is completely transparent, so we
2850 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002851 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002852
Daniel Dunbara880db02009-03-23 19:03:36 +00002853 // Claim some arguments which clang doesn't support, but we don't
2854 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00002855 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2856 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002857
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002858 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002859 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002860 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002861}
2862
Jim Grosbachfc308292012-02-10 20:37:10 +00002863void ClangAs::AddARMTargetArgs(const ArgList &Args,
2864 ArgStringList &CmdArgs) const {
2865 const Driver &D = getToolChain().getDriver();
2866 llvm::Triple Triple = getToolChain().getTriple();
2867
2868 // Set the CPU based on -march= and -mcpu=.
2869 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00002870 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00002871
2872 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00002873 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00002874 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00002875
2876 // Honor -mfpmath=.
2877 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00002878 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00002879}
2880
John McCall260611a2012-06-20 06:18:46 +00002881/// Add options related to the Objective-C runtime/ABI.
2882///
2883/// Returns true if the runtime is non-fragile.
2884ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2885 ArgStringList &cmdArgs,
2886 RewriteKind rewriteKind) const {
2887 // Look for the controlling runtime option.
2888 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2889 options::OPT_fgnu_runtime,
2890 options::OPT_fobjc_runtime_EQ);
2891
2892 // Just forward -fobjc-runtime= to the frontend. This supercedes
2893 // options about fragility.
2894 if (runtimeArg &&
2895 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2896 ObjCRuntime runtime;
2897 StringRef value = runtimeArg->getValue(args);
2898 if (runtime.tryParse(value)) {
2899 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2900 << value;
2901 }
2902
2903 runtimeArg->render(args, cmdArgs);
2904 return runtime;
2905 }
2906
2907 // Otherwise, we'll need the ABI "version". Version numbers are
2908 // slightly confusing for historical reasons:
2909 // 1 - Traditional "fragile" ABI
2910 // 2 - Non-fragile ABI, version 1
2911 // 3 - Non-fragile ABI, version 2
2912 unsigned objcABIVersion = 1;
2913 // If -fobjc-abi-version= is present, use that to set the version.
2914 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2915 StringRef value = abiArg->getValue(args);
2916 if (value == "1")
2917 objcABIVersion = 1;
2918 else if (value == "2")
2919 objcABIVersion = 2;
2920 else if (value == "3")
2921 objcABIVersion = 3;
2922 else
2923 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2924 << value;
2925 } else {
2926 // Otherwise, determine if we are using the non-fragile ABI.
2927 bool nonFragileABIIsDefault =
2928 (rewriteKind == RK_NonFragile ||
2929 (rewriteKind == RK_None &&
2930 getToolChain().IsObjCNonFragileABIDefault()));
2931 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2932 options::OPT_fno_objc_nonfragile_abi,
2933 nonFragileABIIsDefault)) {
2934 // Determine the non-fragile ABI version to use.
2935#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2936 unsigned nonFragileABIVersion = 1;
2937#else
2938 unsigned nonFragileABIVersion = 2;
2939#endif
2940
2941 if (Arg *abiArg = args.getLastArg(
2942 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2943 StringRef value = abiArg->getValue(args);
2944 if (value == "1")
2945 nonFragileABIVersion = 1;
2946 else if (value == "2")
2947 nonFragileABIVersion = 2;
2948 else
2949 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2950 << value;
2951 }
2952
2953 objcABIVersion = 1 + nonFragileABIVersion;
2954 } else {
2955 objcABIVersion = 1;
2956 }
2957 }
2958
2959 // We don't actually care about the ABI version other than whether
2960 // it's non-fragile.
2961 bool isNonFragile = objcABIVersion != 1;
2962
2963 // If we have no runtime argument, ask the toolchain for its default runtime.
2964 // However, the rewriter only really supports the Mac runtime, so assume that.
2965 ObjCRuntime runtime;
2966 if (!runtimeArg) {
2967 switch (rewriteKind) {
2968 case RK_None:
2969 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2970 break;
2971 case RK_Fragile:
2972 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2973 break;
2974 case RK_NonFragile:
2975 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2976 break;
2977 }
2978
2979 // -fnext-runtime
2980 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2981 // On Darwin, make this use the default behavior for the toolchain.
2982 if (getToolChain().getTriple().isOSDarwin()) {
2983 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2984
2985 // Otherwise, build for a generic macosx port.
2986 } else {
2987 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2988 }
2989
2990 // -fgnu-runtime
2991 } else {
2992 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00002993 // Legacy behaviour is to target the gnustep runtime if we are i
2994 // non-fragile mode or the GCC runtime in fragile mode.
2995 if (isNonFragile)
2996 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
2997 else
2998 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00002999 }
3000
3001 cmdArgs.push_back(args.MakeArgString(
3002 "-fobjc-runtime=" + runtime.getAsString()));
3003 return runtime;
3004}
3005
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003006void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003007 const InputInfo &Output,
3008 const InputInfoList &Inputs,
3009 const ArgList &Args,
3010 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003011 ArgStringList CmdArgs;
3012
3013 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3014 const InputInfo &Input = Inputs[0];
3015
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003016 // Don't warn about "clang -w -c foo.s"
3017 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003018 // and "clang -emit-llvm -c foo.s"
3019 Args.ClaimAllArgs(options::OPT_emit_llvm);
3020 // and "clang -use-gold-plugin -c foo.s"
3021 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003022
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003023 // Invoke ourselves in -cc1as mode.
3024 //
3025 // FIXME: Implement custom jobs for internal actions.
3026 CmdArgs.push_back("-cc1as");
3027
3028 // Add the "effective" target triple.
3029 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003030 std::string TripleStr =
3031 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003032 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3033
3034 // Set the output mode, we currently only expect to be used as a real
3035 // assembler.
3036 CmdArgs.push_back("-filetype");
3037 CmdArgs.push_back("obj");
3038
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003039 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003040 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003041
Jim Grosbachfc308292012-02-10 20:37:10 +00003042 // Add target specific cpu and features flags.
3043 switch(getToolChain().getTriple().getArch()) {
3044 default:
3045 break;
3046
3047 case llvm::Triple::arm:
3048 case llvm::Triple::thumb:
3049 AddARMTargetArgs(Args, CmdArgs);
3050 break;
3051 }
3052
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003053 // Ignore explicit -force_cpusubtype_ALL option.
3054 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003055
Eric Christopher8f0a4032012-01-10 00:38:01 +00003056 // Determine the original source input.
3057 const Action *SourceAction = &JA;
3058 while (SourceAction->getKind() != Action::InputClass) {
3059 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3060 SourceAction = SourceAction->getInputs()[0];
3061 }
3062
3063 // Forward -g, assuming we are dealing with an actual assembly file.
3064 if (SourceAction->getType() == types::TY_Asm ||
3065 SourceAction->getType() == types::TY_PP_Asm) {
3066 Args.ClaimAllArgs(options::OPT_g_Group);
3067 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3068 if (!A->getOption().matches(options::OPT_g0))
3069 CmdArgs.push_back("-g");
3070 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003071
3072 // Optionally embed the -cc1as level arguments into the debug info, for build
3073 // analysis.
3074 if (getToolChain().UseDwarfDebugFlags()) {
3075 ArgStringList OriginalArgs;
3076 for (ArgList::const_iterator it = Args.begin(),
3077 ie = Args.end(); it != ie; ++it)
3078 (*it)->render(Args, OriginalArgs);
3079
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003080 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003081 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3082 Flags += Exec;
3083 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3084 Flags += " ";
3085 Flags += OriginalArgs[i];
3086 }
3087 CmdArgs.push_back("-dwarf-debug-flags");
3088 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3089 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003090
3091 // FIXME: Add -static support, once we have it.
3092
3093 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3094 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003095 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003096
3097 assert(Output.isFilename() && "Unexpected lipo output.");
3098 CmdArgs.push_back("-o");
3099 CmdArgs.push_back(Output.getFilename());
3100
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003101 assert(Input.isFilename() && "Invalid input.");
3102 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003103
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003104 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003105 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003106}
3107
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003108void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003109 const InputInfo &Output,
3110 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003111 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003112 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003113 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003114 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003115
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003116 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003117 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003118 Arg *A = *it;
Daniel Dunbar75877192009-03-19 07:55:12 +00003119 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003120 // Don't forward any -g arguments to assembly steps.
3121 if (isa<AssembleJobAction>(JA) &&
3122 A->getOption().matches(options::OPT_g_Group))
3123 continue;
3124
Daniel Dunbar75877192009-03-19 07:55:12 +00003125 // It is unfortunate that we have to claim here, as this means
3126 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003127 // platforms using a generic gcc, even if we are just using gcc
3128 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003129 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003130 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003131 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003132 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003133
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003134 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003135
3136 // If using a driver driver, force the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003137 const std::string &Arch = getToolChain().getArchName();
Bob Wilson905c45f2011-10-14 05:03:44 +00003138 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003139 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003140
3141 // FIXME: Remove these special cases.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003142 if (Arch == "powerpc")
3143 CmdArgs.push_back("ppc");
3144 else if (Arch == "powerpc64")
3145 CmdArgs.push_back("ppc64");
3146 else
Daniel Dunbar88137642009-09-09 22:32:48 +00003147 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003148 }
3149
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003150 // Try to force gcc to match the tool chain we want, if we recognize
3151 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003152 //
3153 // FIXME: The triple class should directly provide the information we want
3154 // here.
3155 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003156 CmdArgs.push_back("-m32");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003157 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003158 CmdArgs.push_back("-m64");
3159
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003160 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003161 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003162 CmdArgs.push_back(Output.getFilename());
3163 } else {
3164 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003165 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003166 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003167
Tony Linthicum96319392011-12-12 21:14:55 +00003168 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3169 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003170
3171 // Only pass -x if gcc will understand it; otherwise hope gcc
3172 // understands the suffix correctly. The main use case this would go
3173 // wrong in is for linker inputs if they happened to have an odd
3174 // suffix; really the only way to get this to happen is a command
3175 // like '-x foobar a.c' which will treat a.c like a linker input.
3176 //
3177 // FIXME: For the linker case specifically, can we safely convert
3178 // inputs into '-Wl,' options?
3179 for (InputInfoList::const_iterator
3180 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3181 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003182
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003183 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003184 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3185 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003186 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003187 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003188 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003189 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003190 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003191
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003192 if (types::canTypeBeUserSpecified(II.getType())) {
3193 CmdArgs.push_back("-x");
3194 CmdArgs.push_back(types::getTypeName(II.getType()));
3195 }
3196
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003197 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003199 else {
3200 const Arg &A = II.getInputArg();
3201
3202 // Reverse translate some rewritten options.
3203 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3204 CmdArgs.push_back("-lstdc++");
3205 continue;
3206 }
3207
Daniel Dunbar115a7922009-03-19 07:29:38 +00003208 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003209 A.render(Args, CmdArgs);
3210 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003211 }
3212
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003213 const std::string customGCCName = D.getCCCGenericGCCName();
3214 const char *GCCName;
3215 if (!customGCCName.empty())
3216 GCCName = customGCCName.c_str();
3217 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003218 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003219 } else
3220 GCCName = "gcc";
3221
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003222 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003223 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003224 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003225}
3226
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003227void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3228 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003229 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003230}
3231
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003232void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3233 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003234 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003235}
3236
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003237void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3238 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003239 const Driver &D = getToolChain().getDriver();
3240
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003241 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003242 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3243 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003244 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00003245 else {
3246 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003247 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003248 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00003249
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003250 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00003251 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003252}
3253
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003254void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3255 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003256 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003257}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003258
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003259void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3260 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003261 // The types are (hopefully) good enough.
3262}
3263
Tony Linthicum96319392011-12-12 21:14:55 +00003264// Hexagon tools start.
3265void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3266 ArgStringList &CmdArgs) const {
3267
3268}
3269void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3270 const InputInfo &Output,
3271 const InputInfoList &Inputs,
3272 const ArgList &Args,
3273 const char *LinkingOutput) const {
3274
3275 const Driver &D = getToolChain().getDriver();
3276 ArgStringList CmdArgs;
3277
3278 std::string MarchString = "-march=";
3279 MarchString += getHexagonTargetCPU(Args);
3280 CmdArgs.push_back(Args.MakeArgString(MarchString));
3281
3282 RenderExtraToolArgs(JA, CmdArgs);
3283
3284 if (Output.isFilename()) {
3285 CmdArgs.push_back("-o");
3286 CmdArgs.push_back(Output.getFilename());
3287 } else {
3288 assert(Output.isNothing() && "Unexpected output");
3289 CmdArgs.push_back("-fsyntax-only");
3290 }
3291
3292
3293 // Only pass -x if gcc will understand it; otherwise hope gcc
3294 // understands the suffix correctly. The main use case this would go
3295 // wrong in is for linker inputs if they happened to have an odd
3296 // suffix; really the only way to get this to happen is a command
3297 // like '-x foobar a.c' which will treat a.c like a linker input.
3298 //
3299 // FIXME: For the linker case specifically, can we safely convert
3300 // inputs into '-Wl,' options?
3301 for (InputInfoList::const_iterator
3302 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3303 const InputInfo &II = *it;
3304
3305 // Don't try to pass LLVM or AST inputs to a generic gcc.
3306 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3307 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3308 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3309 << getToolChain().getTripleString();
3310 else if (II.getType() == types::TY_AST)
3311 D.Diag(clang::diag::err_drv_no_ast_support)
3312 << getToolChain().getTripleString();
3313
3314 if (II.isFilename())
3315 CmdArgs.push_back(II.getFilename());
3316 else
3317 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3318 II.getInputArg().render(Args, CmdArgs);
3319 }
3320
3321 const char *GCCName = "hexagon-as";
3322 const char *Exec =
3323 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3324 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3325
3326}
3327void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3328 ArgStringList &CmdArgs) const {
3329 // The types are (hopefully) good enough.
3330}
3331
3332void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3333 const InputInfo &Output,
3334 const InputInfoList &Inputs,
3335 const ArgList &Args,
3336 const char *LinkingOutput) const {
3337
3338 const Driver &D = getToolChain().getDriver();
3339 ArgStringList CmdArgs;
3340
3341 for (ArgList::const_iterator
3342 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3343 Arg *A = *it;
3344 if (A->getOption().hasForwardToGCC()) {
3345 // Don't forward any -g arguments to assembly steps.
3346 if (isa<AssembleJobAction>(JA) &&
3347 A->getOption().matches(options::OPT_g_Group))
3348 continue;
3349
3350 // It is unfortunate that we have to claim here, as this means
3351 // we will basically never report anything interesting for
3352 // platforms using a generic gcc, even if we are just using gcc
3353 // to get to the assembler.
3354 A->claim();
3355 A->render(Args, CmdArgs);
3356 }
3357 }
3358
3359 RenderExtraToolArgs(JA, CmdArgs);
3360
3361 // Add Arch Information
3362 Arg *A;
Sebastian Pop43115d42012-01-13 20:37:10 +00003363 if ((A = getLastHexagonArchArg(Args))) {
3364 if (A->getOption().matches(options::OPT_m_Joined))
3365 A->render(Args, CmdArgs);
Tony Linthicum96319392011-12-12 21:14:55 +00003366 else
Sebastian Pop43115d42012-01-13 20:37:10 +00003367 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00003368 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003369 else {
3370 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3371 }
3372
Tony Linthicum96319392011-12-12 21:14:55 +00003373 CmdArgs.push_back("-mqdsp6-compat");
3374
3375 const char *GCCName;
3376 if (C.getDriver().CCCIsCXX)
3377 GCCName = "hexagon-g++";
3378 else
3379 GCCName = "hexagon-gcc";
3380 const char *Exec =
3381 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3382
3383 if (Output.isFilename()) {
3384 CmdArgs.push_back("-o");
3385 CmdArgs.push_back(Output.getFilename());
3386 }
3387
3388 for (InputInfoList::const_iterator
3389 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3390 const InputInfo &II = *it;
3391
3392 // Don't try to pass LLVM or AST inputs to a generic gcc.
3393 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3394 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3395 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3396 << getToolChain().getTripleString();
3397 else if (II.getType() == types::TY_AST)
3398 D.Diag(clang::diag::err_drv_no_ast_support)
3399 << getToolChain().getTripleString();
3400
3401 if (II.isFilename())
3402 CmdArgs.push_back(II.getFilename());
3403 else
3404 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3405 II.getInputArg().render(Args, CmdArgs);
3406 }
3407 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3408
3409}
3410// Hexagon tools end.
3411
3412
Daniel Dunbar40f12652009-03-29 17:08:39 +00003413const char *darwin::CC1::getCC1Name(types::ID Type) const {
3414 switch (Type) {
3415 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00003416 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbar40f12652009-03-29 17:08:39 +00003417 case types::TY_Asm:
3418 case types::TY_C: case types::TY_CHeader:
3419 case types::TY_PP_C: case types::TY_PP_CHeader:
3420 return "cc1";
3421 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003422 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3423 case types::TY_PP_ObjCHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003424 return "cc1obj";
3425 case types::TY_CXX: case types::TY_CXXHeader:
3426 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3427 return "cc1plus";
3428 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003429 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3430 case types::TY_PP_ObjCXXHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003431 return "cc1objplus";
3432 }
3433}
3434
David Blaikie99ba9e32011-12-20 02:48:34 +00003435void darwin::CC1::anchor() {}
3436
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003437const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003438 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00003439 return Args.MakeArgString(
3440 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003441}
3442
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003443const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003444 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003445 const char *Str = getBaseInputName(Args, Inputs);
3446
Chris Lattner657ca662011-01-16 08:14:11 +00003447 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00003448 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003449
3450 return Str;
3451}
3452
3453const char *
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003454darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003455 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003456 // FIXME: Think about this more.
3457 std::string Res;
3458
3459 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3460 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003461 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00003462 } else {
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003463 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00003464 }
Daniel Dunbar88137642009-09-09 22:32:48 +00003465 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003466}
3467
Chad Rosier285f9a22011-08-17 18:24:55 +00003468void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher88b7cf02011-08-19 00:30:14 +00003469 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosier285f9a22011-08-17 18:24:55 +00003470 it != ie;) {
Chad Rosier8722a5d2011-08-18 17:56:32 +00003471
3472 StringRef Option = *it;
Chad Rosier80717972011-08-26 18:30:43 +00003473 bool RemoveOption = false;
Chad Rosier04225c12011-08-18 01:18:28 +00003474
Bob Wilson2872c8d2012-02-07 01:17:55 +00003475 // Erase both -fmodule-cache-path and its argument.
3476 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3477 it = CmdArgs.erase(it, it+2);
Chad Rosier80717972011-08-26 18:30:43 +00003478 ie = CmdArgs.end();
Chad Rosier04225c12011-08-18 01:18:28 +00003479 continue;
3480 }
3481
Bob Wilson2872c8d2012-02-07 01:17:55 +00003482 // Remove unsupported -f options.
3483 if (Option.startswith("-f")) {
3484 // Remove -f/-fno- to reduce the number of cases.
3485 if (Option.startswith("-fno-"))
3486 Option = Option.substr(5);
3487 else
3488 Option = Option.substr(2);
3489 RemoveOption = llvm::StringSwitch<bool>(Option)
3490 .Case("altivec", true)
3491 .Case("modules", true)
3492 .Case("diagnostics-show-note-include-stack", true)
3493 .Default(false);
3494 }
3495
Chad Rosier80717972011-08-26 18:30:43 +00003496 // Handle machine specific options.
3497 if (Option.startswith("-m")) {
3498 RemoveOption = llvm::StringSwitch<bool>(Option)
3499 .Case("-mthumb", true)
3500 .Case("-mno-thumb", true)
3501 .Case("-mno-fused-madd", true)
3502 .Case("-mlong-branch", true)
3503 .Case("-mlongcall", true)
3504 .Case("-mcpu=G4", true)
3505 .Case("-mcpu=G5", true)
3506 .Default(false);
3507 }
3508
3509 // Handle warning options.
3510 if (Option.startswith("-W")) {
3511 // Remove -W/-Wno- to reduce the number of cases.
3512 if (Option.startswith("-Wno-"))
3513 Option = Option.substr(5);
3514 else
3515 Option = Option.substr(2);
3516
3517 RemoveOption = llvm::StringSwitch<bool>(Option)
3518 .Case("address-of-temporary", true)
3519 .Case("ambiguous-member-template", true)
3520 .Case("analyzer-incompatible-plugin", true)
3521 .Case("array-bounds", true)
3522 .Case("array-bounds-pointer-arithmetic", true)
3523 .Case("bind-to-temporary-copy", true)
3524 .Case("bitwise-op-parentheses", true)
3525 .Case("bool-conversions", true)
3526 .Case("builtin-macro-redefined", true)
3527 .Case("c++-hex-floats", true)
3528 .Case("c++0x-compat", true)
3529 .Case("c++0x-extensions", true)
3530 .Case("c++0x-narrowing", true)
Richard Smith575fdda2011-10-13 23:32:09 +00003531 .Case("c++11-compat", true)
3532 .Case("c++11-extensions", true)
3533 .Case("c++11-narrowing", true)
Chad Rosier80717972011-08-26 18:30:43 +00003534 .Case("conditional-uninitialized", true)
3535 .Case("constant-conversion", true)
David Blaikie95187bd2012-03-15 04:50:32 +00003536 .Case("conversion-null", true)
Chad Rosier80717972011-08-26 18:30:43 +00003537 .Case("CFString-literal", true)
3538 .Case("constant-logical-operand", true)
3539 .Case("custom-atomic-properties", true)
3540 .Case("default-arg-special-member", true)
3541 .Case("delegating-ctor-cycles", true)
3542 .Case("delete-non-virtual-dtor", true)
3543 .Case("deprecated-implementations", true)
3544 .Case("deprecated-writable-strings", true)
3545 .Case("distributed-object-modifiers", true)
3546 .Case("duplicate-method-arg", true)
3547 .Case("dynamic-class-memaccess", true)
3548 .Case("enum-compare", true)
3549 .Case("exit-time-destructors", true)
3550 .Case("gnu", true)
3551 .Case("gnu-designator", true)
3552 .Case("header-hygiene", true)
3553 .Case("idiomatic-parentheses", true)
3554 .Case("ignored-qualifiers", true)
3555 .Case("implicit-atomic-properties", true)
3556 .Case("incompatible-pointer-types", true)
3557 .Case("incomplete-implementation", true)
3558 .Case("initializer-overrides", true)
3559 .Case("invalid-noreturn", true)
3560 .Case("invalid-token-paste", true)
Ivan Krasin08f35a72011-10-06 02:46:34 +00003561 .Case("language-extension-token", true)
Chad Rosier80717972011-08-26 18:30:43 +00003562 .Case("literal-conversion", true)
3563 .Case("literal-range", true)
3564 .Case("local-type-template-args", true)
3565 .Case("logical-op-parentheses", true)
3566 .Case("method-signatures", true)
3567 .Case("microsoft", true)
3568 .Case("mismatched-tags", true)
3569 .Case("missing-method-return-type", true)
3570 .Case("non-pod-varargs", true)
3571 .Case("nonfragile-abi2", true)
3572 .Case("null-arithmetic", true)
3573 .Case("null-dereference", true)
3574 .Case("out-of-line-declaration", true)
3575 .Case("overriding-method-mismatch", true)
3576 .Case("readonly-setter-attrs", true)
3577 .Case("return-stack-address", true)
3578 .Case("self-assign", true)
3579 .Case("semicolon-before-method-body", true)
3580 .Case("sentinel", true)
3581 .Case("shift-overflow", true)
3582 .Case("shift-sign-overflow", true)
3583 .Case("sign-conversion", true)
3584 .Case("sizeof-array-argument", true)
3585 .Case("sizeof-pointer-memaccess", true)
3586 .Case("string-compare", true)
3587 .Case("super-class-method-mismatch", true)
3588 .Case("tautological-compare", true)
3589 .Case("typedef-redefinition", true)
3590 .Case("typename-missing", true)
3591 .Case("undefined-reinterpret-cast", true)
3592 .Case("unknown-warning-option", true)
3593 .Case("unnamed-type-template-args", true)
3594 .Case("unneeded-internal-declaration", true)
3595 .Case("unneeded-member-function", true)
3596 .Case("unused-comparison", true)
3597 .Case("unused-exception-parameter", true)
3598 .Case("unused-member-function", true)
3599 .Case("unused-result", true)
3600 .Case("vector-conversions", true)
3601 .Case("vla", true)
3602 .Case("used-but-marked-unused", true)
3603 .Case("weak-vtables", true)
3604 .Default(false);
3605 } // if (Option.startswith("-W"))
Chad Rosier04225c12011-08-18 01:18:28 +00003606 if (RemoveOption) {
Chad Rosier285f9a22011-08-17 18:24:55 +00003607 it = CmdArgs.erase(it);
Chad Rosiercc0de8c2011-08-17 18:51:56 +00003608 ie = CmdArgs.end();
Chad Rosier30601782011-08-17 23:08:45 +00003609 } else {
Chad Rosier285f9a22011-08-17 18:24:55 +00003610 ++it;
Chad Rosier30601782011-08-17 23:08:45 +00003611 }
Chad Rosier285f9a22011-08-17 18:24:55 +00003612 }
3613}
3614
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003615void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003616 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003617 const Driver &D = getToolChain().getDriver();
Daniel Dunbare2fd6642009-09-10 01:21:12 +00003618
3619 CheckCodeGenerationOptions(D, Args);
3620
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003621 // Derived from cc1 spec.
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003622 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3623 !Args.hasArg(options::OPT_mdynamic_no_pic))
3624 CmdArgs.push_back("-fPIC");
3625
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003626 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3627 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3628 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3629 CmdArgs.push_back("-fno-builtin-strcat");
3630 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3631 CmdArgs.push_back("-fno-builtin-strcpy");
3632 }
3633
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003634 if (Args.hasArg(options::OPT_g_Flag) &&
3635 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3636 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3637}
3638
3639void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3640 const InputInfoList &Inputs,
3641 const ArgStringList &OutputArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003642 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003643
3644 // Derived from cc1_options spec.
3645 if (Args.hasArg(options::OPT_fast) ||
3646 Args.hasArg(options::OPT_fastf) ||
3647 Args.hasArg(options::OPT_fastcp))
3648 CmdArgs.push_back("-O3");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003649
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003650 if (Arg *A = Args.getLastArg(options::OPT_pg))
3651 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003652 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003653 << A->getAsString(Args) << "-fomit-frame-pointer";
3654
3655 AddCC1Args(Args, CmdArgs);
3656
3657 if (!Args.hasArg(options::OPT_Q))
3658 CmdArgs.push_back("-quiet");
3659
3660 CmdArgs.push_back("-dumpbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003661 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003662
3663 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3664
3665 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3666 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3667
3668 // FIXME: The goal is to use the user provided -o if that is our
3669 // final output, otherwise to drive from the original input
3670 // name. Find a clean way to go about this.
3671 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3672 Args.hasArg(options::OPT_o)) {
3673 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3674 CmdArgs.push_back("-auxbase-strip");
3675 CmdArgs.push_back(OutputOpt->getValue(Args));
3676 } else {
3677 CmdArgs.push_back("-auxbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003678 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003679 }
3680
3681 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3682
3683 Args.AddAllArgs(CmdArgs, options::OPT_O);
3684 // FIXME: -Wall is getting some special treatment. Investigate.
3685 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3686 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003687 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003688 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003689 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3690 // Honor -std-default.
3691 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3692 "-std=", /*Joined=*/true);
3693 }
3694
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003695 if (Args.hasArg(options::OPT_v))
3696 CmdArgs.push_back("-version");
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00003697 if (Args.hasArg(options::OPT_pg) &&
3698 getToolChain().SupportsProfiling())
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003699 CmdArgs.push_back("-p");
3700 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003701
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003702 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003703 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3704 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3705 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3706 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3707 //
3708 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003709 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3710 options::OPT_fsyntax_only),
3711 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003712 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3713 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3714 (*it)->claim();
3715 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003716 }
3717 }
3718 } else
3719 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003720
Daniel Dunbar089f8722011-04-07 20:41:03 +00003721 // Claim Clang only -f options, they aren't worth warning about.
3722 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3723
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003724 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3725 if (Args.hasArg(options::OPT_Qn))
3726 CmdArgs.push_back("-fno-ident");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003727
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003728 // FIXME: This isn't correct.
3729 //Args.AddLastArg(CmdArgs, options::OPT__help)
3730 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3731
3732 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3733
3734 // FIXME: Still don't get what is happening here. Investigate.
3735 Args.AddAllArgs(CmdArgs, options::OPT__param);
3736
3737 if (Args.hasArg(options::OPT_fmudflap) ||
3738 Args.hasArg(options::OPT_fmudflapth)) {
3739 CmdArgs.push_back("-fno-builtin");
3740 CmdArgs.push_back("-fno-merge-constants");
3741 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003742
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003743 if (Args.hasArg(options::OPT_coverage)) {
3744 CmdArgs.push_back("-fprofile-arcs");
3745 CmdArgs.push_back("-ftest-coverage");
3746 }
3747
3748 if (types::isCXX(Inputs[0].getType()))
3749 CmdArgs.push_back("-D__private_extern__=extern");
3750}
3751
3752void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3753 const InputInfoList &Inputs,
3754 const ArgStringList &OutputArgs) const {
3755 // Derived from cpp_options
3756 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003757
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003758 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3759
3760 AddCC1Args(Args, CmdArgs);
3761
3762 // NOTE: The code below has some commonality with cpp_options, but
3763 // in classic gcc style ends up sending things in different
3764 // orders. This may be a good merge candidate once we drop pedantic
3765 // compatibility.
3766
3767 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003768 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003769 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003770 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3771 // Honor -std-default.
3772 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3773 "-std=", /*Joined=*/true);
3774 }
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003775 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3776 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003777
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003778 // The driver treats -fsyntax-only specially.
3779 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3780
Daniel Dunbar089f8722011-04-07 20:41:03 +00003781 // Claim Clang only -f options, they aren't worth warning about.
3782 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3783
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003784 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3785 !Args.hasArg(options::OPT_fno_working_directory))
3786 CmdArgs.push_back("-fworking-directory");
3787
3788 Args.AddAllArgs(CmdArgs, options::OPT_O);
3789 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3790 if (Args.hasArg(options::OPT_save_temps))
3791 CmdArgs.push_back("-fpch-preprocess");
3792}
3793
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003794void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003795 ArgStringList &CmdArgs,
Mike Stump1eb44332009-09-09 15:08:12 +00003796 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003797 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003798
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003799 CheckPreprocessingOptions(D, Args);
3800
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003801 // Derived from cpp_unique_options.
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003802 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3803 Args.AddLastArg(CmdArgs, options::OPT_C);
3804 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003805 if (!Args.hasArg(options::OPT_Q))
3806 CmdArgs.push_back("-quiet");
3807 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor4c2bcad2010-03-24 20:13:48 +00003808 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003809 Args.AddLastArg(CmdArgs, options::OPT_v);
3810 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3811 Args.AddLastArg(CmdArgs, options::OPT_P);
3812
3813 // FIXME: Handle %I properly.
3814 if (getToolChain().getArchName() == "x86_64") {
3815 CmdArgs.push_back("-imultilib");
3816 CmdArgs.push_back("x86_64");
3817 }
3818
3819 if (Args.hasArg(options::OPT_MD)) {
3820 CmdArgs.push_back("-MD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003821 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003822 }
3823
3824 if (Args.hasArg(options::OPT_MMD)) {
3825 CmdArgs.push_back("-MMD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003826 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003827 }
3828
3829 Args.AddLastArg(CmdArgs, options::OPT_M);
3830 Args.AddLastArg(CmdArgs, options::OPT_MM);
3831 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3832 Args.AddLastArg(CmdArgs, options::OPT_MG);
3833 Args.AddLastArg(CmdArgs, options::OPT_MP);
3834 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3835 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3836 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3837 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3838 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3839 CmdArgs.push_back("-MQ");
3840 CmdArgs.push_back(OutputOpt->getValue(Args));
3841 }
3842 }
3843
3844 Args.AddLastArg(CmdArgs, options::OPT_remap);
3845 if (Args.hasArg(options::OPT_g3))
3846 CmdArgs.push_back("-dD");
3847 Args.AddLastArg(CmdArgs, options::OPT_H);
3848
3849 AddCPPArgs(Args, CmdArgs);
3850
3851 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3852 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3853
3854 for (InputInfoList::const_iterator
3855 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3856 const InputInfo &II = *it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003857
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003858 CmdArgs.push_back(II.getFilename());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003859 }
3860
3861 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3862 options::OPT_Xpreprocessor);
3863
3864 if (Args.hasArg(options::OPT_fmudflap)) {
3865 CmdArgs.push_back("-D_MUDFLAP");
3866 CmdArgs.push_back("-include");
3867 CmdArgs.push_back("mf-runtime.h");
3868 }
3869
3870 if (Args.hasArg(options::OPT_fmudflapth)) {
3871 CmdArgs.push_back("-D_MUDFLAP");
3872 CmdArgs.push_back("-D_MUDFLAPTH");
3873 CmdArgs.push_back("-include");
3874 CmdArgs.push_back("mf-runtime.h");
3875 }
3876}
3877
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003878void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003879 ArgStringList &CmdArgs) const {
3880 // Derived from cpp spec.
3881
3882 if (Args.hasArg(options::OPT_static)) {
3883 // The gcc spec is broken here, it refers to dynamic but
3884 // that has been translated. Start by being bug compatible.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003885
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003886 // if (!Args.hasArg(arglist.parser.dynamicOption))
3887 CmdArgs.push_back("-D__STATIC__");
3888 } else
3889 CmdArgs.push_back("-D__DYNAMIC__");
3890
3891 if (Args.hasArg(options::OPT_pthread))
3892 CmdArgs.push_back("-D_REENTRANT");
3893}
3894
Daniel Dunbar40f12652009-03-29 17:08:39 +00003895void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003896 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003897 const InputInfoList &Inputs,
3898 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00003899 const char *LinkingOutput) const {
3900 ArgStringList CmdArgs;
3901
3902 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3903
3904 CmdArgs.push_back("-E");
3905
3906 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbar40f12652009-03-29 17:08:39 +00003907 Args.hasArg(options::OPT_traditional_cpp))
3908 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003909
Daniel Dunbar40f12652009-03-29 17:08:39 +00003910 ArgStringList OutputArgs;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003911 assert(Output.isFilename() && "Unexpected CC1 output.");
3912 OutputArgs.push_back("-o");
3913 OutputArgs.push_back(Output.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00003914
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +00003915 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbar9120f172009-03-29 22:27:40 +00003916 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3917 } else {
3918 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3919 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3920 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003921
Daniel Dunbar8a2073a2009-04-03 01:27:06 +00003922 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3923
Chad Rosier4fe4d732011-09-08 00:38:00 +00003924 RemoveCC1UnsupportedArgs(CmdArgs);
3925
Daniel Dunbar40f12652009-03-29 17:08:39 +00003926 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003927 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003928 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003929 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00003930}
3931
3932void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003933 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003934 const InputInfoList &Inputs,
3935 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00003936 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003937 const Driver &D = getToolChain().getDriver();
Daniel Dunbar40f12652009-03-29 17:08:39 +00003938 ArgStringList CmdArgs;
3939
3940 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3941
Bob Wilson651f3d42012-04-01 23:03:29 +00003942 // Silence warning about unused --serialize-diagnostics
3943 Args.ClaimAllArgs(options::OPT__serialize_diags);
3944
Daniel Dunbar40f12652009-03-29 17:08:39 +00003945 types::ID InputType = Inputs[0].getType();
David Blaikied624a5b2012-04-04 20:43:14 +00003946 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003947 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar40f12652009-03-29 17:08:39 +00003948 << A->getAsString(Args) << "-E";
3949
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003950 if (JA.getType() == types::TY_LLVM_IR ||
3951 JA.getType() == types::TY_LTO_IR)
Daniel Dunbar40f12652009-03-29 17:08:39 +00003952 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003953 else if (JA.getType() == types::TY_LLVM_BC ||
3954 JA.getType() == types::TY_LTO_BC)
Daniel Dunbar40f12652009-03-29 17:08:39 +00003955 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003956 else if (Output.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003957 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003958 << getToolChain().getTripleString();
Daniel Dunbarae24a882010-02-11 17:33:45 +00003959 else if (JA.getType() != types::TY_PP_Asm &&
3960 JA.getType() != types::TY_PCH)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003961 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003962 << getTypeName(JA.getType());
Daniel Dunbar40f12652009-03-29 17:08:39 +00003963
3964 ArgStringList OutputArgs;
3965 if (Output.getType() != types::TY_PCH) {
3966 OutputArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003967 if (Output.isNothing())
Daniel Dunbar40f12652009-03-29 17:08:39 +00003968 OutputArgs.push_back("/dev/null");
3969 else
3970 OutputArgs.push_back(Output.getFilename());
3971 }
3972
3973 // There is no need for this level of compatibility, but it makes
3974 // diffing easier.
3975 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3976 Args.hasArg(options::OPT_S));
3977
3978 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003979 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbar40f12652009-03-29 17:08:39 +00003980 if (OutputArgsEarly) {
3981 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3982 } else {
3983 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3984 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3985 }
3986 } else {
3987 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003988
Daniel Dunbar40f12652009-03-29 17:08:39 +00003989 for (InputInfoList::const_iterator
3990 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3991 const InputInfo &II = *it;
3992
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003993 // Reject AST inputs.
3994 if (II.getType() == types::TY_AST) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003995 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003996 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003997 return;
3998 }
3999
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004000 CmdArgs.push_back(II.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004001 }
4002
4003 if (OutputArgsEarly) {
4004 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4005 } else {
4006 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4007 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4008 }
4009 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004010
Daniel Dunbar40f12652009-03-29 17:08:39 +00004011 if (Output.getType() == types::TY_PCH) {
4012 assert(Output.isFilename() && "Invalid PCH output.");
4013
4014 CmdArgs.push_back("-o");
4015 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4016 // to be a good reason.
Chad Rosier8c221b82011-08-01 19:58:48 +00004017 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004018 D.GetTemporaryPath("cc", "s"));
Chad Rosier8c221b82011-08-01 19:58:48 +00004019 C.addTempFile(TmpPath);
4020 CmdArgs.push_back(TmpPath);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004021
Eric Christopher88b7cf02011-08-19 00:30:14 +00004022 // If we're emitting a pch file with the last 4 characters of ".pth"
4023 // and falling back to llvm-gcc we want to use ".gch" instead.
4024 std::string OutputFile(Output.getFilename());
4025 size_t loc = OutputFile.rfind(".pth");
4026 if (loc != std::string::npos)
4027 OutputFile.replace(loc, 4, ".gch");
4028 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4029 CmdArgs.push_back(Tmp);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004030 }
Daniel Dunbar40f12652009-03-29 17:08:39 +00004031
Chad Rosier285f9a22011-08-17 18:24:55 +00004032 RemoveCC1UnsupportedArgs(CmdArgs);
4033
Daniel Dunbar40f12652009-03-29 17:08:39 +00004034 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004035 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004036 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004037 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00004038}
4039
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004040void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004041 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004042 const InputInfoList &Inputs,
4043 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004044 const char *LinkingOutput) const {
4045 ArgStringList CmdArgs;
4046
4047 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4048 const InputInfo &Input = Inputs[0];
4049
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004050 // Determine the original source input.
4051 const Action *SourceAction = &JA;
4052 while (SourceAction->getKind() != Action::InputClass) {
4053 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4054 SourceAction = SourceAction->getInputs()[0];
4055 }
4056
4057 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004058 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004059 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004060 if (Args.hasArg(options::OPT_gstabs))
4061 CmdArgs.push_back("--gstabs");
4062 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004063 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004064 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004065
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004066 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004067 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004068
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004069 // Use -force_cpusubtype_ALL on x86 by default.
4070 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4071 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004072 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4073 CmdArgs.push_back("-force_cpusubtype_ALL");
4074
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004075 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4076 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004077 Args.hasArg(options::OPT_static) ||
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004078 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004079 CmdArgs.push_back("-static");
4080
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004081 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4082 options::OPT_Xassembler);
4083
4084 assert(Output.isFilename() && "Unexpected lipo output.");
4085 CmdArgs.push_back("-o");
4086 CmdArgs.push_back(Output.getFilename());
4087
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004088 assert(Input.isFilename() && "Invalid input.");
4089 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004090
4091 // asm_final spec is empty.
4092
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004093 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004094 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004095 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004096}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004097
David Blaikie99ba9e32011-12-20 02:48:34 +00004098void darwin::DarwinTool::anchor() {}
4099
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004100void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4101 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004102 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004103
Daniel Dunbar02633b52009-03-26 16:23:12 +00004104 // Derived from darwin_arch spec.
4105 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004106 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004107
Daniel Dunbareeff4062010-01-22 02:04:58 +00004108 // FIXME: Is this needed anymore?
4109 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004110 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004111}
4112
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004113void darwin::Link::AddLinkArgs(Compilation &C,
4114 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004115 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004116 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004117 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004118
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004119 unsigned Version[3] = { 0, 0, 0 };
4120 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4121 bool HadExtra;
4122 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4123 Version[1], Version[2], HadExtra) ||
4124 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004125 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004126 << A->getAsString(Args);
4127 }
4128
4129 // Newer linkers support -demangle, pass it if supported and not disabled by
4130 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004131 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004132 // Don't pass -demangle to ld_classic.
4133 //
4134 // FIXME: This is a temporary workaround, ld should be handling this.
4135 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4136 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004137 if (getToolChain().getArch() == llvm::Triple::x86) {
4138 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4139 options::OPT_Wl_COMMA),
4140 ie = Args.filtered_end(); it != ie; ++it) {
4141 const Arg *A = *it;
4142 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004143 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004144 UsesLdClassic = true;
4145 }
4146 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004147 if (!UsesLdClassic)
4148 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004149 }
4150
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004151 // If we are using LTO, then automatically create a temporary file path for
4152 // the linker to use, so that it's lifetime will extend past a possible
4153 // dsymutil step.
Daniel Dunbara68e1c32011-06-21 21:18:32 +00004154 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004155 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004156 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004157 C.addTempFile(TmpPath);
4158 CmdArgs.push_back("-object_path_lto");
4159 CmdArgs.push_back(TmpPath);
4160 }
4161
Daniel Dunbar02633b52009-03-26 16:23:12 +00004162 // Derived from the "link" spec.
4163 Args.AddAllArgs(CmdArgs, options::OPT_static);
4164 if (!Args.hasArg(options::OPT_static))
4165 CmdArgs.push_back("-dynamic");
4166 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4167 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4168 // here. How do we wish to handle such things?
4169 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004170
Daniel Dunbar02633b52009-03-26 16:23:12 +00004171 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004172 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004173 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004174 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004175
4176 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4177 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4178 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4179
4180 Arg *A;
4181 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4182 (A = Args.getLastArg(options::OPT_current__version)) ||
4183 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004184 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004185 << A->getAsString(Args) << "-dynamiclib";
4186
4187 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4188 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4189 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4190 } else {
4191 CmdArgs.push_back("-dylib");
4192
4193 Arg *A;
4194 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4195 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4196 (A = Args.getLastArg(options::OPT_client__name)) ||
4197 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4198 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4199 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004200 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004201 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004202
Daniel Dunbar02633b52009-03-26 16:23:12 +00004203 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4204 "-dylib_compatibility_version");
4205 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4206 "-dylib_current_version");
4207
Daniel Dunbara6d38492010-01-22 02:04:52 +00004208 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004209
4210 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4211 "-dylib_install_name");
4212 }
4213
4214 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4215 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4216 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004217 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004218 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004219 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4220 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4221 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4222 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4223 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4224 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004225 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004226 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4227 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4228 Args.AddAllArgs(CmdArgs, options::OPT_init);
4229
Daniel Dunbarce911f52011-04-28 21:23:41 +00004230 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004231 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004232
4233 // If we had an explicit -mios-simulator-version-min argument, honor that,
4234 // otherwise use the traditional deployment targets. We can't just check the
4235 // is-sim attribute because existing code follows this path, and the linker
4236 // may not handle the argument.
4237 //
4238 // FIXME: We may be able to remove this, once we can verify no one depends on
4239 // it.
4240 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4241 CmdArgs.push_back("-ios_simulator_version_min");
4242 else if (DarwinTC.isTargetIPhoneOS())
4243 CmdArgs.push_back("-iphoneos_version_min");
4244 else
4245 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004246 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004247
Daniel Dunbar02633b52009-03-26 16:23:12 +00004248 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4249 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4250 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4251 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4252 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004253
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004254 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4255 options::OPT_fno_pie,
4256 options::OPT_fno_PIE)) {
4257 if (A->getOption().matches(options::OPT_fpie) ||
4258 A->getOption().matches(options::OPT_fPIE))
4259 CmdArgs.push_back("-pie");
4260 else
4261 CmdArgs.push_back("-no_pie");
4262 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004263
4264 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4265 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4266 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4267 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4268 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4269 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4270 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4271 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4272 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4273 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4274 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4275 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4276 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4277 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4278 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4279 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004280
Daniel Dunbarcc957192011-05-02 21:03:47 +00004281 // Give --sysroot= preference, over the Apple specific behavior to also use
4282 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004283 StringRef sysroot = C.getSysRoot();
4284 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004285 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004286 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004287 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4288 CmdArgs.push_back("-syslibroot");
4289 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004290 }
4291
Daniel Dunbar02633b52009-03-26 16:23:12 +00004292 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4293 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4294 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4295 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4296 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004297 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004298 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4299 Args.AddAllArgs(CmdArgs, options::OPT_y);
4300 Args.AddLastArg(CmdArgs, options::OPT_w);
4301 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4302 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4303 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4304 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4305 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4306 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4307 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4308 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4309 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4310 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4311 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4312 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4313}
4314
4315void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004316 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004317 const InputInfoList &Inputs,
4318 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004319 const char *LinkingOutput) const {
4320 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004321
Daniel Dunbar02633b52009-03-26 16:23:12 +00004322 // The logic here is derived from gcc's behavior; most of which
4323 // comes from specs (starting with link_command). Consult gcc for
4324 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004325 ArgStringList CmdArgs;
4326
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004327 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4328 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4329 options::OPT_ccc_arcmt_migrate)) {
4330 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4331 (*I)->claim();
4332 const char *Exec =
4333 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4334 CmdArgs.push_back(Output.getFilename());
4335 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4336 return;
4337 }
4338
Daniel Dunbar02633b52009-03-26 16:23:12 +00004339 // I'm not sure why this particular decomposition exists in gcc, but
4340 // we follow suite for ease of comparison.
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004341 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004342
Daniel Dunbar02633b52009-03-26 16:23:12 +00004343 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4344 Args.AddAllArgs(CmdArgs, options::OPT_s);
4345 Args.AddAllArgs(CmdArgs, options::OPT_t);
4346 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4347 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004348 Args.AddLastArg(CmdArgs, options::OPT_e);
4349 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4350 Args.AddAllArgs(CmdArgs, options::OPT_r);
4351
Daniel Dunbar270073c2010-10-18 22:08:36 +00004352 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4353 // members of static archive libraries which implement Objective-C classes or
4354 // categories.
4355 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4356 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004357
Daniel Dunbar02633b52009-03-26 16:23:12 +00004358 CmdArgs.push_back("-o");
4359 CmdArgs.push_back(Output.getFilename());
4360
Chad Rosier18937312012-05-16 23:45:12 +00004361 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004362 !Args.hasArg(options::OPT_nostartfiles)) {
4363 // Derived from startfile spec.
4364 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004365 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004366 if (getDarwinToolChain().isTargetIOSSimulator()) {
4367 // The simulator doesn't have a versioned crt1 file.
4368 CmdArgs.push_back("-ldylib1.o");
4369 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004370 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4371 CmdArgs.push_back("-ldylib1.o");
4372 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004373 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004374 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004375 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004376 CmdArgs.push_back("-ldylib1.10.5.o");
4377 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004378 } else {
4379 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004380 if (!Args.hasArg(options::OPT_static)) {
4381 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004382 if (getDarwinToolChain().isTargetIOSSimulator()) {
4383 // The simulator doesn't have a versioned crt1 file.
4384 CmdArgs.push_back("-lbundle1.o");
4385 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004386 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4387 CmdArgs.push_back("-lbundle1.o");
4388 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004389 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004390 CmdArgs.push_back("-lbundle1.o");
4391 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004392 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004393 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004394 if (Args.hasArg(options::OPT_pg) &&
4395 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004396 if (Args.hasArg(options::OPT_static) ||
4397 Args.hasArg(options::OPT_object) ||
4398 Args.hasArg(options::OPT_preload)) {
4399 CmdArgs.push_back("-lgcrt0.o");
4400 } else {
4401 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004402
Daniel Dunbar02633b52009-03-26 16:23:12 +00004403 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004404 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004405 // By default on OS X 10.8 and later, we don't link with a crt1.o
4406 // file and the linker knows to use _main as the entry point. But,
4407 // when compiling with -pg, we need to link with the gcrt1.o file,
4408 // so pass the -no_new_main option to tell the linker to use the
4409 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004410 if (getDarwinToolChain().isTargetMacOS() &&
4411 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4412 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004413 } else {
4414 if (Args.hasArg(options::OPT_static) ||
4415 Args.hasArg(options::OPT_object) ||
4416 Args.hasArg(options::OPT_preload)) {
4417 CmdArgs.push_back("-lcrt0.o");
4418 } else {
4419 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004420 if (getDarwinToolChain().isTargetIOSSimulator()) {
4421 // The simulator doesn't have a versioned crt1 file.
4422 CmdArgs.push_back("-lcrt1.o");
4423 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004424 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4425 CmdArgs.push_back("-lcrt1.o");
4426 else
4427 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004428 } else {
4429 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4430 CmdArgs.push_back("-lcrt1.o");
4431 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4432 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004433 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004434 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004435
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004436 // darwin_crt2 spec is empty.
4437 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004438 }
4439 }
4440 }
4441 }
4442
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004443 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4444 Args.hasArg(options::OPT_shared_libgcc) &&
4445 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004446 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004447 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004448 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004449 }
4450 }
4451
4452 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004453
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004454 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4455 // symbols may appear. Mark all of them as dynamic_lookup.
4456 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4457 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4458 options::OPT_fno_address_sanitizer, false)) {
4459 if (Args.hasArg(options::OPT_dynamiclib) ||
4460 Args.hasArg(options::OPT_bundle)) {
4461 CmdArgs.push_back("-undefined");
4462 CmdArgs.push_back("dynamic_lookup");
4463 }
4464 }
4465
Daniel Dunbar02633b52009-03-26 16:23:12 +00004466 if (Args.hasArg(options::OPT_fopenmp))
4467 // This is more complicated in gcc...
4468 CmdArgs.push_back("-lgomp");
4469
Douglas Gregor04e326b2012-05-15 21:00:27 +00004470 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4471
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004472 if (isObjCRuntimeLinked(Args) &&
4473 !Args.hasArg(options::OPT_nostdlib) &&
4474 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004475 // Avoid linking compatibility stubs on i386 mac.
4476 if (!getDarwinToolChain().isTargetMacOS() ||
4477 getDarwinToolChain().getArchName() != "i386") {
4478 // If we don't have ARC or subscripting runtime support, link in the
4479 // runtime stubs. We have to do this *before* adding any of the normal
4480 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004481 ObjCRuntime runtime =
4482 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004483 // We use arclite library for both ARC and subscripting support.
John McCall260611a2012-06-20 06:18:46 +00004484 if ((!runtime.hasARC() && isObjCAutoRefCount(Args)) ||
4485 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004486 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004487 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004488 CmdArgs.push_back("-framework");
4489 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004490 // Link libobj.
4491 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004492 }
John McCallf85e1932011-06-15 23:02:42 +00004493
Daniel Dunbar02633b52009-03-26 16:23:12 +00004494 if (LinkingOutput) {
4495 CmdArgs.push_back("-arch_multiple");
4496 CmdArgs.push_back("-final_output");
4497 CmdArgs.push_back(LinkingOutput);
4498 }
4499
Daniel Dunbar02633b52009-03-26 16:23:12 +00004500 if (Args.hasArg(options::OPT_fnested_functions))
4501 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004502
Daniel Dunbar02633b52009-03-26 16:23:12 +00004503 if (!Args.hasArg(options::OPT_nostdlib) &&
4504 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004505 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004506 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004507
Daniel Dunbar02633b52009-03-26 16:23:12 +00004508 // link_ssp spec is empty.
4509
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004510 // Let the tool chain choose which runtime library to link.
4511 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004512 }
4513
Chad Rosier18937312012-05-16 23:45:12 +00004514 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004515 !Args.hasArg(options::OPT_nostartfiles)) {
4516 // endfile_spec is empty.
4517 }
4518
4519 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4520 Args.AddAllArgs(CmdArgs, options::OPT_F);
4521
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004522 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004523 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004524 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004525}
4526
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004527void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004528 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004529 const InputInfoList &Inputs,
4530 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004531 const char *LinkingOutput) const {
4532 ArgStringList CmdArgs;
4533
4534 CmdArgs.push_back("-create");
4535 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004536
4537 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004538 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004539
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004540 for (InputInfoList::const_iterator
4541 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4542 const InputInfo &II = *it;
4543 assert(II.isFilename() && "Unexpected lipo input.");
4544 CmdArgs.push_back(II.getFilename());
4545 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004546 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004547 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004548 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004549}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004550
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004551void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004552 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004553 const InputInfoList &Inputs,
4554 const ArgList &Args,
4555 const char *LinkingOutput) const {
4556 ArgStringList CmdArgs;
4557
Daniel Dunbar03e92302011-05-09 17:23:16 +00004558 CmdArgs.push_back("-o");
4559 CmdArgs.push_back(Output.getFilename());
4560
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004561 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4562 const InputInfo &Input = Inputs[0];
4563 assert(Input.isFilename() && "Unexpected dsymutil input.");
4564 CmdArgs.push_back(Input.getFilename());
4565
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004566 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004567 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004568 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004569}
4570
Eric Christopherf8571862011-08-23 17:56:55 +00004571void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4572 const InputInfo &Output,
4573 const InputInfoList &Inputs,
4574 const ArgList &Args,
4575 const char *LinkingOutput) const {
4576 ArgStringList CmdArgs;
4577 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004578 CmdArgs.push_back("--debug-info");
4579 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004580 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004581
4582 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4583 const InputInfo &Input = Inputs[0];
4584 assert(Input.isFilename() && "Unexpected verify input");
4585
4586 // Grabbing the output of the earlier dsymutil run.
4587 CmdArgs.push_back(Input.getFilename());
4588
4589 const char *Exec =
4590 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4591 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4592}
4593
David Chisnall31c46902012-02-15 13:39:01 +00004594void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4595 const InputInfo &Output,
4596 const InputInfoList &Inputs,
4597 const ArgList &Args,
4598 const char *LinkingOutput) const {
4599 ArgStringList CmdArgs;
4600
4601 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4602 options::OPT_Xassembler);
4603
4604 CmdArgs.push_back("-o");
4605 CmdArgs.push_back(Output.getFilename());
4606
4607 for (InputInfoList::const_iterator
4608 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4609 const InputInfo &II = *it;
4610 CmdArgs.push_back(II.getFilename());
4611 }
4612
4613 const char *Exec =
4614 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4615 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4616}
4617
4618
4619void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4620 const InputInfo &Output,
4621 const InputInfoList &Inputs,
4622 const ArgList &Args,
4623 const char *LinkingOutput) const {
4624 // FIXME: Find a real GCC, don't hard-code versions here
4625 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4626 const llvm::Triple &T = getToolChain().getTriple();
4627 std::string LibPath = "/usr/lib/";
4628 llvm::Triple::ArchType Arch = T.getArch();
4629 switch (Arch) {
4630 case llvm::Triple::x86:
4631 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4632 T.getOSName()).str() + "/4.5.2/";
4633 break;
4634 case llvm::Triple::x86_64:
4635 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4636 T.getOSName()).str();
4637 GCCLibPath += "/4.5.2/amd64/";
4638 LibPath += "amd64/";
4639 break;
4640 default:
4641 assert(0 && "Unsupported architecture");
4642 }
4643
4644 ArgStringList CmdArgs;
4645
David Chisnall41d476d2012-02-29 15:06:12 +00004646 // Demangle C++ names in errors
4647 CmdArgs.push_back("-C");
4648
David Chisnall31c46902012-02-15 13:39:01 +00004649 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4650 (!Args.hasArg(options::OPT_shared))) {
4651 CmdArgs.push_back("-e");
4652 CmdArgs.push_back("_start");
4653 }
4654
4655 if (Args.hasArg(options::OPT_static)) {
4656 CmdArgs.push_back("-Bstatic");
4657 CmdArgs.push_back("-dn");
4658 } else {
4659 CmdArgs.push_back("-Bdynamic");
4660 if (Args.hasArg(options::OPT_shared)) {
4661 CmdArgs.push_back("-shared");
4662 } else {
4663 CmdArgs.push_back("--dynamic-linker");
4664 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4665 }
4666 }
4667
4668 if (Output.isFilename()) {
4669 CmdArgs.push_back("-o");
4670 CmdArgs.push_back(Output.getFilename());
4671 } else {
4672 assert(Output.isNothing() && "Invalid output.");
4673 }
4674
4675 if (!Args.hasArg(options::OPT_nostdlib) &&
4676 !Args.hasArg(options::OPT_nostartfiles)) {
4677 if (!Args.hasArg(options::OPT_shared)) {
4678 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4679 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004680 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004681 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4682 } else {
4683 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004684 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4685 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004686 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004687 if (getToolChain().getDriver().CCCIsCXX)
4688 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004689 }
4690
4691 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4692
4693 Args.AddAllArgs(CmdArgs, options::OPT_L);
4694 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4695 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00004696 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00004697
4698 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4699
4700 if (!Args.hasArg(options::OPT_nostdlib) &&
4701 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00004702 if (getToolChain().getDriver().CCCIsCXX)
4703 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00004704 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00004705 if (!Args.hasArg(options::OPT_shared)) {
4706 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00004707 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00004708 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00004709 }
David Chisnall31c46902012-02-15 13:39:01 +00004710 }
4711
4712 if (!Args.hasArg(options::OPT_nostdlib) &&
4713 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00004714 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004715 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00004716 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004717
4718 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4719
4720 const char *Exec =
4721 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4722 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4723}
4724
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004725void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004726 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004727 const InputInfoList &Inputs,
4728 const ArgList &Args,
4729 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004730 ArgStringList CmdArgs;
4731
4732 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4733 options::OPT_Xassembler);
4734
4735 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004736 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004737
4738 for (InputInfoList::const_iterator
4739 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4740 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004741 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004742 }
4743
4744 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004745 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004746 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004747}
4748
4749void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004750 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004751 const InputInfoList &Inputs,
4752 const ArgList &Args,
4753 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004754 ArgStringList CmdArgs;
4755
4756 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004757 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004758 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004759 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004760 }
4761
4762 if (Args.hasArg(options::OPT_static)) {
4763 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004764 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004765 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004766// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004767 CmdArgs.push_back("-Bdynamic");
4768 if (Args.hasArg(options::OPT_shared)) {
4769 CmdArgs.push_back("-shared");
4770 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00004771 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004772 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4773 }
4774 }
4775
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004776 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004777 CmdArgs.push_back("-o");
4778 CmdArgs.push_back(Output.getFilename());
4779 } else {
4780 assert(Output.isNothing() && "Invalid output.");
4781 }
4782
4783 if (!Args.hasArg(options::OPT_nostdlib) &&
4784 !Args.hasArg(options::OPT_nostartfiles)) {
4785 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00004786 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004787 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004788 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004789 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004790 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004791 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004792 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004793 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004794 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004795 }
Chris Lattner38e317d2010-07-07 16:01:42 +00004796 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004797 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004798 }
4799
Daniel Dunbar294691e2009-11-04 06:24:38 +00004800 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4801 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004802 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004803
4804 Args.AddAllArgs(CmdArgs, options::OPT_L);
4805 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4806 Args.AddAllArgs(CmdArgs, options::OPT_e);
4807
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004808 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004809
4810 if (!Args.hasArg(options::OPT_nostdlib) &&
4811 !Args.hasArg(options::OPT_nodefaultlibs)) {
4812 // FIXME: For some reason GCC passes -lgcc before adding
4813 // the default system libraries. Just mimic this for now.
4814 CmdArgs.push_back("-lgcc");
4815
4816 if (Args.hasArg(options::OPT_pthread))
4817 CmdArgs.push_back("-pthread");
4818 if (!Args.hasArg(options::OPT_shared))
4819 CmdArgs.push_back("-lc");
4820 CmdArgs.push_back("-lgcc");
4821 }
4822
4823 if (!Args.hasArg(options::OPT_nostdlib) &&
4824 !Args.hasArg(options::OPT_nostartfiles)) {
4825 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004826 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004827 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004828 }
4829
Bill Wendling3f4be6f2011-06-27 19:15:03 +00004830 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00004831
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004832 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004833 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004834 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004835}
4836
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004837void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004838 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004839 const InputInfoList &Inputs,
4840 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00004841 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004842 ArgStringList CmdArgs;
4843
4844 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4845 options::OPT_Xassembler);
4846
4847 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004848 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004849
4850 for (InputInfoList::const_iterator
4851 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4852 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004853 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004854 }
4855
4856 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004857 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004858 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004859}
4860
4861void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004862 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004863 const InputInfoList &Inputs,
4864 const ArgList &Args,
4865 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004866 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004867 ArgStringList CmdArgs;
4868
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004869 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004870 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004871 CmdArgs.push_back("-e");
4872 CmdArgs.push_back("__start");
4873 }
4874
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004875 if (Args.hasArg(options::OPT_static)) {
4876 CmdArgs.push_back("-Bstatic");
4877 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00004878 if (Args.hasArg(options::OPT_rdynamic))
4879 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004880 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004881 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004882 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004883 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004884 } else {
4885 CmdArgs.push_back("-dynamic-linker");
4886 CmdArgs.push_back("/usr/libexec/ld.so");
4887 }
4888 }
4889
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004890 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004891 CmdArgs.push_back("-o");
4892 CmdArgs.push_back(Output.getFilename());
4893 } else {
4894 assert(Output.isNothing() && "Invalid output.");
4895 }
4896
4897 if (!Args.hasArg(options::OPT_nostdlib) &&
4898 !Args.hasArg(options::OPT_nostartfiles)) {
4899 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00004900 if (Args.hasArg(options::OPT_pg))
4901 CmdArgs.push_back(Args.MakeArgString(
4902 getToolChain().GetFilePath("gcrt0.o")));
4903 else
4904 CmdArgs.push_back(Args.MakeArgString(
4905 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004906 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004907 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004908 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004909 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004910 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004911 }
4912 }
4913
Edward O'Callaghane7e18202009-10-28 15:13:08 +00004914 std::string Triple = getToolChain().getTripleString();
4915 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00004916 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004917 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00004918 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004919
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004920 Args.AddAllArgs(CmdArgs, options::OPT_L);
4921 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4922 Args.AddAllArgs(CmdArgs, options::OPT_e);
4923
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004924 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004925
4926 if (!Args.hasArg(options::OPT_nostdlib) &&
4927 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00004928 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004929 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00004930 if (Args.hasArg(options::OPT_pg))
4931 CmdArgs.push_back("-lm_p");
4932 else
4933 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00004934 }
4935
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004936 // FIXME: For some reason GCC passes -lgcc before adding
4937 // the default system libraries. Just mimic this for now.
4938 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004939
4940 if (Args.hasArg(options::OPT_pthread))
Chris Lattnera2e40212011-02-21 18:36:51 +00004941 CmdArgs.push_back("-lpthread");
Chandler Carruth657849c2011-12-17 22:32:42 +00004942 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00004943 if (Args.hasArg(options::OPT_pg))
4944 CmdArgs.push_back("-lc_p");
4945 else
4946 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00004947 }
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004948 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004949 }
4950
4951 if (!Args.hasArg(options::OPT_nostdlib) &&
4952 !Args.hasArg(options::OPT_nostartfiles)) {
4953 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004954 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004955 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004956 else
Chris Lattner38e317d2010-07-07 16:01:42 +00004957 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004958 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004959 }
4960
4961 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004962 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004963 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004964}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00004965
Eli Friedman42f74f22012-08-08 23:57:20 +00004966void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4967 const InputInfo &Output,
4968 const InputInfoList &Inputs,
4969 const ArgList &Args,
4970 const char *LinkingOutput) const {
4971 ArgStringList CmdArgs;
4972
4973 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4974 options::OPT_Xassembler);
4975
4976 CmdArgs.push_back("-o");
4977 CmdArgs.push_back(Output.getFilename());
4978
4979 for (InputInfoList::const_iterator
4980 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4981 const InputInfo &II = *it;
4982 CmdArgs.push_back(II.getFilename());
4983 }
4984
4985 const char *Exec =
4986 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4987 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4988}
4989
4990void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4991 const InputInfo &Output,
4992 const InputInfoList &Inputs,
4993 const ArgList &Args,
4994 const char *LinkingOutput) const {
4995 const Driver &D = getToolChain().getDriver();
4996 ArgStringList CmdArgs;
4997
4998 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4999 (!Args.hasArg(options::OPT_shared))) {
5000 CmdArgs.push_back("-e");
5001 CmdArgs.push_back("__start");
5002 }
5003
5004 if (Args.hasArg(options::OPT_static)) {
5005 CmdArgs.push_back("-Bstatic");
5006 } else {
5007 if (Args.hasArg(options::OPT_rdynamic))
5008 CmdArgs.push_back("-export-dynamic");
5009 CmdArgs.push_back("--eh-frame-hdr");
5010 CmdArgs.push_back("-Bdynamic");
5011 if (Args.hasArg(options::OPT_shared)) {
5012 CmdArgs.push_back("-shared");
5013 } else {
5014 CmdArgs.push_back("-dynamic-linker");
5015 CmdArgs.push_back("/usr/libexec/ld.so");
5016 }
5017 }
5018
5019 if (Output.isFilename()) {
5020 CmdArgs.push_back("-o");
5021 CmdArgs.push_back(Output.getFilename());
5022 } else {
5023 assert(Output.isNothing() && "Invalid output.");
5024 }
5025
5026 if (!Args.hasArg(options::OPT_nostdlib) &&
5027 !Args.hasArg(options::OPT_nostartfiles)) {
5028 if (!Args.hasArg(options::OPT_shared)) {
5029 if (Args.hasArg(options::OPT_pg))
5030 CmdArgs.push_back(Args.MakeArgString(
5031 getToolChain().GetFilePath("gcrt0.o")));
5032 else
5033 CmdArgs.push_back(Args.MakeArgString(
5034 getToolChain().GetFilePath("crt0.o")));
5035 CmdArgs.push_back(Args.MakeArgString(
5036 getToolChain().GetFilePath("crtbegin.o")));
5037 } else {
5038 CmdArgs.push_back(Args.MakeArgString(
5039 getToolChain().GetFilePath("crtbeginS.o")));
5040 }
5041 }
5042
5043 Args.AddAllArgs(CmdArgs, options::OPT_L);
5044 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5045 Args.AddAllArgs(CmdArgs, options::OPT_e);
5046
5047 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5048
5049 if (!Args.hasArg(options::OPT_nostdlib) &&
5050 !Args.hasArg(options::OPT_nodefaultlibs)) {
5051 if (D.CCCIsCXX) {
5052 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5053 if (Args.hasArg(options::OPT_pg))
5054 CmdArgs.push_back("-lm_p");
5055 else
5056 CmdArgs.push_back("-lm");
5057 }
5058
5059 if (Args.hasArg(options::OPT_pthread))
5060 CmdArgs.push_back("-lpthread");
5061 if (!Args.hasArg(options::OPT_shared)) {
5062 if (Args.hasArg(options::OPT_pg))
5063 CmdArgs.push_back("-lc_p");
5064 else
5065 CmdArgs.push_back("-lc");
5066 }
5067
5068 std::string myarch = "-lclang_rt.";
5069 const llvm::Triple &T = getToolChain().getTriple();
5070 llvm::Triple::ArchType Arch = T.getArch();
5071 switch (Arch) {
5072 case llvm::Triple::arm:
5073 myarch += ("arm");
5074 break;
5075 case llvm::Triple::x86:
5076 myarch += ("i386");
5077 break;
5078 case llvm::Triple::x86_64:
5079 myarch += ("amd64");
5080 break;
5081 default:
5082 assert(0 && "Unsupported architecture");
5083 }
5084 CmdArgs.push_back(Args.MakeArgString(myarch));
5085 }
5086
5087 if (!Args.hasArg(options::OPT_nostdlib) &&
5088 !Args.hasArg(options::OPT_nostartfiles)) {
5089 if (!Args.hasArg(options::OPT_shared))
5090 CmdArgs.push_back(Args.MakeArgString(
5091 getToolChain().GetFilePath("crtend.o")));
5092 else
5093 CmdArgs.push_back(Args.MakeArgString(
5094 getToolChain().GetFilePath("crtendS.o")));
5095 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005096
5097 const char *Exec =
5098 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5099 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005100}
5101
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005102void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005103 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005104 const InputInfoList &Inputs,
5105 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005106 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005107 ArgStringList CmdArgs;
5108
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005109 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5110 // instruct as in the base system to assemble 32-bit code.
5111 if (getToolChain().getArchName() == "i386")
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005112 CmdArgs.push_back("--32");
5113
Roman Divacky3393cef2011-06-04 07:37:31 +00005114 if (getToolChain().getArchName() == "powerpc")
5115 CmdArgs.push_back("-a32");
Michael J. Spencer20249a12010-10-21 03:16:25 +00005116
Eric Christophered734732010-03-02 02:41:08 +00005117 // Set byte order explicitly
5118 if (getToolChain().getArchName() == "mips")
5119 CmdArgs.push_back("-EB");
5120 else if (getToolChain().getArchName() == "mipsel")
5121 CmdArgs.push_back("-EL");
5122
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005123 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5124 options::OPT_Xassembler);
5125
5126 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005127 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005128
5129 for (InputInfoList::const_iterator
5130 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5131 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005132 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005133 }
5134
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005135 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005136 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005137 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005138}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005139
5140void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005141 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005142 const InputInfoList &Inputs,
5143 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005144 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005145 const Driver &D = getToolChain().getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005146 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005147
5148 // Silence warning for "clang -g foo.o -o foo"
5149 Args.ClaimAllArgs(options::OPT_g_Group);
5150 // and "clang -emit-llvm foo.o -o foo"
5151 Args.ClaimAllArgs(options::OPT_emit_llvm);
5152 // and for "clang -w foo.o -o foo". Other warning options are already
5153 // handled somewhere else.
5154 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005155
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005156 if (!D.SysRoot.empty())
5157 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5158
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005159 if (Args.hasArg(options::OPT_static)) {
5160 CmdArgs.push_back("-Bstatic");
5161 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005162 if (Args.hasArg(options::OPT_rdynamic))
5163 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005164 CmdArgs.push_back("--eh-frame-hdr");
5165 if (Args.hasArg(options::OPT_shared)) {
5166 CmdArgs.push_back("-Bshareable");
5167 } else {
5168 CmdArgs.push_back("-dynamic-linker");
5169 CmdArgs.push_back("/libexec/ld-elf.so.1");
5170 }
David Chisnalldfa210b2012-07-29 15:24:44 +00005171 if (getToolChain().getTriple().getOSMajorVersion() >= 9) {
5172 llvm::Triple::ArchType Arch = getToolChain().getArch();
5173 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5174 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5175 CmdArgs.push_back("--hash-style=both");
5176 }
5177 }
5178 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005179 }
5180
5181 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5182 // instruct ld in the base system to link 32-bit code.
5183 if (getToolChain().getArchName() == "i386") {
5184 CmdArgs.push_back("-m");
5185 CmdArgs.push_back("elf_i386_fbsd");
5186 }
5187
Roman Divacky000a6552011-06-04 07:40:24 +00005188 if (getToolChain().getArchName() == "powerpc") {
5189 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005190 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005191 }
5192
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005193 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005194 CmdArgs.push_back("-o");
5195 CmdArgs.push_back(Output.getFilename());
5196 } else {
5197 assert(Output.isNothing() && "Invalid output.");
5198 }
5199
5200 if (!Args.hasArg(options::OPT_nostdlib) &&
5201 !Args.hasArg(options::OPT_nostartfiles)) {
5202 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005203 if (Args.hasArg(options::OPT_pg))
5204 CmdArgs.push_back(Args.MakeArgString(
5205 getToolChain().GetFilePath("gcrt1.o")));
Roman Divacky8642f212011-10-10 19:47:45 +00005206 else {
5207 const char *crt = Args.hasArg(options::OPT_pie) ? "Scrt1.o" : "crt1.o";
Roman Divackyc16bb762011-02-10 16:59:40 +00005208 CmdArgs.push_back(Args.MakeArgString(
Roman Divacky8642f212011-10-10 19:47:45 +00005209 getToolChain().GetFilePath(crt)));
5210 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005211 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005212 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005213 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005214 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005215 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005216 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005217 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005218 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005219 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005220 }
5221 }
5222
5223 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky58e5ac92011-03-01 17:53:14 +00005224 const ToolChain::path_list Paths = getToolChain().getFilePaths();
5225 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5226 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005227 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005228 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5229 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005230 Args.AddAllArgs(CmdArgs, options::OPT_s);
5231 Args.AddAllArgs(CmdArgs, options::OPT_t);
5232 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5233 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005234
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005235 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005236
5237 if (!Args.hasArg(options::OPT_nostdlib) &&
5238 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005239 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005240 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005241 if (Args.hasArg(options::OPT_pg))
5242 CmdArgs.push_back("-lm_p");
5243 else
5244 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005245 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005246 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5247 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005248 if (Args.hasArg(options::OPT_pg))
5249 CmdArgs.push_back("-lgcc_p");
5250 else
5251 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005252 if (Args.hasArg(options::OPT_static)) {
5253 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005254 } else if (Args.hasArg(options::OPT_pg)) {
5255 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005256 } else {
5257 CmdArgs.push_back("--as-needed");
5258 CmdArgs.push_back("-lgcc_s");
5259 CmdArgs.push_back("--no-as-needed");
5260 }
5261
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005262 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005263 if (Args.hasArg(options::OPT_pg))
5264 CmdArgs.push_back("-lpthread_p");
5265 else
5266 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005267 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005268
Roman Divackyc16bb762011-02-10 16:59:40 +00005269 if (Args.hasArg(options::OPT_pg)) {
5270 if (Args.hasArg(options::OPT_shared))
5271 CmdArgs.push_back("-lc");
5272 else
5273 CmdArgs.push_back("-lc_p");
5274 CmdArgs.push_back("-lgcc_p");
5275 } else {
5276 CmdArgs.push_back("-lc");
5277 CmdArgs.push_back("-lgcc");
5278 }
5279
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005280 if (Args.hasArg(options::OPT_static)) {
5281 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005282 } else if (Args.hasArg(options::OPT_pg)) {
5283 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005284 } else {
5285 CmdArgs.push_back("--as-needed");
5286 CmdArgs.push_back("-lgcc_s");
5287 CmdArgs.push_back("--no-as-needed");
5288 }
5289 }
5290
5291 if (!Args.hasArg(options::OPT_nostdlib) &&
5292 !Args.hasArg(options::OPT_nostartfiles)) {
5293 if (!Args.hasArg(options::OPT_shared))
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005294 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
Chris Lattner38e317d2010-07-07 16:01:42 +00005295 "crtend.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005296 else
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005297 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
Chris Lattner38e317d2010-07-07 16:01:42 +00005298 "crtendS.o")));
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005299 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
Chris Lattner38e317d2010-07-07 16:01:42 +00005300 "crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005301 }
5302
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005303 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005304
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005305 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005306 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005307 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005308}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005309
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005310void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5311 const InputInfo &Output,
5312 const InputInfoList &Inputs,
5313 const ArgList &Args,
5314 const char *LinkingOutput) const {
5315 ArgStringList CmdArgs;
5316
5317 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5318 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005319 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005320 CmdArgs.push_back("--32");
5321
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005322 // Set byte order explicitly
5323 if (getToolChain().getArchName() == "mips")
5324 CmdArgs.push_back("-EB");
5325 else if (getToolChain().getArchName() == "mipsel")
5326 CmdArgs.push_back("-EL");
5327
5328 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5329 options::OPT_Xassembler);
5330
5331 CmdArgs.push_back("-o");
5332 CmdArgs.push_back(Output.getFilename());
5333
5334 for (InputInfoList::const_iterator
5335 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5336 const InputInfo &II = *it;
5337 CmdArgs.push_back(II.getFilename());
5338 }
5339
David Chisnall5adcec12011-09-27 22:03:18 +00005340 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005341 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5342}
5343
5344void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5345 const InputInfo &Output,
5346 const InputInfoList &Inputs,
5347 const ArgList &Args,
5348 const char *LinkingOutput) const {
5349 const Driver &D = getToolChain().getDriver();
5350 ArgStringList CmdArgs;
5351
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005352 if (!D.SysRoot.empty())
5353 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5354
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005355 if (Args.hasArg(options::OPT_static)) {
5356 CmdArgs.push_back("-Bstatic");
5357 } else {
5358 if (Args.hasArg(options::OPT_rdynamic))
5359 CmdArgs.push_back("-export-dynamic");
5360 CmdArgs.push_back("--eh-frame-hdr");
5361 if (Args.hasArg(options::OPT_shared)) {
5362 CmdArgs.push_back("-Bshareable");
5363 } else {
5364 CmdArgs.push_back("-dynamic-linker");
5365 CmdArgs.push_back("/libexec/ld.elf_so");
5366 }
5367 }
5368
5369 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5370 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005371 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005372 CmdArgs.push_back("-m");
5373 CmdArgs.push_back("elf_i386");
5374 }
5375
5376 if (Output.isFilename()) {
5377 CmdArgs.push_back("-o");
5378 CmdArgs.push_back(Output.getFilename());
5379 } else {
5380 assert(Output.isNothing() && "Invalid output.");
5381 }
5382
5383 if (!Args.hasArg(options::OPT_nostdlib) &&
5384 !Args.hasArg(options::OPT_nostartfiles)) {
5385 if (!Args.hasArg(options::OPT_shared)) {
5386 CmdArgs.push_back(Args.MakeArgString(
5387 getToolChain().GetFilePath("crt0.o")));
5388 CmdArgs.push_back(Args.MakeArgString(
5389 getToolChain().GetFilePath("crti.o")));
5390 CmdArgs.push_back(Args.MakeArgString(
5391 getToolChain().GetFilePath("crtbegin.o")));
5392 } else {
5393 CmdArgs.push_back(Args.MakeArgString(
5394 getToolChain().GetFilePath("crti.o")));
5395 CmdArgs.push_back(Args.MakeArgString(
5396 getToolChain().GetFilePath("crtbeginS.o")));
5397 }
5398 }
5399
5400 Args.AddAllArgs(CmdArgs, options::OPT_L);
5401 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5402 Args.AddAllArgs(CmdArgs, options::OPT_e);
5403 Args.AddAllArgs(CmdArgs, options::OPT_s);
5404 Args.AddAllArgs(CmdArgs, options::OPT_t);
5405 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5406 Args.AddAllArgs(CmdArgs, options::OPT_r);
5407
5408 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5409
5410 if (!Args.hasArg(options::OPT_nostdlib) &&
5411 !Args.hasArg(options::OPT_nodefaultlibs)) {
5412 if (D.CCCIsCXX) {
5413 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5414 CmdArgs.push_back("-lm");
5415 }
5416 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5417 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005418 if (Args.hasArg(options::OPT_static)) {
5419 CmdArgs.push_back("-lgcc_eh");
5420 } else {
5421 CmdArgs.push_back("--as-needed");
5422 CmdArgs.push_back("-lgcc_s");
5423 CmdArgs.push_back("--no-as-needed");
5424 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005425 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005426
5427 if (Args.hasArg(options::OPT_pthread))
5428 CmdArgs.push_back("-lpthread");
5429 CmdArgs.push_back("-lc");
5430
5431 CmdArgs.push_back("-lgcc");
5432 if (Args.hasArg(options::OPT_static)) {
5433 CmdArgs.push_back("-lgcc_eh");
5434 } else {
5435 CmdArgs.push_back("--as-needed");
5436 CmdArgs.push_back("-lgcc_s");
5437 CmdArgs.push_back("--no-as-needed");
5438 }
5439 }
5440
5441 if (!Args.hasArg(options::OPT_nostdlib) &&
5442 !Args.hasArg(options::OPT_nostartfiles)) {
5443 if (!Args.hasArg(options::OPT_shared))
5444 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5445 "crtend.o")));
5446 else
5447 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5448 "crtendS.o")));
5449 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5450 "crtn.o")));
5451 }
5452
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005453 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005454
David Chisnall5adcec12011-09-27 22:03:18 +00005455 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005456 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5457}
5458
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005459void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5460 const InputInfo &Output,
5461 const InputInfoList &Inputs,
5462 const ArgList &Args,
5463 const char *LinkingOutput) const {
5464 ArgStringList CmdArgs;
5465
5466 // Add --32/--64 to make sure we get the format we want.
5467 // This is incomplete
5468 if (getToolChain().getArch() == llvm::Triple::x86) {
5469 CmdArgs.push_back("--32");
5470 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5471 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005472 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5473 CmdArgs.push_back("-a32");
5474 CmdArgs.push_back("-mppc");
5475 CmdArgs.push_back("-many");
5476 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5477 CmdArgs.push_back("-a64");
5478 CmdArgs.push_back("-mppc64");
5479 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005480 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005481 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005482 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5483 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005484
5485 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5486 getToolChain().getTriple());
5487 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005488
5489 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5490 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5491 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005492 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5493 getToolChain().getArch() == llvm::Triple::mipsel ||
5494 getToolChain().getArch() == llvm::Triple::mips64 ||
5495 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005496 StringRef CPUName;
5497 StringRef ABIName;
5498 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005499
Simon Atanasyan073a7802012-04-07 22:31:29 +00005500 CmdArgs.push_back("-march");
5501 CmdArgs.push_back(CPUName.data());
5502
5503 // Convert ABI name to the GNU tools acceptable variant.
5504 if (ABIName == "o32")
5505 ABIName = "32";
5506 else if (ABIName == "n64")
5507 ABIName = "64";
5508
5509 CmdArgs.push_back("-mabi");
5510 CmdArgs.push_back(ABIName.data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005511
5512 if (getToolChain().getArch() == llvm::Triple::mips ||
5513 getToolChain().getArch() == llvm::Triple::mips64)
5514 CmdArgs.push_back("-EB");
5515 else
5516 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005517
5518 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5519 options::OPT_fpic, options::OPT_fno_pic,
5520 options::OPT_fPIE, options::OPT_fno_PIE,
5521 options::OPT_fpie, options::OPT_fno_pie);
5522 if (LastPICArg &&
5523 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5524 LastPICArg->getOption().matches(options::OPT_fpic) ||
5525 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5526 LastPICArg->getOption().matches(options::OPT_fpie))) {
5527 CmdArgs.push_back("-KPIC");
5528 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005529 }
5530
5531 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5532 options::OPT_Xassembler);
5533
5534 CmdArgs.push_back("-o");
5535 CmdArgs.push_back(Output.getFilename());
5536
5537 for (InputInfoList::const_iterator
5538 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5539 const InputInfo &II = *it;
5540 CmdArgs.push_back(II.getFilename());
5541 }
5542
5543 const char *Exec =
5544 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5545 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5546}
5547
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005548static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5549 ArgStringList &CmdArgs, const ArgList &Args) {
5550 bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROIDEABI;
5551 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005552 Args.hasArg(options::OPT_static_libgcc);
5553 if (!D.CCCIsCXX)
5554 CmdArgs.push_back("-lgcc");
5555
5556 if (StaticLibgcc) {
5557 if (D.CCCIsCXX)
5558 CmdArgs.push_back("-lgcc");
5559 } else {
5560 if (!D.CCCIsCXX)
5561 CmdArgs.push_back("--as-needed");
5562 CmdArgs.push_back("-lgcc_s");
5563 if (!D.CCCIsCXX)
5564 CmdArgs.push_back("--no-as-needed");
5565 }
5566
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005567 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005568 CmdArgs.push_back("-lgcc_eh");
5569 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5570 CmdArgs.push_back("-lgcc");
5571}
5572
Rafael Espindolac1da9812010-11-07 20:14:31 +00005573void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5574 const InputInfo &Output,
5575 const InputInfoList &Inputs,
5576 const ArgList &Args,
5577 const char *LinkingOutput) const {
5578 const toolchains::Linux& ToolChain =
5579 static_cast<const toolchains::Linux&>(getToolChain());
5580 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005581 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
5582 llvm::Triple::ANDROIDEABI;
5583
Rafael Espindolac1da9812010-11-07 20:14:31 +00005584 ArgStringList CmdArgs;
5585
Rafael Espindola26f14c32010-11-15 18:28:16 +00005586 // Silence warning for "clang -g foo.o -o foo"
5587 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005588 // and "clang -emit-llvm foo.o -o foo"
5589 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00005590 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00005591 // handled somewhere else.
5592 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00005593
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005594 if (!D.SysRoot.empty())
5595 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005596
Rafael Espindolafdda1712010-11-17 22:26:15 +00005597 if (Args.hasArg(options::OPT_pie))
5598 CmdArgs.push_back("-pie");
5599
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00005600 if (Args.hasArg(options::OPT_rdynamic))
5601 CmdArgs.push_back("-export-dynamic");
5602
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00005603 if (Args.hasArg(options::OPT_s))
5604 CmdArgs.push_back("-s");
5605
Rafael Espindolac1da9812010-11-07 20:14:31 +00005606 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5607 e = ToolChain.ExtraOpts.end();
5608 i != e; ++i)
5609 CmdArgs.push_back(i->c_str());
5610
5611 if (!Args.hasArg(options::OPT_static)) {
5612 CmdArgs.push_back("--eh-frame-hdr");
5613 }
5614
5615 CmdArgs.push_back("-m");
5616 if (ToolChain.getArch() == llvm::Triple::x86)
5617 CmdArgs.push_back("elf_i386");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005618 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00005619 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005620 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005621 else if (ToolChain.getArch() == llvm::Triple::ppc)
5622 CmdArgs.push_back("elf32ppclinux");
5623 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5624 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00005625 else if (ToolChain.getArch() == llvm::Triple::mips)
5626 CmdArgs.push_back("elf32btsmip");
5627 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5628 CmdArgs.push_back("elf32ltsmip");
5629 else if (ToolChain.getArch() == llvm::Triple::mips64)
5630 CmdArgs.push_back("elf64btsmip");
5631 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5632 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005633 else
5634 CmdArgs.push_back("elf_x86_64");
5635
5636 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00005637 if (ToolChain.getArch() == llvm::Triple::arm
5638 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005639 CmdArgs.push_back("-Bstatic");
5640 else
5641 CmdArgs.push_back("-static");
5642 } else if (Args.hasArg(options::OPT_shared)) {
5643 CmdArgs.push_back("-shared");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005644 if ((ToolChain.getArch() == llvm::Triple::arm
5645 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5646 CmdArgs.push_back("-Bsymbolic");
5647 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005648 }
5649
5650 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00005651 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00005652 (!Args.hasArg(options::OPT_static) &&
5653 !Args.hasArg(options::OPT_shared))) {
5654 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005655 if (isAndroid)
5656 CmdArgs.push_back("/system/bin/linker");
5657 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005658 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregorf0594d82011-03-06 19:11:49 +00005659 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liu6cc9dc82012-07-30 11:05:56 +00005660 ToolChain.getArch() == llvm::Triple::thumb) {
5661 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5662 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5663 else
5664 CmdArgs.push_back("/lib/ld-linux.so.3");
5665 }
Eli Friedman5bea4f62011-11-08 19:43:37 +00005666 else if (ToolChain.getArch() == llvm::Triple::mips ||
5667 ToolChain.getArch() == llvm::Triple::mipsel)
5668 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan8491cb22012-04-06 20:14:27 +00005669 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5670 ToolChain.getArch() == llvm::Triple::mips64el)
5671 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005672 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005673 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005674 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005675 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005676 else
5677 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5678 }
5679
5680 CmdArgs.push_back("-o");
5681 CmdArgs.push_back(Output.getFilename());
5682
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005683 if (!Args.hasArg(options::OPT_nostdlib) &&
5684 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005685 if (!isAndroid) {
5686 const char *crt1 = NULL;
5687 if (!Args.hasArg(options::OPT_shared)){
5688 if (Args.hasArg(options::OPT_pie))
5689 crt1 = "Scrt1.o";
5690 else
5691 crt1 = "crt1.o";
5692 }
5693 if (crt1)
5694 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005695
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005696 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5697 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005698
Rafael Espindola89414b32010-11-12 03:00:39 +00005699 const char *crtbegin;
5700 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005701 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Rafael Espindolafdda1712010-11-17 22:26:15 +00005702 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005703 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005704 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005705 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005706 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5707 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005708
5709 Args.AddAllArgs(CmdArgs, options::OPT_L);
5710
5711 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5712
Roman Divacky58e5ac92011-03-01 17:53:14 +00005713 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5714 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005715 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005716
Rafael Espindolac5151542012-04-09 23:53:34 +00005717 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5718 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5719 // forward.
5720 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5721 CmdArgs.push_back("-plugin");
5722 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5723 CmdArgs.push_back(Args.MakeArgString(Plugin));
5724 }
5725
Nick Lewyckye276cfc2012-08-17 03:39:16 +00005726 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5727 CmdArgs.push_back("--no-demangle");
5728
Rafael Espindolac1da9812010-11-07 20:14:31 +00005729 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5730
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005731 if (D.CCCIsCXX &&
5732 !Args.hasArg(options::OPT_nostdlib) &&
5733 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00005734 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5735 !Args.hasArg(options::OPT_static);
5736 if (OnlyLibstdcxxStatic)
5737 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005738 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00005739 if (OnlyLibstdcxxStatic)
5740 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005741 CmdArgs.push_back("-lm");
5742 }
5743
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005744 // Call this before we add the C run-time.
5745 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00005746 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005747
Rafael Espindola89414b32010-11-12 03:00:39 +00005748 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005749 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5750 if (Args.hasArg(options::OPT_static))
5751 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00005752
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005753 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00005754
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005755 if (Args.hasArg(options::OPT_pthread) ||
5756 Args.hasArg(options::OPT_pthreads))
5757 CmdArgs.push_back("-lpthread");
5758
5759 CmdArgs.push_back("-lc");
5760
5761 if (Args.hasArg(options::OPT_static))
5762 CmdArgs.push_back("--end-group");
5763 else
5764 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5765 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00005766
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005767 if (!Args.hasArg(options::OPT_nostartfiles)) {
5768 const char *crtend;
5769 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005770 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005771 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005772 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005773
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005774 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005775 if (!isAndroid)
5776 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005777 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005778 }
5779
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005780 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005781
Rafael Espindolac1da9812010-11-07 20:14:31 +00005782 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5783}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005784
Chris Lattner38e317d2010-07-07 16:01:42 +00005785void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005786 const InputInfo &Output,
5787 const InputInfoList &Inputs,
5788 const ArgList &Args,
5789 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005790 ArgStringList CmdArgs;
5791
5792 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5793 options::OPT_Xassembler);
5794
5795 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005796 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005797
5798 for (InputInfoList::const_iterator
5799 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5800 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005801 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005802 }
5803
5804 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00005805 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005806 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005807}
5808
5809void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005810 const InputInfo &Output,
5811 const InputInfoList &Inputs,
5812 const ArgList &Args,
5813 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005814 const Driver &D = getToolChain().getDriver();
5815 ArgStringList CmdArgs;
5816
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005817 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005818 CmdArgs.push_back("-o");
5819 CmdArgs.push_back(Output.getFilename());
5820 } else {
5821 assert(Output.isNothing() && "Invalid output.");
5822 }
5823
5824 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00005825 !Args.hasArg(options::OPT_nostartfiles)) {
5826 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5827 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5828 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5829 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5830 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005831
5832 Args.AddAllArgs(CmdArgs, options::OPT_L);
5833 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5834 Args.AddAllArgs(CmdArgs, options::OPT_e);
5835
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005836 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005837
Eli Friedman6d402dc2011-12-08 23:54:21 +00005838 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5839
Chris Lattner38e317d2010-07-07 16:01:42 +00005840 if (!Args.hasArg(options::OPT_nostdlib) &&
5841 !Args.hasArg(options::OPT_nodefaultlibs)) {
5842 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005843 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005844 CmdArgs.push_back("-lm");
5845 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005846 }
5847
5848 if (!Args.hasArg(options::OPT_nostdlib) &&
5849 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00005850 if (Args.hasArg(options::OPT_pthread))
5851 CmdArgs.push_back("-lpthread");
5852 CmdArgs.push_back("-lc");
5853 CmdArgs.push_back("-lCompilerRT-Generic");
5854 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5855 CmdArgs.push_back(
5856 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005857 }
5858
Eli Friedman6d402dc2011-12-08 23:54:21 +00005859 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005860 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005861}
5862
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005863/// DragonFly Tools
5864
5865// For now, DragonFly Assemble does just about the same as for
5866// FreeBSD, but this may change soon.
5867void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005868 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005869 const InputInfoList &Inputs,
5870 const ArgList &Args,
5871 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005872 ArgStringList CmdArgs;
5873
5874 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5875 // instruct as in the base system to assemble 32-bit code.
5876 if (getToolChain().getArchName() == "i386")
5877 CmdArgs.push_back("--32");
5878
5879 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5880 options::OPT_Xassembler);
5881
5882 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005883 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005884
5885 for (InputInfoList::const_iterator
5886 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5887 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005888 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005889 }
5890
5891 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005892 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005893 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005894}
5895
5896void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005897 const InputInfo &Output,
5898 const InputInfoList &Inputs,
5899 const ArgList &Args,
5900 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005901 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005902 ArgStringList CmdArgs;
5903
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005904 if (!D.SysRoot.empty())
5905 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5906
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005907 if (Args.hasArg(options::OPT_static)) {
5908 CmdArgs.push_back("-Bstatic");
5909 } else {
5910 if (Args.hasArg(options::OPT_shared))
5911 CmdArgs.push_back("-Bshareable");
5912 else {
5913 CmdArgs.push_back("-dynamic-linker");
5914 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5915 }
5916 }
5917
5918 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5919 // instruct ld in the base system to link 32-bit code.
5920 if (getToolChain().getArchName() == "i386") {
5921 CmdArgs.push_back("-m");
5922 CmdArgs.push_back("elf_i386");
5923 }
5924
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005925 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005926 CmdArgs.push_back("-o");
5927 CmdArgs.push_back(Output.getFilename());
5928 } else {
5929 assert(Output.isNothing() && "Invalid output.");
5930 }
5931
5932 if (!Args.hasArg(options::OPT_nostdlib) &&
5933 !Args.hasArg(options::OPT_nostartfiles)) {
5934 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005935 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005936 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005937 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005938 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005939 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005940 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005941 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005942 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005943 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005944 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005945 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005946 }
5947 }
5948
5949 Args.AddAllArgs(CmdArgs, options::OPT_L);
5950 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5951 Args.AddAllArgs(CmdArgs, options::OPT_e);
5952
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005953 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005954
5955 if (!Args.hasArg(options::OPT_nostdlib) &&
5956 !Args.hasArg(options::OPT_nodefaultlibs)) {
5957 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
5958 // rpaths
5959 CmdArgs.push_back("-L/usr/lib/gcc41");
5960
5961 if (!Args.hasArg(options::OPT_static)) {
5962 CmdArgs.push_back("-rpath");
5963 CmdArgs.push_back("/usr/lib/gcc41");
5964
5965 CmdArgs.push_back("-rpath-link");
5966 CmdArgs.push_back("/usr/lib/gcc41");
5967
5968 CmdArgs.push_back("-rpath");
5969 CmdArgs.push_back("/usr/lib");
5970
5971 CmdArgs.push_back("-rpath-link");
5972 CmdArgs.push_back("/usr/lib");
5973 }
5974
Rafael Espindola405861d2010-07-20 12:59:03 +00005975 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005976 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00005977 CmdArgs.push_back("-lm");
5978 }
5979
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005980 if (Args.hasArg(options::OPT_shared)) {
5981 CmdArgs.push_back("-lgcc_pic");
5982 } else {
5983 CmdArgs.push_back("-lgcc");
5984 }
5985
5986
5987 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00005988 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005989
5990 if (!Args.hasArg(options::OPT_nolibc)) {
5991 CmdArgs.push_back("-lc");
5992 }
5993
5994 if (Args.hasArg(options::OPT_shared)) {
5995 CmdArgs.push_back("-lgcc_pic");
5996 } else {
5997 CmdArgs.push_back("-lgcc");
5998 }
5999 }
6000
6001 if (!Args.hasArg(options::OPT_nostdlib) &&
6002 !Args.hasArg(options::OPT_nostartfiles)) {
6003 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006004 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006005 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006006 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006007 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006008 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006009 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006010 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006011 }
6012
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006013 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006014
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006015 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006016 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006017 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006018}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006019
6020void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6021 const InputInfo &Output,
6022 const InputInfoList &Inputs,
6023 const ArgList &Args,
6024 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006025 ArgStringList CmdArgs;
6026
6027 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006028 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6029 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006030 } else {
6031 assert(Output.isNothing() && "Invalid output.");
6032 }
6033
6034 if (!Args.hasArg(options::OPT_nostdlib) &&
6035 !Args.hasArg(options::OPT_nostartfiles)) {
6036 CmdArgs.push_back("-defaultlib:libcmt");
6037 }
6038
6039 CmdArgs.push_back("-nologo");
6040
Michael J. Spencera2284f52012-06-18 16:56:04 +00006041 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6042
6043 // Add filenames immediately.
6044 for (InputInfoList::const_iterator
6045 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6046 if (it->isFilename())
6047 CmdArgs.push_back(it->getFilename());
6048 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006049
6050 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006051 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006052 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6053}