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