blob: 12564b43f6c9c990c0ae7e01a91cdc11882d379e [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")
Chad Rosierae1aee62011-10-07 17:48:56 +0000449 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000450}
451
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000452/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
453//
454// FIXME: tblgen this.
455static std::string getARMTargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue(Args);
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 StringRef MArch;
470 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
471 // Otherwise, if we have -march= choose the base CPU for that arch.
472 MArch = A->getValue(Args);
473 } else {
474 // Otherwise, use the Arch from the triple.
475 MArch = Triple.getArchName();
476 }
477
478 // Handle -march=native.
479 std::string NativeMArch;
480 if (MArch == "native") {
481 std::string CPU = llvm::sys::getHostCPUName();
482 if (CPU != "generic") {
483 // Translate the native cpu into the architecture. The switch below will
484 // then chose the minimum cpu for that arch.
485 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
486 MArch = NativeMArch;
487 }
488 }
489
490 return llvm::StringSwitch<const char *>(MArch)
491 .Cases("armv2", "armv2a","arm2")
492 .Case("armv3", "arm6")
493 .Case("armv3m", "arm7m")
494 .Cases("armv4", "armv4t", "arm7tdmi")
495 .Cases("armv5", "armv5t", "arm10tdmi")
496 .Cases("armv5e", "armv5te", "arm1022e")
497 .Case("armv5tej", "arm926ej-s")
498 .Cases("armv6", "armv6k", "arm1136jf-s")
499 .Case("armv6j", "arm1136j-s")
500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
501 .Case("armv6t2", "arm1156t2-s")
502 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
503 .Cases("armv7r", "armv7-r", "cortex-r4")
504 .Cases("armv7m", "armv7-m", "cortex-m3")
505 .Case("ep9312", "ep9312")
506 .Case("iwmmxt", "iwmmxt")
507 .Case("xscale", "xscale")
508 .Cases("armv6m", "armv6-m", "cortex-m0")
509 // If all else failed, return the most base CPU LLVM supports.
510 .Default("arm7tdmi");
511}
512
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000513// FIXME: Move to target hook.
514static bool isSignedCharDefault(const llvm::Triple &Triple) {
515 switch (Triple.getArch()) {
516 default:
517 return true;
518
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000519 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000520 case llvm::Triple::ppc:
521 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000522 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000523 return true;
524 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000525 }
526}
527
Chad Rosier99317272012-04-04 20:51:35 +0000528// Handle -mfpu=.
529//
530// FIXME: Centralize feature selection, defaulting shouldn't be also in the
531// frontend target.
532static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
533 ArgStringList &CmdArgs) {
534 StringRef FPU = A->getValue(Args);
535
536 // Set the target features based on the FPU.
537 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
538 // Disable any default FPU support.
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp2");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-vfp3");
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-neon");
545 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+vfp3");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("+d16");
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("-neon");
552 } else if (FPU == "vfp") {
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("+vfp2");
555 CmdArgs.push_back("-target-feature");
556 CmdArgs.push_back("-neon");
557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+vfp3");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "neon") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+neon");
565 } else
566 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
567}
568
Chad Rosier7a938fa2012-04-04 20:39:32 +0000569// Handle -mfpmath=.
570static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000571 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier7a938fa2012-04-04 20:39:32 +0000572 StringRef FPMath = A->getValue(Args);
573
574 // Set the target features based on the FPMath.
575 if (FPMath == "neon") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000578
Silviu Baranga2df67ea2012-09-13 15:06:00 +0000579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
580 CPU != "cortex-a15")
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000581 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
582
Chad Rosier7a938fa2012-04-04 20:39:32 +0000583 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
584 FPMath == "vfp4") {
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000587
588 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000589 } else
590 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
591}
592
Anton Korobeynikove2571792012-04-09 13:38:30 +0000593// Select the float ABI as determined by -msoft-float, -mhard-float, and
594// -mfloat-abi=.
595static StringRef getARMFloatABI(const Driver &D,
596 const ArgList &Args,
597 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000598 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000599 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
600 options::OPT_mhard_float,
601 options::OPT_mfloat_abi_EQ)) {
602 if (A->getOption().matches(options::OPT_msoft_float))
603 FloatABI = "soft";
604 else if (A->getOption().matches(options::OPT_mhard_float))
605 FloatABI = "hard";
606 else {
607 FloatABI = A->getValue(Args);
608 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000609 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000610 << A->getAsString(Args);
611 FloatABI = "soft";
612 }
613 }
614 }
615
616 // If unspecified, choose the default based on the platform.
617 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000618 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000619 case llvm::Triple::Darwin:
620 case llvm::Triple::MacOSX:
621 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000622 // Darwin defaults to "softfp" for v6 and v7.
623 //
624 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000625 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000626 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000627 if (StringRef(ArchName).startswith("v6") ||
628 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000629 FloatABI = "softfp";
630 else
631 FloatABI = "soft";
632 break;
633 }
634
635 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000636 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000637 case llvm::Triple::GNUEABIHF:
638 FloatABI = "hard";
639 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000640 case llvm::Triple::GNUEABI:
641 FloatABI = "softfp";
642 break;
643 case llvm::Triple::EABI:
644 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
645 FloatABI = "softfp";
646 break;
Logan Chien94a71422012-09-02 09:30:11 +0000647 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000648 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000649 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000656 default:
657 // Assume "soft", but warn the user we are guessing.
658 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000659 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000660 break;
661 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000662 }
663 }
664
Anton Korobeynikove2571792012-04-09 13:38:30 +0000665 return FloatABI;
666}
667
668
669void Clang::AddARMTargetArgs(const ArgList &Args,
670 ArgStringList &CmdArgs,
671 bool KernelOrKext) const {
672 const Driver &D = getToolChain().getDriver();
673 llvm::Triple Triple = getToolChain().getTriple();
674
675 // Select the ABI to use.
676 //
677 // FIXME: Support -meabi.
678 const char *ABIName = 0;
679 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
680 ABIName = A->getValue(Args);
681 } else {
682 // Select the default based on the platform.
683 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000684 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000685 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000686 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000687 ABIName = "aapcs-linux";
688 break;
689 case llvm::Triple::EABI:
690 ABIName = "aapcs";
691 break;
692 default:
693 ABIName = "apcs-gnu";
694 }
695 }
696 CmdArgs.push_back("-target-abi");
697 CmdArgs.push_back(ABIName);
698
699 // Set the CPU based on -march= and -mcpu=.
700 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000701 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikove2571792012-04-09 13:38:30 +0000702
703 // Determine floating point ABI from the options & target defaults.
704 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000705 if (FloatABI == "soft") {
706 // Floating point operations and argument passing are soft.
707 //
708 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000709 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000710 CmdArgs.push_back("-mfloat-abi");
711 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000712 } else if (FloatABI == "softfp") {
713 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000714 CmdArgs.push_back("-mfloat-abi");
715 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000716 } else {
717 // Floating point operations and argument passing are hard.
718 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000719 CmdArgs.push_back("-mfloat-abi");
720 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000721 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000722
723 // Set appropriate target features for floating point mode.
724 //
725 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
726 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
727 // stripped out by the ARM target.
728
729 // Use software floating point operations?
730 if (FloatABI == "soft") {
731 CmdArgs.push_back("-target-feature");
732 CmdArgs.push_back("+soft-float");
733 }
734
735 // Use software floating point argument passing?
736 if (FloatABI != "hard") {
737 CmdArgs.push_back("-target-feature");
738 CmdArgs.push_back("+soft-float-abi");
739 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000740
741 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000742 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000743 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000744
Chad Rosier7a938fa2012-04-04 20:39:32 +0000745 // Honor -mfpmath=.
746 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000747 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000748
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000749 // Setting -msoft-float effectively disables NEON because of the GCC
750 // implementation, although the same isn't true of VFP or VFP3.
751 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000752 CmdArgs.push_back("-target-feature");
753 CmdArgs.push_back("-neon");
754 }
755
756 // Kernel code has more strict alignment requirements.
757 if (KernelOrKext) {
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000758 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000759 CmdArgs.push_back("-arm-long-calls");
760
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000761 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000762 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000763
764 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000765 CmdArgs.push_back("-backend-option");
766 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000767 }
Chad Rosier1b906052011-08-26 00:26:29 +0000768
769 // Setting -mno-global-merge disables the codegen global merge pass. Setting
770 // -mglobal-merge has no effect as the pass is enabled by default.
771 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
772 options::OPT_mno_global_merge)) {
773 if (A->getOption().matches(options::OPT_mno_global_merge))
774 CmdArgs.push_back("-mno-global-merge");
775 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000776
Chad Rosier005af272012-05-16 21:19:55 +0000777 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000778 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000779}
780
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000781// Translate MIPS CPU name alias option to CPU name.
782static StringRef getMipsCPUFromAlias(const Arg &A) {
783 if (A.getOption().matches(options::OPT_mips32))
784 return "mips32";
785 if (A.getOption().matches(options::OPT_mips32r2))
786 return "mips32r2";
787 if (A.getOption().matches(options::OPT_mips64))
788 return "mips64";
789 if (A.getOption().matches(options::OPT_mips64r2))
790 return "mips64r2";
791 llvm_unreachable("Unexpected option");
792 return "";
793}
794
Simon Atanasyana2768be2012-04-07 22:09:23 +0000795// Get CPU and ABI names. They are not independent
796// so we have to calculate them together.
797static void getMipsCPUAndABI(const ArgList &Args,
798 const ToolChain &TC,
799 StringRef &CPUName,
800 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000801 const char *DefMips32CPU = "mips32";
802 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000803
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000804 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000805 options::OPT_mcpu_EQ,
806 options::OPT_mips_CPUs_Group)) {
807 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
808 CPUName = getMipsCPUFromAlias(*A);
809 else
810 CPUName = A->getValue(Args);
811 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000812
Akira Hatanaka9f360622011-09-26 21:07:52 +0000813 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christophered734732010-03-02 02:41:08 +0000814 ABIName = A->getValue(Args);
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000815
816 // Setup default CPU and ABI names.
817 if (CPUName.empty() && ABIName.empty()) {
818 switch (TC.getTriple().getArch()) {
819 default:
820 llvm_unreachable("Unexpected triple arch name");
821 case llvm::Triple::mips:
822 case llvm::Triple::mipsel:
823 CPUName = DefMips32CPU;
824 break;
825 case llvm::Triple::mips64:
826 case llvm::Triple::mips64el:
827 CPUName = DefMips64CPU;
828 break;
829 }
830 }
831
832 if (!ABIName.empty()) {
833 // Deduce CPU name from ABI name.
834 CPUName = llvm::StringSwitch<const char *>(ABIName)
835 .Cases("o32", "eabi", DefMips32CPU)
836 .Cases("n32", "n64", DefMips64CPU)
837 .Default("");
838 }
839 else if (!CPUName.empty()) {
840 // Deduce ABI name from CPU name.
841 ABIName = llvm::StringSwitch<const char *>(CPUName)
842 .Cases("mips32", "mips32r2", "o32")
843 .Cases("mips64", "mips64r2", "n64")
844 .Default("");
845 }
846
847 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000848}
849
Simon Atanasyan5e627792012-06-02 15:06:29 +0000850// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
851// and -mfloat-abi=.
852static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000853 // Select the float ABI as determined by -msoft-float, -mhard-float,
854 // and -mfloat-abi=.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000855 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000856 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000857 options::OPT_mhard_float,
858 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000859 if (A->getOption().matches(options::OPT_msoft_float))
860 FloatABI = "soft";
861 else if (A->getOption().matches(options::OPT_mhard_float))
862 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000863 else {
864 FloatABI = A->getValue(Args);
865 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000866 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000867 FloatABI = "hard";
868 }
869 }
Eric Christophered734732010-03-02 02:41:08 +0000870 }
871
872 // If unspecified, choose the default based on the platform.
873 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000874 // Assume "hard", because it's a default value used by gcc.
875 // When we start to recognize specific target MIPS processors,
876 // we will be able to select the default more correctly.
877 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000878 }
879
Simon Atanasyan5e627792012-06-02 15:06:29 +0000880 return FloatABI;
881}
882
Simon Atanasyandc536f52012-07-05 18:51:43 +0000883static void AddTargetFeature(const ArgList &Args,
884 ArgStringList &CmdArgs,
885 OptSpecifier OnOpt,
886 OptSpecifier OffOpt,
887 StringRef FeatureName) {
888 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
889 CmdArgs.push_back("-target-feature");
890 if (A->getOption().matches(OnOpt))
891 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
892 else
893 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
894 }
895}
896
Simon Atanasyan5e627792012-06-02 15:06:29 +0000897void Clang::AddMIPSTargetArgs(const ArgList &Args,
898 ArgStringList &CmdArgs) const {
899 const Driver &D = getToolChain().getDriver();
900 StringRef CPUName;
901 StringRef ABIName;
902 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
903
904 CmdArgs.push_back("-target-cpu");
905 CmdArgs.push_back(CPUName.data());
906
907 CmdArgs.push_back("-target-abi");
908 CmdArgs.push_back(ABIName.data());
909
910 StringRef FloatABI = getMipsFloatABI(D, Args);
911
Eric Christophered734732010-03-02 02:41:08 +0000912 if (FloatABI == "soft") {
913 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000914 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("soft");
917
918 // FIXME: Note, this is a hack. We need to pass the selected float
919 // mode to the MipsTargetInfoBase to define appropriate macros there.
920 // Now it is the only method.
921 CmdArgs.push_back("-target-feature");
922 CmdArgs.push_back("+soft-float");
923 }
924 else if (FloatABI == "single") {
925 // Restrict the use of hardware floating-point
926 // instructions to 32-bit operations.
927 CmdArgs.push_back("-target-feature");
928 CmdArgs.push_back("+single-float");
929 }
930 else {
931 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +0000932 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000933 CmdArgs.push_back("-mfloat-abi");
934 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +0000935 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +0000936
Simon Atanasyandc536f52012-07-05 18:51:43 +0000937 AddTargetFeature(Args, CmdArgs,
938 options::OPT_mips16, options::OPT_mno_mips16,
939 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +0000940 AddTargetFeature(Args, CmdArgs,
941 options::OPT_mdsp, options::OPT_mno_dsp,
942 "dsp");
943 AddTargetFeature(Args, CmdArgs,
944 options::OPT_mdspr2, options::OPT_mno_dspr2,
945 "dspr2");
Simon Atanasyan9804b762012-08-27 20:55:56 +0000946
947 if (Arg *A = Args.getLastArg(options::OPT_G)) {
948 StringRef v = A->getValue(Args);
949 CmdArgs.push_back("-mllvm");
950 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
951 A->claim();
952 }
Eric Christophered734732010-03-02 02:41:08 +0000953}
954
Hal Finkel02a84272012-06-11 22:35:19 +0000955/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
956static std::string getPPCTargetCPU(const ArgList &Args) {
957 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
958 StringRef CPUName = A->getValue(Args);
959
960 if (CPUName == "native") {
961 std::string CPU = llvm::sys::getHostCPUName();
962 if (!CPU.empty() && CPU != "generic")
963 return CPU;
964 else
965 return "";
966 }
967
968 return llvm::StringSwitch<const char *>(CPUName)
969 .Case("common", "generic")
970 .Case("440", "440")
971 .Case("440fp", "440")
972 .Case("450", "450")
973 .Case("601", "601")
974 .Case("602", "602")
975 .Case("603", "603")
976 .Case("603e", "603e")
977 .Case("603ev", "603ev")
978 .Case("604", "604")
979 .Case("604e", "604e")
980 .Case("620", "620")
981 .Case("G3", "g3")
982 .Case("7400", "7400")
983 .Case("G4", "g4")
984 .Case("7450", "7450")
985 .Case("G4+", "g4+")
986 .Case("750", "750")
987 .Case("970", "970")
988 .Case("G5", "g5")
989 .Case("a2", "a2")
Hal Finkel7de32962012-09-18 22:25:03 +0000990 .Case("e500mc", "e500mc")
991 .Case("e5500", "e5500")
Hal Finkel02a84272012-06-11 22:35:19 +0000992 .Case("power6", "pwr6")
993 .Case("power7", "pwr7")
994 .Case("powerpc", "ppc")
995 .Case("powerpc64", "ppc64")
996 .Default("");
997 }
998
999 return "";
1000}
1001
1002void Clang::AddPPCTargetArgs(const ArgList &Args,
1003 ArgStringList &CmdArgs) const {
1004 std::string TargetCPUName = getPPCTargetCPU(Args);
1005
1006 // LLVM may default to generating code for the native CPU,
1007 // but, like gcc, we default to a more generic option for
1008 // each architecture. (except on Darwin)
1009 llvm::Triple Triple = getToolChain().getTriple();
1010 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1011 if (Triple.getArch() == llvm::Triple::ppc64)
1012 TargetCPUName = "ppc64";
1013 else
1014 TargetCPUName = "ppc";
1015 }
1016
1017 if (!TargetCPUName.empty()) {
1018 CmdArgs.push_back("-target-cpu");
1019 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1020 }
1021}
1022
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001023void Clang::AddSparcTargetArgs(const ArgList &Args,
1024 ArgStringList &CmdArgs) const {
1025 const Driver &D = getToolChain().getDriver();
1026
1027 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001028 CmdArgs.push_back("-target-cpu");
Benjamin Kramera11d3092011-12-26 14:18:37 +00001029 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001030 }
1031
1032 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001033 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001034 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1035 options::OPT_mhard_float)) {
1036 if (A->getOption().matches(options::OPT_msoft_float))
1037 FloatABI = "soft";
1038 else if (A->getOption().matches(options::OPT_mhard_float))
1039 FloatABI = "hard";
1040 }
1041
1042 // If unspecified, choose the default based on the platform.
1043 if (FloatABI.empty()) {
1044 switch (getToolChain().getTriple().getOS()) {
1045 default:
1046 // Assume "soft", but warn the user we are guessing.
1047 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +00001048 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001049 break;
1050 }
1051 }
1052
1053 if (FloatABI == "soft") {
1054 // Floating point operations and argument passing are soft.
1055 //
1056 // FIXME: This changes CPP defines, we need -target-soft-float.
1057 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001058 CmdArgs.push_back("-target-feature");
1059 CmdArgs.push_back("+soft-float");
1060 } else {
1061 assert(FloatABI == "hard" && "Invalid float abi!");
1062 CmdArgs.push_back("-mhard-float");
1063 }
1064}
1065
Daniel Dunbar6acda162009-09-09 22:33:08 +00001066void Clang::AddX86TargetArgs(const ArgList &Args,
1067 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001068 if (!Args.hasFlag(options::OPT_mred_zone,
1069 options::OPT_mno_red_zone,
1070 true) ||
1071 Args.hasArg(options::OPT_mkernel) ||
1072 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001073 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001074
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001075 if (Args.hasFlag(options::OPT_msoft_float,
1076 options::OPT_mno_soft_float,
1077 false))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001078 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001079
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001080 const char *CPUName = 0;
Daniel Dunbar6acda162009-09-09 22:33:08 +00001081 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001082 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001083 // FIXME: Reject attempts to use -march=native unless the target matches
1084 // the host.
1085 //
1086 // FIXME: We should also incorporate the detected target features for use
1087 // with -native.
1088 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone0cc3092012-05-09 17:53:10 +00001089 if (!CPU.empty() && CPU != "generic")
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001090 CPUName = Args.MakeArgString(CPU);
1091 } else
1092 CPUName = A->getValue(Args);
1093 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001094
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001095 // Select the default CPU if none was given (or detection failed).
1096 if (!CPUName) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00001097 // FIXME: Need target hooks.
Bob Wilson905c45f2011-10-14 05:03:44 +00001098 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001099 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001100 CPUName = "core2";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001101 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001102 CPUName = "yonah";
Chris Lattner86ed3a32010-04-11 19:29:39 +00001103 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001104 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001105 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001106 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001107 CPUName = "i586";
Daniel Dunbar95c04572010-08-01 23:13:54 +00001108 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001109 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001110 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001111 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001112 CPUName = "i486";
Eli Friedman42f74f22012-08-08 23:57:20 +00001113 } else if (getToolChain().getOS().startswith("bitrig")) {
1114 if (getToolChain().getArch() == llvm::Triple::x86_64)
1115 CPUName = "x86-64";
1116 else if (getToolChain().getArch() == llvm::Triple::x86)
1117 CPUName = "i686";
Roman Divacky451f8ca2011-03-01 18:11:37 +00001118 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001119 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001120 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001121 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001122 CPUName = "i486";
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001123 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001124 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001125 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001126 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001127 CPUName = "i486";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001128 } else {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001129 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001130 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001131 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001132 CPUName = "pentium4";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001133 }
1134 }
1135
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001136 if (CPUName) {
Daniel Dunbar38b48af2009-12-18 06:30:12 +00001137 CmdArgs.push_back("-target-cpu");
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001138 CmdArgs.push_back(CPUName);
1139 }
1140
Eli Friedmand18eeca2011-07-02 00:34:19 +00001141 // The required algorithm here is slightly strange: the options are applied
1142 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1143 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1144 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1145 // former correctly, but not the latter; handle directly-overridden
1146 // attributes here.
1147 llvm::StringMap<unsigned> PrevFeature;
1148 std::vector<const char*> Features;
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001149 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1150 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001151 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001152 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001153
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001154 // Skip over "-m".
1155 assert(Name.startswith("-m") && "Invalid feature name.");
1156 Name = Name.substr(2);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001157
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001158 bool IsNegative = Name.startswith("no-");
1159 if (IsNegative)
1160 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001161
Eli Friedmand18eeca2011-07-02 00:34:19 +00001162 unsigned& Prev = PrevFeature[Name];
1163 if (Prev)
1164 Features[Prev - 1] = 0;
1165 Prev = Features.size() + 1;
1166 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1167 }
1168 for (unsigned i = 0; i < Features.size(); i++) {
1169 if (Features[i]) {
1170 CmdArgs.push_back("-target-feature");
1171 CmdArgs.push_back(Features[i]);
1172 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001173 }
1174}
1175
Tony Linthicum96319392011-12-12 21:14:55 +00001176static Arg* getLastHexagonArchArg (const ArgList &Args)
1177{
1178 Arg * A = NULL;
1179
Sebastian Pop43115d42012-01-13 20:37:10 +00001180 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1181 it != ie; ++it) {
1182 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum96319392011-12-12 21:14:55 +00001183 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1184 A = *it;
1185 A->claim();
1186 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001187 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1188 StringRef Value = (*it)->getValue(Args,0);
1189 if (Value.startswith("v")) {
1190 A = *it;
1191 A->claim();
1192 }
1193 }
Tony Linthicum96319392011-12-12 21:14:55 +00001194 }
1195 return A;
1196}
1197
Sebastian Pop43115d42012-01-13 20:37:10 +00001198static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum96319392011-12-12 21:14:55 +00001199{
1200 Arg *A;
1201 llvm::StringRef WhichHexagon;
1202
Sebastian Pop43115d42012-01-13 20:37:10 +00001203 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum96319392011-12-12 21:14:55 +00001204 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop43115d42012-01-13 20:37:10 +00001205 WhichHexagon = A->getValue(Args);
1206 if (WhichHexagon == "")
1207 return "v4";
1208 else
1209 return WhichHexagon;
Tony Linthicum96319392011-12-12 21:14:55 +00001210 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001211 else
1212 return "v4";
Tony Linthicum96319392011-12-12 21:14:55 +00001213}
1214
1215void Clang::AddHexagonTargetArgs(const ArgList &Args,
1216 ArgStringList &CmdArgs) const {
1217 llvm::Triple Triple = getToolChain().getTriple();
1218
1219 CmdArgs.push_back("-target-cpu");
Sebastian Pop43115d42012-01-13 20:37:10 +00001220 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00001221 CmdArgs.push_back("-fno-signed-char");
1222 CmdArgs.push_back("-nobuiltininc");
1223
Sirish Pande5f9688b2012-05-10 20:19:54 +00001224 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum96319392011-12-12 21:14:55 +00001225 CmdArgs.push_back("-mqdsp6-compat");
1226
1227 if (Arg *A = Args.getLastArg(options::OPT_G,
1228 options::OPT_msmall_data_threshold_EQ)) {
1229 std::string SmallDataThreshold="-small-data-threshold=";
1230 SmallDataThreshold += A->getValue(Args);
1231 CmdArgs.push_back ("-mllvm");
1232 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1233 A->claim();
1234 }
1235
Sirish Pande5f9688b2012-05-10 20:19:54 +00001236 if (!Args.hasArg(options::OPT_fno_short_enums))
1237 CmdArgs.push_back("-fshort-enums");
1238 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1239 CmdArgs.push_back ("-mllvm");
1240 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1241 }
Tony Linthicum96319392011-12-12 21:14:55 +00001242 CmdArgs.push_back ("-mllvm");
1243 CmdArgs.push_back ("-machine-sink-split=0");
1244}
1245
Eric Christopher88b7cf02011-08-19 00:30:14 +00001246static bool
John McCall260611a2012-06-20 06:18:46 +00001247shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001248 const llvm::Triple &Triple) {
1249 // We use the zero-cost exception tables for Objective-C if the non-fragile
1250 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1251 // later.
John McCall260611a2012-06-20 06:18:46 +00001252 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001253 return true;
1254
Bob Wilson905c45f2011-10-14 05:03:44 +00001255 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001256 return false;
1257
Eric Christopheraa7333c2011-07-02 00:20:22 +00001258 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001259 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001260 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001261}
1262
Anders Carlsson15348ae2011-02-28 02:27:16 +00001263/// addExceptionArgs - Adds exception related arguments to the driver command
1264/// arguments. There's a master flag, -fexceptions and also language specific
1265/// flags to enable/disable C++ and Objective-C exceptions.
1266/// This makes it possible to for example disable C++ exceptions but enable
1267/// Objective-C exceptions.
1268static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1269 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001270 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001271 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001272 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001273 if (KernelOrKext) {
1274 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1275 // arguments now to avoid warnings about unused arguments.
1276 Args.ClaimAllArgs(options::OPT_fexceptions);
1277 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1278 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1279 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1280 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1281 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001282 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001283 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001284
1285 // Exceptions are enabled by default.
1286 bool ExceptionsEnabled = true;
1287
1288 // This keeps track of whether exceptions were explicitly turned on or off.
1289 bool DidHaveExplicitExceptionFlag = false;
1290
Rafael Espindolaf759df02009-10-01 13:33:33 +00001291 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1292 options::OPT_fno_exceptions)) {
1293 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001294 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001295 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001296 ExceptionsEnabled = false;
1297
1298 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001299 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001300
Anders Carlsson15348ae2011-02-28 02:27:16 +00001301 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001302
Anders Carlsson15348ae2011-02-28 02:27:16 +00001303 // Exception tables and cleanups can be enabled with -fexceptions even if the
1304 // language itself doesn't support exceptions.
1305 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1306 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001307
Daniel Dunbard47ea692011-03-17 23:28:31 +00001308 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1309 // is not necessarily sensible, but follows GCC.
1310 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001311 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001312 options::OPT_fno_objc_exceptions,
1313 true)) {
1314 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001315
Eric Christopher88b7cf02011-08-19 00:30:14 +00001316 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001317 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001318 }
1319
1320 if (types::isCXX(InputType)) {
1321 bool CXXExceptionsEnabled = ExceptionsEnabled;
1322
Eric Christopher88b7cf02011-08-19 00:30:14 +00001323 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1324 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001325 options::OPT_fexceptions,
1326 options::OPT_fno_exceptions)) {
1327 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1328 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001329 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001330 CXXExceptionsEnabled = false;
1331 }
1332
1333 if (CXXExceptionsEnabled) {
1334 CmdArgs.push_back("-fcxx-exceptions");
1335
1336 ShouldUseExceptionTables = true;
1337 }
1338 }
1339
1340 if (ShouldUseExceptionTables)
1341 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001342}
1343
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001344static bool ShouldDisableCFI(const ArgList &Args,
1345 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001346 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001347 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001348 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001349 // we disable them if we think the .s file will be passed to it.
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001350 Default = Args.hasFlag(options::OPT_integrated_as,
1351 options::OPT_no_integrated_as,
1352 TC.IsIntegratedAssemblerDefault());
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001353 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001354 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1355 options::OPT_fno_dwarf2_cfi_asm,
1356 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001357}
1358
Nick Lewyckyea523d72011-10-17 23:05:52 +00001359static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1360 const ToolChain &TC) {
1361 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1362 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1363 options::OPT_no_integrated_as,
1364 IsIADefault);
1365 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1366 options::OPT_fno_dwarf_directory_asm,
1367 UseIntegratedAs);
1368 return !UseDwarfDirectory;
1369}
1370
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001371/// \brief Check whether the given input tree contains any compilation actions.
1372static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001373 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001374 return true;
1375
1376 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1377 if (ContainsCompileAction(*it))
1378 return true;
1379
1380 return false;
1381}
1382
1383/// \brief Check if -relax-all should be passed to the internal assembler.
1384/// This is done by default when compiling non-assembler source with -O0.
1385static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1386 bool RelaxDefault = true;
1387
1388 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1389 RelaxDefault = A->getOption().matches(options::OPT_O0);
1390
1391 if (RelaxDefault) {
1392 RelaxDefault = false;
1393 for (ActionList::const_iterator it = C.getActions().begin(),
1394 ie = C.getActions().end(); it != ie; ++it) {
1395 if (ContainsCompileAction(*it)) {
1396 RelaxDefault = true;
1397 break;
1398 }
1399 }
1400 }
1401
1402 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1403 RelaxDefault);
1404}
1405
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001406/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1407/// This needs to be called before we add the C run-time (malloc, etc).
1408static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001409 ArgStringList &CmdArgs) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001410 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001411 options::OPT_fno_address_sanitizer, false))
1412 return;
Logan Chien94a71422012-09-02 09:30:11 +00001413 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001414 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanov83738622012-06-04 11:15:05 +00001415 if (!Args.hasArg(options::OPT_pie))
1416 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001417 }
Daniel Dunbar8cd0d252011-12-07 23:22:17 +00001418
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001419 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1420 llvm::sys::path::append(LibAsan, "lib", "linux",
1421 (Twine("libclang_rt.asan-") +
1422 TC.getArchName() + "-android.so"));
1423 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001424 } else {
1425 if (!Args.hasArg(options::OPT_shared)) {
1426 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1427 // resource directory.
1428 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1429 llvm::sys::path::append(LibAsan, "lib", "linux",
1430 (Twine("libclang_rt.asan-") +
1431 TC.getArchName() + ".a"));
1432 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1433 CmdArgs.push_back("-lpthread");
1434 CmdArgs.push_back("-ldl");
1435 CmdArgs.push_back("-export-dynamic");
1436 }
1437 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001438}
1439
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001440/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1441/// This needs to be called before we add the C run-time (malloc, etc).
1442static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1443 ArgStringList &CmdArgs) {
1444 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1445 options::OPT_fno_thread_sanitizer, false))
1446 return;
1447 if (!Args.hasArg(options::OPT_shared)) {
1448 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1449 // resource directory.
1450 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1451 llvm::sys::path::append(LibTsan, "lib", "linux",
1452 (Twine("libclang_rt.tsan-") +
1453 TC.getArchName() + ".a"));
1454 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1455 CmdArgs.push_back("-lpthread");
1456 CmdArgs.push_back("-ldl");
1457 CmdArgs.push_back("-export-dynamic");
1458 }
1459}
1460
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001461static bool shouldUseFramePointer(const ArgList &Args,
1462 const llvm::Triple &Triple) {
1463 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1464 options::OPT_fomit_frame_pointer))
1465 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1466
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001467 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001468 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1469 Triple.getArch() == llvm::Triple::x86) &&
1470 Triple.getOS() == llvm::Triple::Linux) {
1471 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1472 if (!A->getOption().matches(options::OPT_O0))
1473 return false;
1474 }
1475
1476 return true;
1477}
1478
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001479void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001480 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001481 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001482 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001483 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001484 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1485 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001486 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001487 ArgStringList CmdArgs;
1488
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001489 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1490
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001491 // Invoke ourselves in -cc1 mode.
1492 //
1493 // FIXME: Implement custom jobs for internal actions.
1494 CmdArgs.push_back("-cc1");
1495
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001496 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001497 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001498 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001499 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001500
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001501 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001502 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001503
Daniel Dunbar1d460332009-03-18 10:01:51 +00001504 if (isa<AnalyzeJobAction>(JA)) {
1505 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1506 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001507 } else if (isa<MigrateJobAction>(JA)) {
1508 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001509 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001510 if (Output.getType() == types::TY_Dependencies)
1511 CmdArgs.push_back("-Eonly");
1512 else
1513 CmdArgs.push_back("-E");
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001514 } else if (isa<AssembleJobAction>(JA)) {
1515 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001516
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001517 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001518 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001519
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001520 // When using an integrated assembler, translate -Wa, and -Xassembler
1521 // options.
1522 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1523 options::OPT_Xassembler),
1524 ie = Args.filtered_end(); it != ie; ++it) {
1525 const Arg *A = *it;
1526 A->claim();
1527
1528 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001529 StringRef Value = A->getValue(Args, i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001530
1531 if (Value == "-force_cpusubtype_ALL") {
1532 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001533 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001534 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001535 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001536 CmdArgs.push_back("-mllvm");
1537 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001538 } else if (Value == "--noexecstack") {
1539 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001540 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001541 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001542 << A->getOption().getName() << Value;
1543 }
1544 }
1545 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001546
1547 // Also ignore explicit -force_cpusubtype_ALL option.
1548 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001549 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001550 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001551 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001552
Aaron Ballman761322b2012-07-31 01:21:00 +00001553 if (JA.getType() == types::TY_Nothing)
1554 CmdArgs.push_back("-fsyntax-only");
1555 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001556 CmdArgs.push_back("-emit-pch");
1557 else
1558 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001559 } else {
1560 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001561
Daniel Dunbar1d460332009-03-18 10:01:51 +00001562 if (JA.getType() == types::TY_Nothing) {
1563 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001564 } else if (JA.getType() == types::TY_LLVM_IR ||
1565 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001566 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001567 } else if (JA.getType() == types::TY_LLVM_BC ||
1568 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001569 CmdArgs.push_back("-emit-llvm-bc");
1570 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001571 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001572 } else if (JA.getType() == types::TY_AST) {
1573 CmdArgs.push_back("-emit-pch");
Daniel Dunbar64952502010-02-11 03:16:21 +00001574 } else if (JA.getType() == types::TY_RewrittenObjC) {
1575 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001576 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001577 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1578 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001579 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001580 } else {
1581 assert(JA.getType() == types::TY_PP_Asm &&
1582 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001583 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001584 }
1585
Daniel Dunbar1d460332009-03-18 10:01:51 +00001586 // The make clang go fast button.
1587 CmdArgs.push_back("-disable-free");
1588
John McCallb689afb2010-02-13 03:50:24 +00001589 // Disable the verification pass in -asserts builds.
1590#ifdef NDEBUG
1591 CmdArgs.push_back("-disable-llvm-verifier");
1592#endif
1593
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001594 // Set the main file name, so that debug info works even with
1595 // -save-temps.
1596 CmdArgs.push_back("-main-file-name");
1597 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1598
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001599 // Some flags which affect the language (via preprocessor
1600 // defines). See darwin::CC1::AddCPPArgs.
1601 if (Args.hasArg(options::OPT_static))
1602 CmdArgs.push_back("-static-define");
1603
Daniel Dunbar1d460332009-03-18 10:01:51 +00001604 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001605 // Enable region store model by default.
1606 CmdArgs.push_back("-analyzer-store=region");
1607
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001608 // Treat blocks as analysis entry points.
1609 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1610
Ted Kremenek51885072011-03-24 00:28:47 +00001611 CmdArgs.push_back("-analyzer-eagerly-assume");
1612
Daniel Dunbar1d460332009-03-18 10:01:51 +00001613 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001614 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001615 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001616
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001617 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1618 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001619
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001620 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001621 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001622
1623 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001624
1625 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00001626 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1627 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1628 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1629 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1630 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1631 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001632 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001633
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001634 // Set the output format. The default is plist, for (lame) historical
1635 // reasons.
1636 CmdArgs.push_back("-analyzer-output");
1637 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1638 CmdArgs.push_back(A->getValue(Args));
1639 else
1640 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001641
Ted Kremenek0647a7b2010-03-22 22:32:05 +00001642 // Disable the presentation of standard compiler warnings when
1643 // using --analyze. We only want to show static analyzer diagnostics
1644 // or frontend errors.
1645 CmdArgs.push_back("-w");
1646
Daniel Dunbar1d460332009-03-18 10:01:51 +00001647 // Add -Xanalyzer arguments when running as analyzer.
1648 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00001649 }
1650
Daniel Dunbare2fd6642009-09-10 01:21:12 +00001651 CheckCodeGenerationOptions(D, Args);
1652
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001653 // Perform argument translation for LLVM backend. This
1654 // takes some care in reconciling with llvm-gcc. The
1655 // issue is that llvm-gcc translates these options based on
1656 // the values in cc1, whereas we are processing based on
1657 // the driver arguments.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001658
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001659 // This comes from the default translation the driver + cc1
1660 // would do to enable flag_pic.
Simon Atanasyan003ab662012-05-29 18:50:33 +00001661
1662 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1663 options::OPT_fpic, options::OPT_fno_pic,
1664 options::OPT_fPIE, options::OPT_fno_PIE,
1665 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001666 bool PICDisabled = false;
1667 bool PICEnabled = false;
1668 bool PICForPIE = false;
1669 if (LastPICArg) {
1670 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1671 LastPICArg->getOption().matches(options::OPT_fpie));
1672 PICEnabled = (PICForPIE ||
1673 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1674 LastPICArg->getOption().matches(options::OPT_fpic));
1675 PICDisabled = !PICEnabled;
1676 }
1677 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1678 // PIC or PIE options above, if these show up, PIC is disabled.
1679 if (Args.hasArg(options::OPT_mkernel))
1680 PICDisabled = true;
1681 if (Args.hasArg(options::OPT_static))
1682 PICDisabled = true;
1683 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1684
1685 // Select the relocation model.
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001686 const char *Model = getToolChain().GetForcedPicModel();
1687 if (!Model) {
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001688 if (DynamicNoPIC)
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001689 Model = "dynamic-no-pic";
1690 else if (PICDisabled)
1691 Model = "static";
1692 else if (PICEnabled)
1693 Model = "pic";
Daniel Dunbar1d460332009-03-18 10:01:51 +00001694 else
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001695 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbar1d460332009-03-18 10:01:51 +00001696 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001697 StringRef ModelStr = Model ? Model : "";
1698 if (Model && ModelStr != "pic") {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001699 CmdArgs.push_back("-mrelocation-model");
1700 CmdArgs.push_back(Model);
1701 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001702
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001703 // Infer the __PIC__ and __PIE__ values.
1704 if (ModelStr == "pic" && PICForPIE) {
1705 CmdArgs.push_back("-pie-level");
1706 CmdArgs.push_back((LastPICArg &&
1707 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1708 "2" : "1");
1709 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar76743522009-11-29 02:39:08 +00001710 CmdArgs.push_back("-pic-level");
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001711 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1712 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1713 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001714 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001715
Tanya Lattner59876c22009-11-04 01:18:09 +00001716 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1717 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00001718 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001719
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001720 // LLVM Code Generator Options.
1721
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001722 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1723 CmdArgs.push_back("-mregparm");
1724 CmdArgs.push_back(A->getValue(Args));
1725 }
1726
Roman Divackycfe9af22011-03-01 17:40:53 +00001727 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1728 CmdArgs.push_back("-mrtd");
1729
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001730 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001731 CmdArgs.push_back("-mdisable-fp-elim");
1732 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1733 options::OPT_fno_zero_initialized_in_bss))
1734 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar398c6102011-02-04 02:20:39 +00001735 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1736 options::OPT_fno_strict_aliasing,
1737 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00001738 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00001739 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1740 false))
1741 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00001742 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1743 options::OPT_fno_optimize_sibling_calls))
1744 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001745
Chandler Carruthabf07a72012-01-02 14:19:45 +00001746 // Handle various floating point optimization flags, mapping them to the
1747 // appropriate LLVM code generation flags. The pattern for all of these is to
1748 // default off the codegen optimizations, and if any flag enables them and no
1749 // flag disables them after the flag enabling them, enable the codegen
1750 // optimization. This is complicated by several "umbrella" flags.
1751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001752 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001753 options::OPT_ffinite_math_only,
1754 options::OPT_fno_finite_math_only,
1755 options::OPT_fhonor_infinities,
1756 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001757 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1758 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001759 A->getOption().getID() != options::OPT_fhonor_infinities)
1760 CmdArgs.push_back("-menable-no-infs");
1761 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001762 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001763 options::OPT_ffinite_math_only,
1764 options::OPT_fno_finite_math_only,
1765 options::OPT_fhonor_nans,
1766 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001767 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1768 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001769 A->getOption().getID() != options::OPT_fhonor_nans)
1770 CmdArgs.push_back("-menable-no-nans");
1771
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00001772 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1773 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruthabf07a72012-01-02 14:19:45 +00001774 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001775 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001776 options::OPT_fmath_errno,
Chandler Carruth4f50c502012-04-26 02:10:51 +00001777 options::OPT_fno_math_errno))
1778 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1779 if (MathErrno)
1780 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001781
1782 // There are several flags which require disabling very specific
1783 // optimizations. Any of these being disabled forces us to turn off the
1784 // entire set of LLVM optimizations, so collect them through all the flag
1785 // madness.
1786 bool AssociativeMath = false;
1787 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001788 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001789 options::OPT_funsafe_math_optimizations,
1790 options::OPT_fno_unsafe_math_optimizations,
1791 options::OPT_fassociative_math,
1792 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001793 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1794 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001795 A->getOption().getID() != options::OPT_fno_associative_math)
1796 AssociativeMath = true;
1797 bool ReciprocalMath = false;
1798 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001799 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001800 options::OPT_funsafe_math_optimizations,
1801 options::OPT_fno_unsafe_math_optimizations,
1802 options::OPT_freciprocal_math,
1803 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001804 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1805 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001806 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1807 ReciprocalMath = true;
1808 bool SignedZeros = true;
1809 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001810 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001811 options::OPT_funsafe_math_optimizations,
1812 options::OPT_fno_unsafe_math_optimizations,
1813 options::OPT_fsigned_zeros,
1814 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001815 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1816 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001817 A->getOption().getID() != options::OPT_fsigned_zeros)
1818 SignedZeros = false;
1819 bool TrappingMath = true;
1820 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001821 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001822 options::OPT_funsafe_math_optimizations,
1823 options::OPT_fno_unsafe_math_optimizations,
1824 options::OPT_ftrapping_math,
1825 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001826 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1827 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001828 A->getOption().getID() != options::OPT_ftrapping_math)
1829 TrappingMath = false;
1830 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1831 !TrappingMath)
1832 CmdArgs.push_back("-menable-unsafe-fp-math");
1833
Lang Hamesc9686712012-07-06 00:59:19 +00001834
1835 // Validate and pass through -fp-contract option.
1836 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001837 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00001838 options::OPT_ffp_contract)) {
1839 if (A->getOption().getID() == options::OPT_ffp_contract) {
1840 StringRef Val = A->getValue(Args);
1841 if (Val == "fast" || Val == "on" || Val == "off") {
1842 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1843 } else {
1844 D.Diag(diag::err_drv_unsupported_option_argument)
1845 << A->getOption().getName() << Val;
1846 }
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001847 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesc9686712012-07-06 00:59:19 +00001848 // If fast-math is set then set the fp-contract mode to fast.
1849 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1850 }
1851 }
1852
Bob Wilson455e72e2012-07-19 03:52:53 +00001853 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1854 // and if we find them, tell the frontend to provide the appropriate
1855 // preprocessor macros. This is distinct from enabling any optimizations as
1856 // these options induce language changes which must survive serialization
1857 // and deserialization, etc.
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001858 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1859 if (A->getOption().matches(options::OPT_ffast_math))
1860 CmdArgs.push_back("-ffast-math");
1861 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1862 if (A->getOption().matches(options::OPT_ffinite_math_only))
1863 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001864
Daniel Dunbar1b718482010-05-14 22:00:22 +00001865 // Decide whether to use verbose asm. Verbose assembly is the default on
1866 // toolchains which have the integrated assembler on by default.
1867 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1868 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00001869 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00001870 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001871 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001872
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001873 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1874 CmdArgs.push_back("-mdebug-pass");
1875 CmdArgs.push_back("Structure");
1876 }
1877 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1878 CmdArgs.push_back("-mdebug-pass");
1879 CmdArgs.push_back("Arguments");
1880 }
1881
John McCalld0c2ec42010-02-19 02:45:38 +00001882 // Enable -mconstructor-aliases except on darwin, where we have to
1883 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00001884 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00001885 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00001886
John McCall32096692011-03-18 02:56:14 +00001887 // Darwin's kernel doesn't support guard variables; just die if we
1888 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00001889 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00001890 CmdArgs.push_back("-fforbid-guard-variables");
1891
Douglas Gregor6f755502011-02-01 15:15:22 +00001892 if (Args.hasArg(options::OPT_mms_bitfields)) {
1893 CmdArgs.push_back("-mms-bitfields");
1894 }
John McCalld0c2ec42010-02-19 02:45:38 +00001895
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001896 // This is a coarse approximation of what llvm-gcc actually does, both
1897 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1898 // complicated ways.
1899 bool AsynchronousUnwindTables =
1900 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1901 options::OPT_fno_asynchronous_unwind_tables,
1902 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001903 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001904 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1905 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001906 CmdArgs.push_back("-munwind-tables");
1907
Rafael Espindola8af669f2012-06-19 01:26:10 +00001908 getToolChain().addClangTargetOptions(CmdArgs);
1909
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001910 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1911 CmdArgs.push_back("-mlimit-float-precision");
1912 CmdArgs.push_back(A->getValue(Args));
1913 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001914
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001915 // FIXME: Handle -mtune=.
1916 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001917
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001918 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001919 CmdArgs.push_back("-mcode-model");
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001920 CmdArgs.push_back(A->getValue(Args));
1921 }
1922
Daniel Dunbar6acda162009-09-09 22:33:08 +00001923 // Add target specific cpu and features flags.
1924 switch(getToolChain().getTriple().getArch()) {
1925 default:
1926 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001927
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001928 case llvm::Triple::arm:
1929 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00001930 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001931 break;
1932
Eric Christophered734732010-03-02 02:41:08 +00001933 case llvm::Triple::mips:
1934 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00001935 case llvm::Triple::mips64:
1936 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00001937 AddMIPSTargetArgs(Args, CmdArgs);
1938 break;
1939
Hal Finkel02a84272012-06-11 22:35:19 +00001940 case llvm::Triple::ppc:
1941 case llvm::Triple::ppc64:
1942 AddPPCTargetArgs(Args, CmdArgs);
1943 break;
1944
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001945 case llvm::Triple::sparc:
1946 AddSparcTargetArgs(Args, CmdArgs);
1947 break;
1948
Daniel Dunbar6acda162009-09-09 22:33:08 +00001949 case llvm::Triple::x86:
1950 case llvm::Triple::x86_64:
1951 AddX86TargetArgs(Args, CmdArgs);
1952 break;
Tony Linthicum96319392011-12-12 21:14:55 +00001953
1954 case llvm::Triple::hexagon:
1955 AddHexagonTargetArgs(Args, CmdArgs);
1956 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001957 }
1958
Tony Linthicum96319392011-12-12 21:14:55 +00001959
1960
Daniel Dunbarc176bc62010-08-11 23:07:47 +00001961 // Pass the linker version in use.
1962 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1963 CmdArgs.push_back("-target-linker-version");
1964 CmdArgs.push_back(A->getValue(Args));
1965 }
1966
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001967 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbar1ad66482010-07-01 01:31:45 +00001968 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00001969 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson905c45f2011-10-14 05:03:44 +00001970 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00001971 CmdArgs.push_back("-momit-leaf-frame-pointer");
1972
Daniel Dunbarb30575c2010-05-12 18:19:58 +00001973 // Explicitly error on some things we know we don't support and can't just
1974 // ignore.
1975 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00001976 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1977 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00001978 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00001979 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00001980 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00001981 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1982 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00001983 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00001984 << Unsupported->getOption().getName();
1985 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00001986 }
1987
Daniel Dunbar1d460332009-03-18 10:01:51 +00001988 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00001989 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00001990 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00001991 CmdArgs.push_back("-header-include-file");
1992 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1993 D.CCPrintHeadersFilename : "-");
1994 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00001995 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00001996 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001997
Chad Rosier2b819102011-08-02 17:58:04 +00001998 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00001999 CmdArgs.push_back("-diagnostic-log-file");
2000 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2001 D.CCLogDiagnosticsFilename : "-");
2002 }
2003
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002004 // Use the last option from "-g" group. "-gline-tables-only" is
2005 // preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002006 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002007 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2008 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2009 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002010 } else if (!A->getOption().matches(options::OPT_g0) &&
2011 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00002012 CmdArgs.push_back("-g");
Chad Rosier2875bda2011-11-04 19:28:44 +00002013 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002014 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002015
Alexey Samsonov7f326072012-06-21 08:22:39 +00002016 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2017 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2018
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002019 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2020 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2021
Chris Lattner7255a2d2010-06-22 00:03:40 +00002022 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2023
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002024 if (Args.hasArg(options::OPT_ftest_coverage) ||
2025 Args.hasArg(options::OPT_coverage))
2026 CmdArgs.push_back("-femit-coverage-notes");
2027 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2028 Args.hasArg(options::OPT_coverage))
2029 CmdArgs.push_back("-femit-coverage-data");
2030
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002031 if (C.getArgs().hasArg(options::OPT_c) ||
2032 C.getArgs().hasArg(options::OPT_S)) {
2033 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002034 CmdArgs.push_back("-coverage-file");
Bill Wendlingecbbea42012-08-30 00:43:41 +00002035 SmallString<128> absFilename(Output.getFilename());
2036 llvm::sys::fs::make_absolute(absFilename);
2037 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002038 }
2039 }
2040
Daniel Dunbara268fc02011-10-11 18:20:10 +00002041 // Pass options for controlling the default header search paths.
2042 if (Args.hasArg(options::OPT_nostdinc)) {
2043 CmdArgs.push_back("-nostdsysteminc");
2044 CmdArgs.push_back("-nobuiltininc");
2045 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002046 if (Args.hasArg(options::OPT_nostdlibinc))
2047 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002048 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2049 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2050 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002051
Daniel Dunbar5f122322009-12-15 01:02:52 +00002052 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002053 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002054 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002055
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002056 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2057
Ted Kremenek30660a82012-03-06 20:06:33 +00002058 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002059 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002060 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002061 options::OPT_ccc_arcmt_modify,
2062 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002063 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002064 switch (A->getOption().getID()) {
2065 default:
2066 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002067 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002068 CmdArgs.push_back("-arcmt-check");
2069 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002070 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002071 CmdArgs.push_back("-arcmt-modify");
2072 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002073 case options::OPT_ccc_arcmt_migrate:
2074 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002075 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002076 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002077
2078 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2079 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002080 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002081 }
2082 }
2083 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002084
Ted Kremenek30660a82012-03-06 20:06:33 +00002085 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2086 if (ARCMTEnabled) {
2087 D.Diag(diag::err_drv_argument_not_allowed_with)
2088 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2089 }
2090 CmdArgs.push_back("-mt-migrate-directory");
2091 CmdArgs.push_back(A->getValue(Args));
2092
2093 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2094 options::OPT_objcmt_migrate_subscripting)) {
2095 // None specified, means enable them all.
2096 CmdArgs.push_back("-objcmt-migrate-literals");
2097 CmdArgs.push_back("-objcmt-migrate-subscripting");
2098 } else {
2099 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2100 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2101 }
2102 }
2103
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002104 // Add preprocessing options like -I, -D, etc. if we are using the
2105 // preprocessor.
2106 //
2107 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002108 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne54db68b2011-11-06 00:40:05 +00002109 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002110
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002111 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2112 // that "The compiler can only warn and ignore the option if not recognized".
2113 // When building with ccache, it will pass -D options to clang even on
2114 // preprocessed inputs and configure concludes that -fPIC is not supported.
2115 Args.ClaimAllArgs(options::OPT_D);
2116
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002117 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002118 // others.
2119 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002120 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002121 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002122 else if (A->getOption().matches(options::OPT_O) &&
2123 A->getValue(Args)[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002124 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002125 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002126 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002127 }
2128
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002129 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002130 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2131 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002132 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002133 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002134
2135 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2136 // (-ansi is equivalent to -std=c89).
2137 //
2138 // If a std is supplied, only add -trigraphs if it follows the
2139 // option.
2140 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2141 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002142 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002143 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002144 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002145 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002146 else
2147 Std->render(Args, CmdArgs);
2148
Daniel Dunbar0e100312010-06-14 21:23:08 +00002149 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2150 options::OPT_trigraphs))
2151 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002152 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002153 } else {
2154 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002155 //
2156 // FIXME: Clang doesn't correctly handle -std= when the input language
2157 // doesn't match. For the time being just ignore this for C++ inputs;
2158 // eventually we want to do all the standard defaulting here instead of
2159 // splitting it between the driver and clang -cc1.
2160 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002161 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2162 "-std=", /*Joined=*/true);
2163 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2164 CmdArgs.push_back("-std=c++11");
2165
Daniel Dunbard573d262009-04-07 22:13:21 +00002166 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002167 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002168
Chandler Carruth50465d12011-04-23 06:30:43 +00002169 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2170 // '-fconst-strings'; this better indicates its actual behavior.
2171 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2172 false)) {
2173 // For perfect compatibility with GCC, we do this even in the presence of
2174 // '-w'. This flag names something other than a warning for GCC.
2175 CmdArgs.push_back("-fconst-strings");
2176 }
2177
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002178 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002179 // during C++ compilation, which it is by default. GCC keeps this define even
2180 // in the presence of '-w', match this behavior bug-for-bug.
2181 if (types::isCXX(InputType) &&
2182 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2183 true)) {
2184 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002185 }
2186
Chandler Carruthc304ba32010-05-22 02:21:53 +00002187 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2188 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2189 if (Asm->getOption().matches(options::OPT_fasm))
2190 CmdArgs.push_back("-fgnu-keywords");
2191 else
2192 CmdArgs.push_back("-fno-gnu-keywords");
2193 }
2194
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002195 if (ShouldDisableCFI(Args, getToolChain()))
2196 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002197
Nick Lewyckyea523d72011-10-17 23:05:52 +00002198 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2199 CmdArgs.push_back("-fno-dwarf-directory-asm");
2200
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002201 if (const char *pwd = ::getenv("PWD")) {
2202 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2203 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumi813a4072011-10-22 10:25:25 +00002204 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002205 std::string CompDir = pwd;
2206 CmdArgs.push_back("-fdebug-compilation-dir");
2207 CmdArgs.push_back(Args.MakeArgString(CompDir));
2208 }
2209 }
2210
Richard Smithc18c4232011-11-21 19:36:32 +00002211 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2212 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002213 CmdArgs.push_back("-ftemplate-depth");
2214 CmdArgs.push_back(A->getValue(Args));
2215 }
2216
Richard Smithc18c4232011-11-21 19:36:32 +00002217 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2218 CmdArgs.push_back("-fconstexpr-depth");
2219 CmdArgs.push_back(A->getValue(Args));
2220 }
2221
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002222 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2223 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002224 if (A->getNumValues()) {
2225 StringRef bytes = A->getValue(Args);
2226 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2227 } else
2228 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002229 }
2230
Nuno Lopesb3198a82012-05-08 22:10:46 +00002231 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2232 options::OPT_fbounds_checking_EQ)) {
2233 if (A->getNumValues()) {
2234 StringRef val = A->getValue(Args);
2235 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2236 } else
2237 CmdArgs.push_back("-fbounds-checking=1");
2238 }
2239
Daniel Dunbare4bdae72009-11-19 04:00:53 +00002240 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002241 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002242
Daniel Dunbar294691e2009-11-04 06:24:38 +00002243 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2244 CmdArgs.push_back("-fconstant-string-class");
2245 CmdArgs.push_back(A->getValue(Args));
2246 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002247
Chris Lattner124fca52010-01-09 21:54:33 +00002248 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2249 CmdArgs.push_back("-ftabstop");
2250 CmdArgs.push_back(A->getValue(Args));
2251 }
2252
Chris Lattner0f0c9632010-04-07 20:49:23 +00002253 CmdArgs.push_back("-ferror-limit");
2254 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2255 CmdArgs.push_back(A->getValue(Args));
2256 else
2257 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002258
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002259 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2260 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregor6c1cb992010-05-04 17:13:42 +00002261 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002262 }
2263
2264 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2265 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregor575cf372010-04-20 07:18:24 +00002266 CmdArgs.push_back(A->getValue(Args));
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002267 }
2268
Richard Smith08d6e032011-12-16 19:06:07 +00002269 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2270 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2271 CmdArgs.push_back(A->getValue(Args));
2272 }
2273
Daniel Dunbar55efe142009-11-04 06:24:47 +00002274 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002275 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002276 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbara28690e2009-11-30 08:40:54 +00002277 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002278 } else {
2279 // If -fmessage-length=N was not specified, determine whether this is a
2280 // terminal and, if so, implicitly define -fmessage-length appropriately.
2281 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002282 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002283 }
2284
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002285 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2286 CmdArgs.push_back("-fvisibility");
2287 CmdArgs.push_back(A->getValue(Args));
2288 }
2289
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002290 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002291
Hans Wennborgde981f32012-06-28 08:01:44 +00002292 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2293
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002294 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002295 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2296 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002297 CmdArgs.push_back("-ffreestanding");
2298
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002299 // Forward -f (flag) options which we can pass directly.
Mike Stump9c276ae2009-12-12 01:27:46 +00002300 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002301 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002302 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002303 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002304 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002305 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002306 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002307 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2308 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002309
2310 // Report and error for -faltivec on anything other then PowerPC.
2311 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2312 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2313 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2314 D.Diag(diag::err_drv_argument_only_allowed_with)
2315 << A->getAsString(Args) << "ppc/ppc64";
2316
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002317 if (getToolChain().SupportsProfiling())
2318 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002319
Kostya Serebryany1b4eca62011-11-16 17:34:26 +00002320 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2321 options::OPT_fno_address_sanitizer, false))
2322 CmdArgs.push_back("-faddress-sanitizer");
2323
Kostya Serebryany3c931222012-03-01 22:27:08 +00002324 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2325 options::OPT_fno_thread_sanitizer, false))
2326 CmdArgs.push_back("-fthread-sanitizer");
2327
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002328 // -flax-vector-conversions is default.
2329 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2330 options::OPT_fno_lax_vector_conversions))
2331 CmdArgs.push_back("-fno-lax-vector-conversions");
2332
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002333 if (Args.getLastArg(options::OPT_fapple_kext))
2334 CmdArgs.push_back("-fapple-kext");
2335
David Blaikie940152f2012-06-14 18:55:27 +00002336 if (Args.hasFlag(options::OPT_frewrite_includes,
2337 options::OPT_fno_rewrite_includes, false))
2338 CmdArgs.push_back("-frewrite-includes");
2339
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002340 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002341 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002342 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002343 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2344 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002345
2346 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2347 CmdArgs.push_back("-ftrapv-handler");
2348 CmdArgs.push_back(A->getValue(Args));
2349 }
2350
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002351 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002352
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002353 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2354 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2355 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2356 options::OPT_fno_wrapv)) {
2357 if (A->getOption().matches(options::OPT_fwrapv))
2358 CmdArgs.push_back("-fwrapv");
2359 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2360 options::OPT_fno_strict_overflow)) {
2361 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2362 CmdArgs.push_back("-fwrapv");
2363 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002364 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002365 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002366
Daniel Dunbar5345c392009-09-03 04:54:28 +00002367 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2368
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002369 // -stack-protector=0 is default.
2370 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002371 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2372 options::OPT_fstack_protector_all,
2373 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002374 if (A->getOption().matches(options::OPT_fstack_protector))
2375 StackProtectorLevel = 1;
2376 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2377 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002378 } else {
2379 StackProtectorLevel =
2380 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2381 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002382 if (StackProtectorLevel) {
2383 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002384 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002385 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002386
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002387 // --param ssp-buffer-size=
2388 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2389 ie = Args.filtered_end(); it != ie; ++it) {
2390 StringRef Str((*it)->getValue(Args));
2391 if (Str.startswith("ssp-buffer-size=")) {
2392 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002393 CmdArgs.push_back("-stack-protector-buffer-size");
2394 // FIXME: Verify the argument is a valid integer.
2395 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002396 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002397 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002398 }
Bill Wendling45483f72009-06-28 07:36:13 +00002399 }
2400
Nick Lewycky4e785c92011-12-06 03:33:03 +00002401 // Translate -mstackrealign
2402 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2403 false)) {
2404 CmdArgs.push_back("-backend-option");
2405 CmdArgs.push_back("-force-align-stack");
2406 }
2407 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2408 false)) {
2409 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2410 }
2411
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002412 if (Args.hasArg(options::OPT_mstack_alignment)) {
2413 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2414 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002415 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002416
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002417 // Forward -f options with positive and negative forms; we translate
2418 // these by hand.
2419
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002420 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002421 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002422 CmdArgs.push_back("-fapple-kext");
2423 if (!Args.hasArg(options::OPT_fbuiltin))
2424 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002425 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002426 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002427 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002428 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002429 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002430
Nuno Lopesfc284482009-12-16 16:59:22 +00002431 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2432 options::OPT_fno_assume_sane_operator_new))
2433 CmdArgs.push_back("-fno-assume-sane-operator-new");
2434
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002435 // -fblocks=0 is default.
2436 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002437 getToolChain().IsBlocksDefault()) ||
2438 (Args.hasArg(options::OPT_fgnu_runtime) &&
2439 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2440 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002441 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002442
2443 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2444 !getToolChain().hasBlocksRuntime())
2445 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002446 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002447
Douglas Gregor64554ba2012-01-18 15:19:58 +00002448 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2449 // users must also pass -fcxx-modules. The latter flag will disappear once the
2450 // modules implementation is solid for C++/Objective-C++ programs as well.
2451 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2452 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2453 options::OPT_fno_cxx_modules,
2454 false);
2455 if (AllowedInCXX || !types::isCXX(InputType))
2456 CmdArgs.push_back("-fmodules");
2457 }
Douglas Gregor7025d2c2012-01-03 17:13:05 +00002458
John McCall32579cf2010-04-09 19:12:06 +00002459 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00002460 if (Args.hasFlag(options::OPT_fno_access_control,
2461 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00002462 false))
John McCall7002f4c2010-04-09 19:03:51 +00002463 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00002464
Anders Carlssona4c24752010-11-21 00:09:52 +00002465 // -felide-constructors is the default.
2466 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2467 options::OPT_felide_constructors,
2468 false))
2469 CmdArgs.push_back("-fno-elide-constructors");
2470
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002471 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002472 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2473 KernelOrKext)
Daniel Dunbar53e84842009-11-19 04:55:23 +00002474 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00002475
Tony Linthicum96319392011-12-12 21:14:55 +00002476 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002477 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00002478 options::OPT_fno_short_enums,
2479 getToolChain().getTriple().getArch() ==
2480 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002481 CmdArgs.push_back("-fshort-enums");
2482
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002483 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002484 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002485 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00002486 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00002487
Anders Carlssona508b7d2010-02-06 23:23:06 +00002488 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00002489 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00002490 options::OPT_fno_threadsafe_statics))
2491 CmdArgs.push_back("-fno-threadsafe-statics");
2492
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002493 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002494 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2495 options::OPT_fno_use_cxa_atexit,
2496 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00002497 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00002498 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2499 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002500 CmdArgs.push_back("-fno-use-cxa-atexit");
2501
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002502 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002503 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002504 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2505 CmdArgs.push_back("-fms-extensions");
2506
Chad Rosierf925e042012-07-20 21:20:33 +00002507 // -fms-inline-asm.
Chad Rosierd256f862012-07-20 23:12:26 +00002508 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2509 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosierf925e042012-07-20 21:20:33 +00002510
Francois Pichetae556082011-09-17 04:32:15 +00002511 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00002512 if (Args.hasFlag(options::OPT_fms_compatibility,
2513 options::OPT_fno_ms_compatibility,
2514 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2515 Args.hasFlag(options::OPT_fms_extensions,
2516 options::OPT_fno_ms_extensions,
2517 true))))
Francois Pichetae556082011-09-17 04:32:15 +00002518 CmdArgs.push_back("-fms-compatibility");
2519
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002520 // -fmsc-version=1300 is default.
2521 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2522 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2523 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002524 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002525 if (msc_ver.empty())
2526 CmdArgs.push_back("-fmsc-version=1300");
2527 else
2528 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2529 }
2530
2531
Dawn Perchik400b6072010-09-02 23:59:25 +00002532 // -fborland-extensions=0 is default.
2533 if (Args.hasFlag(options::OPT_fborland_extensions,
2534 options::OPT_fno_borland_extensions, false))
2535 CmdArgs.push_back("-fborland-extensions");
2536
Francois Pichet8efcc012011-09-01 16:38:08 +00002537 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2538 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00002539 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2540 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00002541 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00002542 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00002543
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002544 // -fgnu-keywords default varies depending on language; only pass if
2545 // specified.
2546 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00002547 options::OPT_fno_gnu_keywords))
2548 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002549
Rafael Espindola01ba8542011-06-02 17:30:53 +00002550 if (Args.hasFlag(options::OPT_fgnu89_inline,
2551 options::OPT_fno_gnu89_inline,
2552 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00002553 CmdArgs.push_back("-fgnu89-inline");
2554
Chad Rosierfc055f92012-03-15 22:31:42 +00002555 if (Args.hasArg(options::OPT_fno_inline))
2556 CmdArgs.push_back("-fno-inline");
2557
Chad Rosier634a4b12012-03-06 21:17:19 +00002558 if (Args.hasArg(options::OPT_fno_inline_functions))
2559 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00002560
John McCall260611a2012-06-20 06:18:46 +00002561 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00002562
John McCall260611a2012-06-20 06:18:46 +00002563 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2564 // legacy is the default.
2565 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002566 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2567 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00002568 objcRuntime.isLegacyDispatchDefaultForArch(
2569 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002570 if (getToolChain().UseObjCMixedDispatch())
2571 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2572 else
2573 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2574 }
2575 }
2576
Nico Weberdf423542012-03-09 21:19:44 +00002577 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2578 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00002579 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002580 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2581 }
2582
John McCall9f084a32011-07-06 00:26:06 +00002583 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2584 // NOTE: This logic is duplicated in ToolChains.cpp.
2585 bool ARC = isObjCAutoRefCount(Args);
2586 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00002587 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00002588
John McCall9f084a32011-07-06 00:26:06 +00002589 CmdArgs.push_back("-fobjc-arc");
2590
Chandler Carruth7ffa0322011-11-04 07:34:47 +00002591 // FIXME: It seems like this entire block, and several around it should be
2592 // wrapped in isObjC, but for now we just use it here as this is where it
2593 // was being used previously.
2594 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2595 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2596 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2597 else
2598 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2599 }
2600
John McCall9f084a32011-07-06 00:26:06 +00002601 // Allow the user to enable full exceptions code emission.
2602 // We define off for Objective-CC, on for Objective-C++.
2603 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2604 options::OPT_fno_objc_arc_exceptions,
2605 /*default*/ types::isCXX(InputType)))
2606 CmdArgs.push_back("-fobjc-arc-exceptions");
2607 }
2608
2609 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2610 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00002611 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00002612 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002613
John McCall9f084a32011-07-06 00:26:06 +00002614 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2615 // takes precedence.
2616 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2617 if (!GCArg)
2618 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2619 if (GCArg) {
2620 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002621 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00002622 << GCArg->getAsString(Args);
2623 } else if (getToolChain().SupportsObjCGC()) {
2624 GCArg->render(Args, CmdArgs);
2625 } else {
2626 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002627 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00002628 << GCArg->getAsString(Args);
2629 }
2630 }
2631
John McCalld71315c2011-06-22 00:53:57 +00002632 // Add exception args.
2633 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00002634 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00002635
2636 if (getToolChain().UseSjLjExceptions())
2637 CmdArgs.push_back("-fsjlj-exceptions");
2638
2639 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00002640 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2641 options::OPT_fno_assume_sane_operator_new))
2642 CmdArgs.push_back("-fno-assume-sane-operator-new");
2643
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00002644 // -fconstant-cfstrings is default, and may be subject to argument translation
2645 // on Darwin.
2646 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2647 options::OPT_fno_constant_cfstrings) ||
2648 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2649 options::OPT_mno_constant_cfstrings))
2650 CmdArgs.push_back("-fno-constant-cfstrings");
2651
John Thompsona6fda122009-11-05 20:14:16 +00002652 // -fshort-wchar default varies depending on platform; only
2653 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00002654 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2655 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00002656
Daniel Dunbaree848a72009-10-29 02:39:57 +00002657 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2658 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00002659 //
2660 // FIXME: This is gross; that translation should be pulled from the
2661 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002662 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00002663 options::OPT_fno_pascal_strings,
2664 false) ||
2665 Args.hasFlag(options::OPT_mpascal_strings,
2666 options::OPT_mno_pascal_strings,
2667 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002668 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002669
Daniel Dunbar88934e82011-10-05 21:04:55 +00002670 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2671 // -fno-pack-struct doesn't apply to -fpack-struct=.
2672 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00002673 std::string PackStructStr = "-fpack-struct=";
2674 PackStructStr += A->getValue(Args);
2675 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00002676 } else if (Args.hasFlag(options::OPT_fpack_struct,
2677 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00002678 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00002679 }
2680
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002681 if (Args.hasArg(options::OPT_mkernel) ||
2682 Args.hasArg(options::OPT_fapple_kext)) {
2683 if (!Args.hasArg(options::OPT_fcommon))
2684 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00002685 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002686 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00002687
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002688 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002689 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002690 CmdArgs.push_back("-fno-common");
2691
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002692 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002693 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00002694 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002695 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002696 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002697 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2698
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002699 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2700 if (!Args.hasFlag(options::OPT_ffor_scope,
2701 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002702 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002703 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2704
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00002705 // -fcaret-diagnostics is default.
2706 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2707 options::OPT_fno_caret_diagnostics, true))
2708 CmdArgs.push_back("-fno-caret-diagnostics");
2709
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002710 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00002711 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002712 options::OPT_fno_diagnostics_fixit_info))
2713 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002714
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002715 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00002716 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002717 options::OPT_fno_diagnostics_show_option))
2718 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00002719
Chris Lattner6fbe8392010-05-04 21:55:25 +00002720 if (const Arg *A =
2721 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2722 CmdArgs.push_back("-fdiagnostics-show-category");
2723 CmdArgs.push_back(A->getValue(Args));
2724 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002725
Douglas Gregorc9471b02011-05-21 17:07:29 +00002726 if (const Arg *A =
2727 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2728 CmdArgs.push_back("-fdiagnostics-format");
2729 CmdArgs.push_back(A->getValue(Args));
2730 }
2731
Chandler Carruthabaca7a2011-03-27 01:50:55 +00002732 if (Arg *A = Args.getLastArg(
2733 options::OPT_fdiagnostics_show_note_include_stack,
2734 options::OPT_fno_diagnostics_show_note_include_stack)) {
2735 if (A->getOption().matches(
2736 options::OPT_fdiagnostics_show_note_include_stack))
2737 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2738 else
2739 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2740 }
2741
Daniel Dunbar838be482009-11-04 06:24:57 +00002742 // Color diagnostics are the default, unless the terminal doesn't support
2743 // them.
2744 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidisf765d762010-09-23 12:56:06 +00002745 options::OPT_fno_color_diagnostics,
2746 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00002747 CmdArgs.push_back("-fcolor-diagnostics");
2748
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00002749 if (!Args.hasFlag(options::OPT_fshow_source_location,
2750 options::OPT_fno_show_source_location))
2751 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002752
Douglas Gregorc9471b02011-05-21 17:07:29 +00002753 if (!Args.hasFlag(options::OPT_fshow_column,
2754 options::OPT_fno_show_column,
2755 true))
2756 CmdArgs.push_back("-fno-show-column");
2757
Douglas Gregora0068fc2010-07-09 17:35:33 +00002758 if (!Args.hasFlag(options::OPT_fspell_checking,
2759 options::OPT_fno_spell_checking))
2760 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002761
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002762
Daniel Dunbar16894392010-11-02 19:42:04 +00002763 // Silently ignore -fasm-blocks for now.
2764 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2765 false);
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002766
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00002767 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2768 A->render(Args, CmdArgs);
2769
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002770 // -fdollars-in-identifiers default varies depending on platform and
2771 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00002772 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002773 options::OPT_fno_dollars_in_identifiers)) {
2774 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00002775 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002776 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00002777 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002778 }
2779
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002780 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2781 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00002782 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002783 options::OPT_fno_unit_at_a_time)) {
2784 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002785 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002786 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002787
Eli Friedman19bda3a2011-11-02 01:53:16 +00002788 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2789 options::OPT_fno_apple_pragma_pack, false))
2790 CmdArgs.push_back("-fapple-pragma-pack");
2791
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002792 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002793 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002794 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002795#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00002796 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002797 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2798 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2799 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2800 CmdArgs.push_back("-fno-builtin-strcat");
2801 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2802 CmdArgs.push_back("-fno-builtin-strcpy");
2803 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002804#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002805
Daniel Dunbard98750f2011-03-18 21:23:40 +00002806 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00002807 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00002808 options::OPT_traditional_cpp)) {
2809 if (isa<PreprocessJobAction>(JA))
2810 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002811 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00002812 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00002813 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002814
Daniel Dunbar1d460332009-03-18 10:01:51 +00002815 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00002816 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00002817
2818 // Handle serialized diagnostics.
2819 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2820 CmdArgs.push_back("-serialize-diagnostic-file");
2821 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2822 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002823
Ted Kremenek127ff2e2012-09-13 06:41:18 +00002824 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2825 CmdArgs.push_back("-fretain-comments-from-system-headers");
2826
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002827 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2828 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00002829 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002830 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2831 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002832 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00002833
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002834 // We translate this by hand to the -cc1 argument, since nightly test uses
2835 // it and developers have been trained to spell it with -mllvm.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002836 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002837 CmdArgs.push_back("-disable-llvm-optzns");
2838 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002839 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002840 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002841
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002842 if (Output.getType() == types::TY_Dependencies) {
2843 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00002844 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002845 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00002846 CmdArgs.push_back(Output.getFilename());
2847 } else {
2848 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002849 }
2850
Daniel Dunbar1d460332009-03-18 10:01:51 +00002851 for (InputInfoList::const_iterator
2852 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2853 const InputInfo &II = *it;
2854 CmdArgs.push_back("-x");
2855 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00002856 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00002857 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002858 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00002859 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002860 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002861
Chris Lattnere6113de2009-11-03 19:50:27 +00002862 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2863
Daniel Dunbara001c1c2010-07-18 21:16:15 +00002864 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002865
2866 // Optionally embed the -cc1 level arguments into the debug info, for build
2867 // analysis.
2868 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00002869 ArgStringList OriginalArgs;
2870 for (ArgList::const_iterator it = Args.begin(),
2871 ie = Args.end(); it != ie; ++it)
2872 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002873
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00002874 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002875 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00002876 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002877 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00002878 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002879 }
2880 CmdArgs.push_back("-dwarf-debug-flags");
2881 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2882 }
2883
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00002884 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00002885
Roman Divackybe4c8702011-02-10 16:52:03 +00002886 if (Arg *A = Args.getLastArg(options::OPT_pg))
2887 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002888 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00002889 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002890
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002891 // Claim some arguments which clang supports automatically.
2892
Daniel Dunbarf4046862010-04-15 06:18:42 +00002893 // -fpch-preprocess is used with gcc to add a special marker in the output to
2894 // include the PCH file. Clang's PTH solution is completely transparent, so we
2895 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002896 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002897
Daniel Dunbara880db02009-03-23 19:03:36 +00002898 // Claim some arguments which clang doesn't support, but we don't
2899 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00002900 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2901 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002902
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002903 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002904 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002905 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002906}
2907
Jim Grosbachfc308292012-02-10 20:37:10 +00002908void ClangAs::AddARMTargetArgs(const ArgList &Args,
2909 ArgStringList &CmdArgs) const {
2910 const Driver &D = getToolChain().getDriver();
2911 llvm::Triple Triple = getToolChain().getTriple();
2912
2913 // Set the CPU based on -march= and -mcpu=.
2914 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00002915 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00002916
2917 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00002918 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00002919 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00002920
2921 // Honor -mfpmath=.
2922 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00002923 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00002924}
2925
John McCall260611a2012-06-20 06:18:46 +00002926/// Add options related to the Objective-C runtime/ABI.
2927///
2928/// Returns true if the runtime is non-fragile.
2929ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2930 ArgStringList &cmdArgs,
2931 RewriteKind rewriteKind) const {
2932 // Look for the controlling runtime option.
2933 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2934 options::OPT_fgnu_runtime,
2935 options::OPT_fobjc_runtime_EQ);
2936
2937 // Just forward -fobjc-runtime= to the frontend. This supercedes
2938 // options about fragility.
2939 if (runtimeArg &&
2940 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2941 ObjCRuntime runtime;
2942 StringRef value = runtimeArg->getValue(args);
2943 if (runtime.tryParse(value)) {
2944 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2945 << value;
2946 }
2947
2948 runtimeArg->render(args, cmdArgs);
2949 return runtime;
2950 }
2951
2952 // Otherwise, we'll need the ABI "version". Version numbers are
2953 // slightly confusing for historical reasons:
2954 // 1 - Traditional "fragile" ABI
2955 // 2 - Non-fragile ABI, version 1
2956 // 3 - Non-fragile ABI, version 2
2957 unsigned objcABIVersion = 1;
2958 // If -fobjc-abi-version= is present, use that to set the version.
2959 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2960 StringRef value = abiArg->getValue(args);
2961 if (value == "1")
2962 objcABIVersion = 1;
2963 else if (value == "2")
2964 objcABIVersion = 2;
2965 else if (value == "3")
2966 objcABIVersion = 3;
2967 else
2968 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2969 << value;
2970 } else {
2971 // Otherwise, determine if we are using the non-fragile ABI.
2972 bool nonFragileABIIsDefault =
2973 (rewriteKind == RK_NonFragile ||
2974 (rewriteKind == RK_None &&
2975 getToolChain().IsObjCNonFragileABIDefault()));
2976 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2977 options::OPT_fno_objc_nonfragile_abi,
2978 nonFragileABIIsDefault)) {
2979 // Determine the non-fragile ABI version to use.
2980#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2981 unsigned nonFragileABIVersion = 1;
2982#else
2983 unsigned nonFragileABIVersion = 2;
2984#endif
2985
2986 if (Arg *abiArg = args.getLastArg(
2987 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2988 StringRef value = abiArg->getValue(args);
2989 if (value == "1")
2990 nonFragileABIVersion = 1;
2991 else if (value == "2")
2992 nonFragileABIVersion = 2;
2993 else
2994 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2995 << value;
2996 }
2997
2998 objcABIVersion = 1 + nonFragileABIVersion;
2999 } else {
3000 objcABIVersion = 1;
3001 }
3002 }
3003
3004 // We don't actually care about the ABI version other than whether
3005 // it's non-fragile.
3006 bool isNonFragile = objcABIVersion != 1;
3007
3008 // If we have no runtime argument, ask the toolchain for its default runtime.
3009 // However, the rewriter only really supports the Mac runtime, so assume that.
3010 ObjCRuntime runtime;
3011 if (!runtimeArg) {
3012 switch (rewriteKind) {
3013 case RK_None:
3014 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3015 break;
3016 case RK_Fragile:
3017 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3018 break;
3019 case RK_NonFragile:
3020 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3021 break;
3022 }
3023
3024 // -fnext-runtime
3025 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3026 // On Darwin, make this use the default behavior for the toolchain.
3027 if (getToolChain().getTriple().isOSDarwin()) {
3028 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3029
3030 // Otherwise, build for a generic macosx port.
3031 } else {
3032 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3033 }
3034
3035 // -fgnu-runtime
3036 } else {
3037 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003038 // Legacy behaviour is to target the gnustep runtime if we are i
3039 // non-fragile mode or the GCC runtime in fragile mode.
3040 if (isNonFragile)
3041 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3042 else
3043 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003044 }
3045
3046 cmdArgs.push_back(args.MakeArgString(
3047 "-fobjc-runtime=" + runtime.getAsString()));
3048 return runtime;
3049}
3050
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003051void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003052 const InputInfo &Output,
3053 const InputInfoList &Inputs,
3054 const ArgList &Args,
3055 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003056 ArgStringList CmdArgs;
3057
3058 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3059 const InputInfo &Input = Inputs[0];
3060
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003061 // Don't warn about "clang -w -c foo.s"
3062 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003063 // and "clang -emit-llvm -c foo.s"
3064 Args.ClaimAllArgs(options::OPT_emit_llvm);
3065 // and "clang -use-gold-plugin -c foo.s"
3066 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003067
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003068 // Invoke ourselves in -cc1as mode.
3069 //
3070 // FIXME: Implement custom jobs for internal actions.
3071 CmdArgs.push_back("-cc1as");
3072
3073 // Add the "effective" target triple.
3074 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003075 std::string TripleStr =
3076 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003077 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3078
3079 // Set the output mode, we currently only expect to be used as a real
3080 // assembler.
3081 CmdArgs.push_back("-filetype");
3082 CmdArgs.push_back("obj");
3083
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003084 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003085 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003086
Jim Grosbachfc308292012-02-10 20:37:10 +00003087 // Add target specific cpu and features flags.
3088 switch(getToolChain().getTriple().getArch()) {
3089 default:
3090 break;
3091
3092 case llvm::Triple::arm:
3093 case llvm::Triple::thumb:
3094 AddARMTargetArgs(Args, CmdArgs);
3095 break;
3096 }
3097
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003098 // Ignore explicit -force_cpusubtype_ALL option.
3099 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003100
Eric Christopher8f0a4032012-01-10 00:38:01 +00003101 // Determine the original source input.
3102 const Action *SourceAction = &JA;
3103 while (SourceAction->getKind() != Action::InputClass) {
3104 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3105 SourceAction = SourceAction->getInputs()[0];
3106 }
3107
3108 // Forward -g, assuming we are dealing with an actual assembly file.
3109 if (SourceAction->getType() == types::TY_Asm ||
3110 SourceAction->getType() == types::TY_PP_Asm) {
3111 Args.ClaimAllArgs(options::OPT_g_Group);
3112 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3113 if (!A->getOption().matches(options::OPT_g0))
3114 CmdArgs.push_back("-g");
3115 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003116
3117 // Optionally embed the -cc1as level arguments into the debug info, for build
3118 // analysis.
3119 if (getToolChain().UseDwarfDebugFlags()) {
3120 ArgStringList OriginalArgs;
3121 for (ArgList::const_iterator it = Args.begin(),
3122 ie = Args.end(); it != ie; ++it)
3123 (*it)->render(Args, OriginalArgs);
3124
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003125 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003126 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3127 Flags += Exec;
3128 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3129 Flags += " ";
3130 Flags += OriginalArgs[i];
3131 }
3132 CmdArgs.push_back("-dwarf-debug-flags");
3133 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3134 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003135
3136 // FIXME: Add -static support, once we have it.
3137
3138 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3139 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003140 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003141
3142 assert(Output.isFilename() && "Unexpected lipo output.");
3143 CmdArgs.push_back("-o");
3144 CmdArgs.push_back(Output.getFilename());
3145
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003146 assert(Input.isFilename() && "Invalid input.");
3147 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003148
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003149 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003150 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003151}
3152
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003153void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003154 const InputInfo &Output,
3155 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003156 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003157 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003158 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003159 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003160
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003161 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003162 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003163 Arg *A = *it;
Daniel Dunbar75877192009-03-19 07:55:12 +00003164 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003165 // Don't forward any -g arguments to assembly steps.
3166 if (isa<AssembleJobAction>(JA) &&
3167 A->getOption().matches(options::OPT_g_Group))
3168 continue;
3169
Daniel Dunbar75877192009-03-19 07:55:12 +00003170 // It is unfortunate that we have to claim here, as this means
3171 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003172 // platforms using a generic gcc, even if we are just using gcc
3173 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003174 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003175 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003176 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003177 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003178
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003179 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003180
3181 // If using a driver driver, force the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003182 const std::string &Arch = getToolChain().getArchName();
Bob Wilson905c45f2011-10-14 05:03:44 +00003183 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003184 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003185
3186 // FIXME: Remove these special cases.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003187 if (Arch == "powerpc")
3188 CmdArgs.push_back("ppc");
3189 else if (Arch == "powerpc64")
3190 CmdArgs.push_back("ppc64");
3191 else
Daniel Dunbar88137642009-09-09 22:32:48 +00003192 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003193 }
3194
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003195 // Try to force gcc to match the tool chain we want, if we recognize
3196 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003197 //
3198 // FIXME: The triple class should directly provide the information we want
3199 // here.
3200 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003201 CmdArgs.push_back("-m32");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003202 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003203 CmdArgs.push_back("-m64");
3204
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003205 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003206 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003207 CmdArgs.push_back(Output.getFilename());
3208 } else {
3209 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003210 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003211 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003212
Tony Linthicum96319392011-12-12 21:14:55 +00003213 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3214 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003215
3216 // Only pass -x if gcc will understand it; otherwise hope gcc
3217 // understands the suffix correctly. The main use case this would go
3218 // wrong in is for linker inputs if they happened to have an odd
3219 // suffix; really the only way to get this to happen is a command
3220 // like '-x foobar a.c' which will treat a.c like a linker input.
3221 //
3222 // FIXME: For the linker case specifically, can we safely convert
3223 // inputs into '-Wl,' options?
3224 for (InputInfoList::const_iterator
3225 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3226 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003227
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003228 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003229 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3230 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003231 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003232 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003233 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003234 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003235 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003236
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003237 if (types::canTypeBeUserSpecified(II.getType())) {
3238 CmdArgs.push_back("-x");
3239 CmdArgs.push_back(types::getTypeName(II.getType()));
3240 }
3241
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003242 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003243 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003244 else {
3245 const Arg &A = II.getInputArg();
3246
3247 // Reverse translate some rewritten options.
3248 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3249 CmdArgs.push_back("-lstdc++");
3250 continue;
3251 }
3252
Daniel Dunbar115a7922009-03-19 07:29:38 +00003253 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003254 A.render(Args, CmdArgs);
3255 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003256 }
3257
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003258 const std::string customGCCName = D.getCCCGenericGCCName();
3259 const char *GCCName;
3260 if (!customGCCName.empty())
3261 GCCName = customGCCName.c_str();
3262 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003263 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003264 } else
3265 GCCName = "gcc";
3266
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003267 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003268 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003269 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003270}
3271
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003272void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3273 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003274 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003275}
3276
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003277void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3278 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003279 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003280}
3281
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003282void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3283 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003284 const Driver &D = getToolChain().getDriver();
3285
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003286 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003287 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3288 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003289 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00003290 else {
3291 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003292 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003293 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00003294
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003295 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00003296 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003297}
3298
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003299void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3300 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003301 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003302}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003303
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003304void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3305 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003306 // The types are (hopefully) good enough.
3307}
3308
Tony Linthicum96319392011-12-12 21:14:55 +00003309// Hexagon tools start.
3310void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3311 ArgStringList &CmdArgs) const {
3312
3313}
3314void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3315 const InputInfo &Output,
3316 const InputInfoList &Inputs,
3317 const ArgList &Args,
3318 const char *LinkingOutput) const {
3319
3320 const Driver &D = getToolChain().getDriver();
3321 ArgStringList CmdArgs;
3322
3323 std::string MarchString = "-march=";
3324 MarchString += getHexagonTargetCPU(Args);
3325 CmdArgs.push_back(Args.MakeArgString(MarchString));
3326
3327 RenderExtraToolArgs(JA, CmdArgs);
3328
3329 if (Output.isFilename()) {
3330 CmdArgs.push_back("-o");
3331 CmdArgs.push_back(Output.getFilename());
3332 } else {
3333 assert(Output.isNothing() && "Unexpected output");
3334 CmdArgs.push_back("-fsyntax-only");
3335 }
3336
3337
3338 // Only pass -x if gcc will understand it; otherwise hope gcc
3339 // understands the suffix correctly. The main use case this would go
3340 // wrong in is for linker inputs if they happened to have an odd
3341 // suffix; really the only way to get this to happen is a command
3342 // like '-x foobar a.c' which will treat a.c like a linker input.
3343 //
3344 // FIXME: For the linker case specifically, can we safely convert
3345 // inputs into '-Wl,' options?
3346 for (InputInfoList::const_iterator
3347 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3348 const InputInfo &II = *it;
3349
3350 // Don't try to pass LLVM or AST inputs to a generic gcc.
3351 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3352 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3353 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3354 << getToolChain().getTripleString();
3355 else if (II.getType() == types::TY_AST)
3356 D.Diag(clang::diag::err_drv_no_ast_support)
3357 << getToolChain().getTripleString();
3358
3359 if (II.isFilename())
3360 CmdArgs.push_back(II.getFilename());
3361 else
3362 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3363 II.getInputArg().render(Args, CmdArgs);
3364 }
3365
3366 const char *GCCName = "hexagon-as";
3367 const char *Exec =
3368 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3369 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3370
3371}
3372void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3373 ArgStringList &CmdArgs) const {
3374 // The types are (hopefully) good enough.
3375}
3376
3377void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3378 const InputInfo &Output,
3379 const InputInfoList &Inputs,
3380 const ArgList &Args,
3381 const char *LinkingOutput) const {
3382
3383 const Driver &D = getToolChain().getDriver();
3384 ArgStringList CmdArgs;
3385
3386 for (ArgList::const_iterator
3387 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3388 Arg *A = *it;
3389 if (A->getOption().hasForwardToGCC()) {
3390 // Don't forward any -g arguments to assembly steps.
3391 if (isa<AssembleJobAction>(JA) &&
3392 A->getOption().matches(options::OPT_g_Group))
3393 continue;
3394
3395 // It is unfortunate that we have to claim here, as this means
3396 // we will basically never report anything interesting for
3397 // platforms using a generic gcc, even if we are just using gcc
3398 // to get to the assembler.
3399 A->claim();
3400 A->render(Args, CmdArgs);
3401 }
3402 }
3403
3404 RenderExtraToolArgs(JA, CmdArgs);
3405
3406 // Add Arch Information
3407 Arg *A;
Sebastian Pop43115d42012-01-13 20:37:10 +00003408 if ((A = getLastHexagonArchArg(Args))) {
3409 if (A->getOption().matches(options::OPT_m_Joined))
3410 A->render(Args, CmdArgs);
Tony Linthicum96319392011-12-12 21:14:55 +00003411 else
Sebastian Pop43115d42012-01-13 20:37:10 +00003412 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00003413 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003414 else {
3415 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3416 }
3417
Tony Linthicum96319392011-12-12 21:14:55 +00003418 CmdArgs.push_back("-mqdsp6-compat");
3419
3420 const char *GCCName;
3421 if (C.getDriver().CCCIsCXX)
3422 GCCName = "hexagon-g++";
3423 else
3424 GCCName = "hexagon-gcc";
3425 const char *Exec =
3426 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3427
3428 if (Output.isFilename()) {
3429 CmdArgs.push_back("-o");
3430 CmdArgs.push_back(Output.getFilename());
3431 }
3432
3433 for (InputInfoList::const_iterator
3434 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3435 const InputInfo &II = *it;
3436
3437 // Don't try to pass LLVM or AST inputs to a generic gcc.
3438 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3439 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3440 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3441 << getToolChain().getTripleString();
3442 else if (II.getType() == types::TY_AST)
3443 D.Diag(clang::diag::err_drv_no_ast_support)
3444 << getToolChain().getTripleString();
3445
3446 if (II.isFilename())
3447 CmdArgs.push_back(II.getFilename());
3448 else
3449 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3450 II.getInputArg().render(Args, CmdArgs);
3451 }
3452 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3453
3454}
3455// Hexagon tools end.
3456
3457
Daniel Dunbar40f12652009-03-29 17:08:39 +00003458const char *darwin::CC1::getCC1Name(types::ID Type) const {
3459 switch (Type) {
3460 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00003461 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbar40f12652009-03-29 17:08:39 +00003462 case types::TY_Asm:
3463 case types::TY_C: case types::TY_CHeader:
3464 case types::TY_PP_C: case types::TY_PP_CHeader:
3465 return "cc1";
3466 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003467 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3468 case types::TY_PP_ObjCHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003469 return "cc1obj";
3470 case types::TY_CXX: case types::TY_CXXHeader:
3471 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3472 return "cc1plus";
3473 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003474 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3475 case types::TY_PP_ObjCXXHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003476 return "cc1objplus";
3477 }
3478}
3479
David Blaikie99ba9e32011-12-20 02:48:34 +00003480void darwin::CC1::anchor() {}
3481
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003482const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003483 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00003484 return Args.MakeArgString(
3485 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003486}
3487
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003488const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003489 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003490 const char *Str = getBaseInputName(Args, Inputs);
3491
Chris Lattner657ca662011-01-16 08:14:11 +00003492 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00003493 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003494
3495 return Str;
3496}
3497
3498const char *
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003499darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003500 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003501 // FIXME: Think about this more.
3502 std::string Res;
3503
3504 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3505 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003506 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00003507 } else {
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003508 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00003509 }
Daniel Dunbar88137642009-09-09 22:32:48 +00003510 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003511}
3512
Chad Rosier285f9a22011-08-17 18:24:55 +00003513void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher88b7cf02011-08-19 00:30:14 +00003514 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosier285f9a22011-08-17 18:24:55 +00003515 it != ie;) {
Chad Rosier8722a5d2011-08-18 17:56:32 +00003516
3517 StringRef Option = *it;
Chad Rosier80717972011-08-26 18:30:43 +00003518 bool RemoveOption = false;
Chad Rosier04225c12011-08-18 01:18:28 +00003519
Bob Wilson2872c8d2012-02-07 01:17:55 +00003520 // Erase both -fmodule-cache-path and its argument.
3521 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3522 it = CmdArgs.erase(it, it+2);
Chad Rosier80717972011-08-26 18:30:43 +00003523 ie = CmdArgs.end();
Chad Rosier04225c12011-08-18 01:18:28 +00003524 continue;
3525 }
3526
Bob Wilson2872c8d2012-02-07 01:17:55 +00003527 // Remove unsupported -f options.
3528 if (Option.startswith("-f")) {
3529 // Remove -f/-fno- to reduce the number of cases.
3530 if (Option.startswith("-fno-"))
3531 Option = Option.substr(5);
3532 else
3533 Option = Option.substr(2);
3534 RemoveOption = llvm::StringSwitch<bool>(Option)
3535 .Case("altivec", true)
3536 .Case("modules", true)
3537 .Case("diagnostics-show-note-include-stack", true)
3538 .Default(false);
3539 }
3540
Chad Rosier80717972011-08-26 18:30:43 +00003541 // Handle machine specific options.
3542 if (Option.startswith("-m")) {
3543 RemoveOption = llvm::StringSwitch<bool>(Option)
3544 .Case("-mthumb", true)
3545 .Case("-mno-thumb", true)
3546 .Case("-mno-fused-madd", true)
3547 .Case("-mlong-branch", true)
3548 .Case("-mlongcall", true)
3549 .Case("-mcpu=G4", true)
3550 .Case("-mcpu=G5", true)
3551 .Default(false);
3552 }
3553
3554 // Handle warning options.
3555 if (Option.startswith("-W")) {
3556 // Remove -W/-Wno- to reduce the number of cases.
3557 if (Option.startswith("-Wno-"))
3558 Option = Option.substr(5);
3559 else
3560 Option = Option.substr(2);
3561
3562 RemoveOption = llvm::StringSwitch<bool>(Option)
3563 .Case("address-of-temporary", true)
3564 .Case("ambiguous-member-template", true)
3565 .Case("analyzer-incompatible-plugin", true)
3566 .Case("array-bounds", true)
3567 .Case("array-bounds-pointer-arithmetic", true)
3568 .Case("bind-to-temporary-copy", true)
3569 .Case("bitwise-op-parentheses", true)
3570 .Case("bool-conversions", true)
3571 .Case("builtin-macro-redefined", true)
3572 .Case("c++-hex-floats", true)
3573 .Case("c++0x-compat", true)
3574 .Case("c++0x-extensions", true)
3575 .Case("c++0x-narrowing", true)
Richard Smith575fdda2011-10-13 23:32:09 +00003576 .Case("c++11-compat", true)
3577 .Case("c++11-extensions", true)
3578 .Case("c++11-narrowing", true)
Chad Rosier80717972011-08-26 18:30:43 +00003579 .Case("conditional-uninitialized", true)
3580 .Case("constant-conversion", true)
David Blaikie95187bd2012-03-15 04:50:32 +00003581 .Case("conversion-null", true)
Chad Rosier80717972011-08-26 18:30:43 +00003582 .Case("CFString-literal", true)
3583 .Case("constant-logical-operand", true)
3584 .Case("custom-atomic-properties", true)
3585 .Case("default-arg-special-member", true)
3586 .Case("delegating-ctor-cycles", true)
3587 .Case("delete-non-virtual-dtor", true)
3588 .Case("deprecated-implementations", true)
3589 .Case("deprecated-writable-strings", true)
3590 .Case("distributed-object-modifiers", true)
3591 .Case("duplicate-method-arg", true)
3592 .Case("dynamic-class-memaccess", true)
3593 .Case("enum-compare", true)
3594 .Case("exit-time-destructors", true)
3595 .Case("gnu", true)
3596 .Case("gnu-designator", true)
3597 .Case("header-hygiene", true)
3598 .Case("idiomatic-parentheses", true)
3599 .Case("ignored-qualifiers", true)
3600 .Case("implicit-atomic-properties", true)
3601 .Case("incompatible-pointer-types", true)
3602 .Case("incomplete-implementation", true)
3603 .Case("initializer-overrides", true)
3604 .Case("invalid-noreturn", true)
3605 .Case("invalid-token-paste", true)
Ivan Krasin08f35a72011-10-06 02:46:34 +00003606 .Case("language-extension-token", true)
Chad Rosier80717972011-08-26 18:30:43 +00003607 .Case("literal-conversion", true)
3608 .Case("literal-range", true)
3609 .Case("local-type-template-args", true)
3610 .Case("logical-op-parentheses", true)
3611 .Case("method-signatures", true)
3612 .Case("microsoft", true)
3613 .Case("mismatched-tags", true)
3614 .Case("missing-method-return-type", true)
3615 .Case("non-pod-varargs", true)
3616 .Case("nonfragile-abi2", true)
3617 .Case("null-arithmetic", true)
3618 .Case("null-dereference", true)
3619 .Case("out-of-line-declaration", true)
3620 .Case("overriding-method-mismatch", true)
3621 .Case("readonly-setter-attrs", true)
3622 .Case("return-stack-address", true)
3623 .Case("self-assign", true)
3624 .Case("semicolon-before-method-body", true)
3625 .Case("sentinel", true)
3626 .Case("shift-overflow", true)
3627 .Case("shift-sign-overflow", true)
3628 .Case("sign-conversion", true)
3629 .Case("sizeof-array-argument", true)
3630 .Case("sizeof-pointer-memaccess", true)
3631 .Case("string-compare", true)
3632 .Case("super-class-method-mismatch", true)
3633 .Case("tautological-compare", true)
3634 .Case("typedef-redefinition", true)
3635 .Case("typename-missing", true)
3636 .Case("undefined-reinterpret-cast", true)
3637 .Case("unknown-warning-option", true)
3638 .Case("unnamed-type-template-args", true)
3639 .Case("unneeded-internal-declaration", true)
3640 .Case("unneeded-member-function", true)
3641 .Case("unused-comparison", true)
3642 .Case("unused-exception-parameter", true)
3643 .Case("unused-member-function", true)
3644 .Case("unused-result", true)
3645 .Case("vector-conversions", true)
3646 .Case("vla", true)
3647 .Case("used-but-marked-unused", true)
3648 .Case("weak-vtables", true)
3649 .Default(false);
3650 } // if (Option.startswith("-W"))
Chad Rosier04225c12011-08-18 01:18:28 +00003651 if (RemoveOption) {
Chad Rosier285f9a22011-08-17 18:24:55 +00003652 it = CmdArgs.erase(it);
Chad Rosiercc0de8c2011-08-17 18:51:56 +00003653 ie = CmdArgs.end();
Chad Rosier30601782011-08-17 23:08:45 +00003654 } else {
Chad Rosier285f9a22011-08-17 18:24:55 +00003655 ++it;
Chad Rosier30601782011-08-17 23:08:45 +00003656 }
Chad Rosier285f9a22011-08-17 18:24:55 +00003657 }
3658}
3659
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003660void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003661 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003662 const Driver &D = getToolChain().getDriver();
Daniel Dunbare2fd6642009-09-10 01:21:12 +00003663
3664 CheckCodeGenerationOptions(D, Args);
3665
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003666 // Derived from cc1 spec.
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003667 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3668 !Args.hasArg(options::OPT_mdynamic_no_pic))
3669 CmdArgs.push_back("-fPIC");
3670
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003671 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3672 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3673 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3674 CmdArgs.push_back("-fno-builtin-strcat");
3675 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3676 CmdArgs.push_back("-fno-builtin-strcpy");
3677 }
3678
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003679 if (Args.hasArg(options::OPT_g_Flag) &&
3680 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3681 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3682}
3683
3684void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3685 const InputInfoList &Inputs,
3686 const ArgStringList &OutputArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003687 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003688
3689 // Derived from cc1_options spec.
3690 if (Args.hasArg(options::OPT_fast) ||
3691 Args.hasArg(options::OPT_fastf) ||
3692 Args.hasArg(options::OPT_fastcp))
3693 CmdArgs.push_back("-O3");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003694
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003695 if (Arg *A = Args.getLastArg(options::OPT_pg))
3696 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003697 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003698 << A->getAsString(Args) << "-fomit-frame-pointer";
3699
3700 AddCC1Args(Args, CmdArgs);
3701
3702 if (!Args.hasArg(options::OPT_Q))
3703 CmdArgs.push_back("-quiet");
3704
3705 CmdArgs.push_back("-dumpbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003706 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003707
3708 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3709
3710 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3711 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3712
3713 // FIXME: The goal is to use the user provided -o if that is our
3714 // final output, otherwise to drive from the original input
3715 // name. Find a clean way to go about this.
3716 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3717 Args.hasArg(options::OPT_o)) {
3718 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3719 CmdArgs.push_back("-auxbase-strip");
3720 CmdArgs.push_back(OutputOpt->getValue(Args));
3721 } else {
3722 CmdArgs.push_back("-auxbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003723 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003724 }
3725
3726 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3727
3728 Args.AddAllArgs(CmdArgs, options::OPT_O);
3729 // FIXME: -Wall is getting some special treatment. Investigate.
3730 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3731 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003732 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003733 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003734 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3735 // Honor -std-default.
3736 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3737 "-std=", /*Joined=*/true);
3738 }
3739
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003740 if (Args.hasArg(options::OPT_v))
3741 CmdArgs.push_back("-version");
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00003742 if (Args.hasArg(options::OPT_pg) &&
3743 getToolChain().SupportsProfiling())
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003744 CmdArgs.push_back("-p");
3745 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003746
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003747 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003748 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3749 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3750 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3751 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3752 //
3753 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003754 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3755 options::OPT_fsyntax_only),
3756 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003757 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3758 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3759 (*it)->claim();
3760 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003761 }
3762 }
3763 } else
3764 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003765
Daniel Dunbar089f8722011-04-07 20:41:03 +00003766 // Claim Clang only -f options, they aren't worth warning about.
3767 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3768
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003769 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3770 if (Args.hasArg(options::OPT_Qn))
3771 CmdArgs.push_back("-fno-ident");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003772
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003773 // FIXME: This isn't correct.
3774 //Args.AddLastArg(CmdArgs, options::OPT__help)
3775 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3776
3777 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3778
3779 // FIXME: Still don't get what is happening here. Investigate.
3780 Args.AddAllArgs(CmdArgs, options::OPT__param);
3781
3782 if (Args.hasArg(options::OPT_fmudflap) ||
3783 Args.hasArg(options::OPT_fmudflapth)) {
3784 CmdArgs.push_back("-fno-builtin");
3785 CmdArgs.push_back("-fno-merge-constants");
3786 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003787
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003788 if (Args.hasArg(options::OPT_coverage)) {
3789 CmdArgs.push_back("-fprofile-arcs");
3790 CmdArgs.push_back("-ftest-coverage");
3791 }
3792
3793 if (types::isCXX(Inputs[0].getType()))
3794 CmdArgs.push_back("-D__private_extern__=extern");
3795}
3796
3797void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3798 const InputInfoList &Inputs,
3799 const ArgStringList &OutputArgs) const {
3800 // Derived from cpp_options
3801 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003802
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003803 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3804
3805 AddCC1Args(Args, CmdArgs);
3806
3807 // NOTE: The code below has some commonality with cpp_options, but
3808 // in classic gcc style ends up sending things in different
3809 // orders. This may be a good merge candidate once we drop pedantic
3810 // compatibility.
3811
3812 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003813 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003814 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003815 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3816 // Honor -std-default.
3817 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3818 "-std=", /*Joined=*/true);
3819 }
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003820 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3821 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003822
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003823 // The driver treats -fsyntax-only specially.
3824 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3825
Daniel Dunbar089f8722011-04-07 20:41:03 +00003826 // Claim Clang only -f options, they aren't worth warning about.
3827 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3828
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003829 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3830 !Args.hasArg(options::OPT_fno_working_directory))
3831 CmdArgs.push_back("-fworking-directory");
3832
3833 Args.AddAllArgs(CmdArgs, options::OPT_O);
3834 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3835 if (Args.hasArg(options::OPT_save_temps))
3836 CmdArgs.push_back("-fpch-preprocess");
3837}
3838
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003839void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003840 ArgStringList &CmdArgs,
Mike Stump1eb44332009-09-09 15:08:12 +00003841 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003842 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003843
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003844 CheckPreprocessingOptions(D, Args);
3845
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003846 // Derived from cpp_unique_options.
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003847 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3848 Args.AddLastArg(CmdArgs, options::OPT_C);
3849 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003850 if (!Args.hasArg(options::OPT_Q))
3851 CmdArgs.push_back("-quiet");
3852 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor4c2bcad2010-03-24 20:13:48 +00003853 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003854 Args.AddLastArg(CmdArgs, options::OPT_v);
3855 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3856 Args.AddLastArg(CmdArgs, options::OPT_P);
3857
3858 // FIXME: Handle %I properly.
3859 if (getToolChain().getArchName() == "x86_64") {
3860 CmdArgs.push_back("-imultilib");
3861 CmdArgs.push_back("x86_64");
3862 }
3863
3864 if (Args.hasArg(options::OPT_MD)) {
3865 CmdArgs.push_back("-MD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003866 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003867 }
3868
3869 if (Args.hasArg(options::OPT_MMD)) {
3870 CmdArgs.push_back("-MMD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003871 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003872 }
3873
3874 Args.AddLastArg(CmdArgs, options::OPT_M);
3875 Args.AddLastArg(CmdArgs, options::OPT_MM);
3876 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3877 Args.AddLastArg(CmdArgs, options::OPT_MG);
3878 Args.AddLastArg(CmdArgs, options::OPT_MP);
3879 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3880 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3881 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3882 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3883 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3884 CmdArgs.push_back("-MQ");
3885 CmdArgs.push_back(OutputOpt->getValue(Args));
3886 }
3887 }
3888
3889 Args.AddLastArg(CmdArgs, options::OPT_remap);
3890 if (Args.hasArg(options::OPT_g3))
3891 CmdArgs.push_back("-dD");
3892 Args.AddLastArg(CmdArgs, options::OPT_H);
3893
3894 AddCPPArgs(Args, CmdArgs);
3895
3896 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3897 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3898
3899 for (InputInfoList::const_iterator
3900 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3901 const InputInfo &II = *it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003902
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003903 CmdArgs.push_back(II.getFilename());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003904 }
3905
3906 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3907 options::OPT_Xpreprocessor);
3908
3909 if (Args.hasArg(options::OPT_fmudflap)) {
3910 CmdArgs.push_back("-D_MUDFLAP");
3911 CmdArgs.push_back("-include");
3912 CmdArgs.push_back("mf-runtime.h");
3913 }
3914
3915 if (Args.hasArg(options::OPT_fmudflapth)) {
3916 CmdArgs.push_back("-D_MUDFLAP");
3917 CmdArgs.push_back("-D_MUDFLAPTH");
3918 CmdArgs.push_back("-include");
3919 CmdArgs.push_back("mf-runtime.h");
3920 }
3921}
3922
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003923void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003924 ArgStringList &CmdArgs) const {
3925 // Derived from cpp spec.
3926
3927 if (Args.hasArg(options::OPT_static)) {
3928 // The gcc spec is broken here, it refers to dynamic but
3929 // that has been translated. Start by being bug compatible.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003930
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003931 // if (!Args.hasArg(arglist.parser.dynamicOption))
3932 CmdArgs.push_back("-D__STATIC__");
3933 } else
3934 CmdArgs.push_back("-D__DYNAMIC__");
3935
3936 if (Args.hasArg(options::OPT_pthread))
3937 CmdArgs.push_back("-D_REENTRANT");
3938}
3939
Daniel Dunbar40f12652009-03-29 17:08:39 +00003940void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003941 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003942 const InputInfoList &Inputs,
3943 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00003944 const char *LinkingOutput) const {
3945 ArgStringList CmdArgs;
3946
3947 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3948
3949 CmdArgs.push_back("-E");
3950
3951 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbar40f12652009-03-29 17:08:39 +00003952 Args.hasArg(options::OPT_traditional_cpp))
3953 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003954
Daniel Dunbar40f12652009-03-29 17:08:39 +00003955 ArgStringList OutputArgs;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003956 assert(Output.isFilename() && "Unexpected CC1 output.");
3957 OutputArgs.push_back("-o");
3958 OutputArgs.push_back(Output.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00003959
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +00003960 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbar9120f172009-03-29 22:27:40 +00003961 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3962 } else {
3963 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3964 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3965 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003966
Daniel Dunbar8a2073a2009-04-03 01:27:06 +00003967 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3968
Chad Rosier4fe4d732011-09-08 00:38:00 +00003969 RemoveCC1UnsupportedArgs(CmdArgs);
3970
Daniel Dunbar40f12652009-03-29 17:08:39 +00003971 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003972 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003973 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003974 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00003975}
3976
3977void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003978 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003979 const InputInfoList &Inputs,
3980 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00003981 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003982 const Driver &D = getToolChain().getDriver();
Daniel Dunbar40f12652009-03-29 17:08:39 +00003983 ArgStringList CmdArgs;
3984
3985 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3986
Bob Wilson651f3d42012-04-01 23:03:29 +00003987 // Silence warning about unused --serialize-diagnostics
3988 Args.ClaimAllArgs(options::OPT__serialize_diags);
3989
Daniel Dunbar40f12652009-03-29 17:08:39 +00003990 types::ID InputType = Inputs[0].getType();
David Blaikied624a5b2012-04-04 20:43:14 +00003991 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003992 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar40f12652009-03-29 17:08:39 +00003993 << A->getAsString(Args) << "-E";
3994
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003995 if (JA.getType() == types::TY_LLVM_IR ||
3996 JA.getType() == types::TY_LTO_IR)
Daniel Dunbar40f12652009-03-29 17:08:39 +00003997 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003998 else if (JA.getType() == types::TY_LLVM_BC ||
3999 JA.getType() == types::TY_LTO_BC)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004000 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004001 else if (Output.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004002 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004003 << getToolChain().getTripleString();
Daniel Dunbarae24a882010-02-11 17:33:45 +00004004 else if (JA.getType() != types::TY_PP_Asm &&
4005 JA.getType() != types::TY_PCH)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004006 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004007 << getTypeName(JA.getType());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004008
4009 ArgStringList OutputArgs;
4010 if (Output.getType() != types::TY_PCH) {
4011 OutputArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004012 if (Output.isNothing())
Daniel Dunbar40f12652009-03-29 17:08:39 +00004013 OutputArgs.push_back("/dev/null");
4014 else
4015 OutputArgs.push_back(Output.getFilename());
4016 }
4017
4018 // There is no need for this level of compatibility, but it makes
4019 // diffing easier.
4020 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4021 Args.hasArg(options::OPT_S));
4022
4023 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004024 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbar40f12652009-03-29 17:08:39 +00004025 if (OutputArgsEarly) {
4026 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4027 } else {
4028 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4029 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4030 }
4031 } else {
4032 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004033
Daniel Dunbar40f12652009-03-29 17:08:39 +00004034 for (InputInfoList::const_iterator
4035 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4036 const InputInfo &II = *it;
4037
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004038 // Reject AST inputs.
4039 if (II.getType() == types::TY_AST) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004040 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004041 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004042 return;
4043 }
4044
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004045 CmdArgs.push_back(II.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004046 }
4047
4048 if (OutputArgsEarly) {
4049 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4050 } else {
4051 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4052 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4053 }
4054 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004055
Daniel Dunbar40f12652009-03-29 17:08:39 +00004056 if (Output.getType() == types::TY_PCH) {
4057 assert(Output.isFilename() && "Invalid PCH output.");
4058
4059 CmdArgs.push_back("-o");
4060 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4061 // to be a good reason.
Chad Rosier8c221b82011-08-01 19:58:48 +00004062 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004063 D.GetTemporaryPath("cc", "s"));
Chad Rosier8c221b82011-08-01 19:58:48 +00004064 C.addTempFile(TmpPath);
4065 CmdArgs.push_back(TmpPath);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004066
Eric Christopher88b7cf02011-08-19 00:30:14 +00004067 // If we're emitting a pch file with the last 4 characters of ".pth"
4068 // and falling back to llvm-gcc we want to use ".gch" instead.
4069 std::string OutputFile(Output.getFilename());
4070 size_t loc = OutputFile.rfind(".pth");
4071 if (loc != std::string::npos)
4072 OutputFile.replace(loc, 4, ".gch");
4073 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4074 CmdArgs.push_back(Tmp);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004075 }
Daniel Dunbar40f12652009-03-29 17:08:39 +00004076
Chad Rosier285f9a22011-08-17 18:24:55 +00004077 RemoveCC1UnsupportedArgs(CmdArgs);
4078
Daniel Dunbar40f12652009-03-29 17:08:39 +00004079 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004080 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004081 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004082 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00004083}
4084
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004085void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004086 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004087 const InputInfoList &Inputs,
4088 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004089 const char *LinkingOutput) const {
4090 ArgStringList CmdArgs;
4091
4092 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4093 const InputInfo &Input = Inputs[0];
4094
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004095 // Determine the original source input.
4096 const Action *SourceAction = &JA;
4097 while (SourceAction->getKind() != Action::InputClass) {
4098 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4099 SourceAction = SourceAction->getInputs()[0];
4100 }
4101
4102 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004103 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004104 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004105 if (Args.hasArg(options::OPT_gstabs))
4106 CmdArgs.push_back("--gstabs");
4107 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004108 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004109 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004110
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004111 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004112 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004113
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004114 // Use -force_cpusubtype_ALL on x86 by default.
4115 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4116 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004117 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4118 CmdArgs.push_back("-force_cpusubtype_ALL");
4119
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004120 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4121 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004122 Args.hasArg(options::OPT_static) ||
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004123 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004124 CmdArgs.push_back("-static");
4125
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004126 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4127 options::OPT_Xassembler);
4128
4129 assert(Output.isFilename() && "Unexpected lipo output.");
4130 CmdArgs.push_back("-o");
4131 CmdArgs.push_back(Output.getFilename());
4132
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004133 assert(Input.isFilename() && "Invalid input.");
4134 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004135
4136 // asm_final spec is empty.
4137
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004138 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004139 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004140 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004141}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004142
David Blaikie99ba9e32011-12-20 02:48:34 +00004143void darwin::DarwinTool::anchor() {}
4144
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004145void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4146 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004147 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004148
Daniel Dunbar02633b52009-03-26 16:23:12 +00004149 // Derived from darwin_arch spec.
4150 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004151 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004152
Daniel Dunbareeff4062010-01-22 02:04:58 +00004153 // FIXME: Is this needed anymore?
4154 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004155 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004156}
4157
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004158void darwin::Link::AddLinkArgs(Compilation &C,
4159 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004160 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004161 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004162 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004163
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004164 unsigned Version[3] = { 0, 0, 0 };
4165 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4166 bool HadExtra;
4167 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4168 Version[1], Version[2], HadExtra) ||
4169 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004170 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004171 << A->getAsString(Args);
4172 }
4173
4174 // Newer linkers support -demangle, pass it if supported and not disabled by
4175 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004176 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004177 // Don't pass -demangle to ld_classic.
4178 //
4179 // FIXME: This is a temporary workaround, ld should be handling this.
4180 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4181 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004182 if (getToolChain().getArch() == llvm::Triple::x86) {
4183 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4184 options::OPT_Wl_COMMA),
4185 ie = Args.filtered_end(); it != ie; ++it) {
4186 const Arg *A = *it;
4187 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004188 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004189 UsesLdClassic = true;
4190 }
4191 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004192 if (!UsesLdClassic)
4193 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004194 }
4195
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004196 // If we are using LTO, then automatically create a temporary file path for
4197 // the linker to use, so that it's lifetime will extend past a possible
4198 // dsymutil step.
Daniel Dunbara68e1c32011-06-21 21:18:32 +00004199 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004200 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004201 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004202 C.addTempFile(TmpPath);
4203 CmdArgs.push_back("-object_path_lto");
4204 CmdArgs.push_back(TmpPath);
4205 }
4206
Daniel Dunbar02633b52009-03-26 16:23:12 +00004207 // Derived from the "link" spec.
4208 Args.AddAllArgs(CmdArgs, options::OPT_static);
4209 if (!Args.hasArg(options::OPT_static))
4210 CmdArgs.push_back("-dynamic");
4211 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4212 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4213 // here. How do we wish to handle such things?
4214 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004215
Daniel Dunbar02633b52009-03-26 16:23:12 +00004216 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004217 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004218 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004219 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004220
4221 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4222 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4223 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4224
4225 Arg *A;
4226 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4227 (A = Args.getLastArg(options::OPT_current__version)) ||
4228 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004229 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004230 << A->getAsString(Args) << "-dynamiclib";
4231
4232 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4233 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4234 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4235 } else {
4236 CmdArgs.push_back("-dylib");
4237
4238 Arg *A;
4239 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4240 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4241 (A = Args.getLastArg(options::OPT_client__name)) ||
4242 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4243 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4244 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004245 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004246 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004247
Daniel Dunbar02633b52009-03-26 16:23:12 +00004248 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4249 "-dylib_compatibility_version");
4250 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4251 "-dylib_current_version");
4252
Daniel Dunbara6d38492010-01-22 02:04:52 +00004253 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004254
4255 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4256 "-dylib_install_name");
4257 }
4258
4259 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4260 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4261 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004262 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004263 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004264 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4265 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4266 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4267 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4268 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4269 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004270 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004271 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4272 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4273 Args.AddAllArgs(CmdArgs, options::OPT_init);
4274
Daniel Dunbarce911f52011-04-28 21:23:41 +00004275 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004276 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004277
4278 // If we had an explicit -mios-simulator-version-min argument, honor that,
4279 // otherwise use the traditional deployment targets. We can't just check the
4280 // is-sim attribute because existing code follows this path, and the linker
4281 // may not handle the argument.
4282 //
4283 // FIXME: We may be able to remove this, once we can verify no one depends on
4284 // it.
4285 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4286 CmdArgs.push_back("-ios_simulator_version_min");
4287 else if (DarwinTC.isTargetIPhoneOS())
4288 CmdArgs.push_back("-iphoneos_version_min");
4289 else
4290 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004291 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004292
Daniel Dunbar02633b52009-03-26 16:23:12 +00004293 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4294 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4295 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4296 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4297 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004298
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004299 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4300 options::OPT_fno_pie,
4301 options::OPT_fno_PIE)) {
4302 if (A->getOption().matches(options::OPT_fpie) ||
4303 A->getOption().matches(options::OPT_fPIE))
4304 CmdArgs.push_back("-pie");
4305 else
4306 CmdArgs.push_back("-no_pie");
4307 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004308
4309 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4310 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4311 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4312 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4313 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4314 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4315 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4316 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4317 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4318 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4319 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4320 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4321 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4322 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4323 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4324 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004325
Daniel Dunbarcc957192011-05-02 21:03:47 +00004326 // Give --sysroot= preference, over the Apple specific behavior to also use
4327 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004328 StringRef sysroot = C.getSysRoot();
4329 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004330 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004331 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004332 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4333 CmdArgs.push_back("-syslibroot");
4334 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004335 }
4336
Daniel Dunbar02633b52009-03-26 16:23:12 +00004337 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4338 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4339 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4340 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4341 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004342 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004343 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4344 Args.AddAllArgs(CmdArgs, options::OPT_y);
4345 Args.AddLastArg(CmdArgs, options::OPT_w);
4346 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4347 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4348 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4349 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4350 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4351 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4352 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4353 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4354 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4355 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4356 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4357 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4358}
4359
4360void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004361 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004362 const InputInfoList &Inputs,
4363 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004364 const char *LinkingOutput) const {
4365 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004366
Daniel Dunbar02633b52009-03-26 16:23:12 +00004367 // The logic here is derived from gcc's behavior; most of which
4368 // comes from specs (starting with link_command). Consult gcc for
4369 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004370 ArgStringList CmdArgs;
4371
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004372 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4373 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4374 options::OPT_ccc_arcmt_migrate)) {
4375 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4376 (*I)->claim();
4377 const char *Exec =
4378 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4379 CmdArgs.push_back(Output.getFilename());
4380 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4381 return;
4382 }
4383
Daniel Dunbar02633b52009-03-26 16:23:12 +00004384 // I'm not sure why this particular decomposition exists in gcc, but
4385 // we follow suite for ease of comparison.
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004386 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004387
Daniel Dunbar02633b52009-03-26 16:23:12 +00004388 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4389 Args.AddAllArgs(CmdArgs, options::OPT_s);
4390 Args.AddAllArgs(CmdArgs, options::OPT_t);
4391 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4392 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004393 Args.AddLastArg(CmdArgs, options::OPT_e);
4394 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4395 Args.AddAllArgs(CmdArgs, options::OPT_r);
4396
Daniel Dunbar270073c2010-10-18 22:08:36 +00004397 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4398 // members of static archive libraries which implement Objective-C classes or
4399 // categories.
4400 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4401 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004402
Daniel Dunbar02633b52009-03-26 16:23:12 +00004403 CmdArgs.push_back("-o");
4404 CmdArgs.push_back(Output.getFilename());
4405
Chad Rosier18937312012-05-16 23:45:12 +00004406 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004407 !Args.hasArg(options::OPT_nostartfiles)) {
4408 // Derived from startfile spec.
4409 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004410 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004411 if (getDarwinToolChain().isTargetIOSSimulator()) {
4412 // The simulator doesn't have a versioned crt1 file.
4413 CmdArgs.push_back("-ldylib1.o");
4414 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004415 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4416 CmdArgs.push_back("-ldylib1.o");
4417 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004418 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004419 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004420 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004421 CmdArgs.push_back("-ldylib1.10.5.o");
4422 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004423 } else {
4424 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004425 if (!Args.hasArg(options::OPT_static)) {
4426 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004427 if (getDarwinToolChain().isTargetIOSSimulator()) {
4428 // The simulator doesn't have a versioned crt1 file.
4429 CmdArgs.push_back("-lbundle1.o");
4430 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004431 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4432 CmdArgs.push_back("-lbundle1.o");
4433 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004434 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004435 CmdArgs.push_back("-lbundle1.o");
4436 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004437 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004438 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004439 if (Args.hasArg(options::OPT_pg) &&
4440 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004441 if (Args.hasArg(options::OPT_static) ||
4442 Args.hasArg(options::OPT_object) ||
4443 Args.hasArg(options::OPT_preload)) {
4444 CmdArgs.push_back("-lgcrt0.o");
4445 } else {
4446 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004447
Daniel Dunbar02633b52009-03-26 16:23:12 +00004448 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004449 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004450 // By default on OS X 10.8 and later, we don't link with a crt1.o
4451 // file and the linker knows to use _main as the entry point. But,
4452 // when compiling with -pg, we need to link with the gcrt1.o file,
4453 // so pass the -no_new_main option to tell the linker to use the
4454 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004455 if (getDarwinToolChain().isTargetMacOS() &&
4456 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4457 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004458 } else {
4459 if (Args.hasArg(options::OPT_static) ||
4460 Args.hasArg(options::OPT_object) ||
4461 Args.hasArg(options::OPT_preload)) {
4462 CmdArgs.push_back("-lcrt0.o");
4463 } else {
4464 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004465 if (getDarwinToolChain().isTargetIOSSimulator()) {
4466 // The simulator doesn't have a versioned crt1 file.
4467 CmdArgs.push_back("-lcrt1.o");
4468 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004469 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4470 CmdArgs.push_back("-lcrt1.o");
4471 else
4472 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004473 } else {
4474 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4475 CmdArgs.push_back("-lcrt1.o");
4476 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4477 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004478 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004479 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004480
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004481 // darwin_crt2 spec is empty.
4482 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004483 }
4484 }
4485 }
4486 }
4487
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004488 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4489 Args.hasArg(options::OPT_shared_libgcc) &&
4490 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004491 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004492 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004493 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004494 }
4495 }
4496
4497 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004498
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004499 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4500 // symbols may appear. Mark all of them as dynamic_lookup.
4501 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4502 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4503 options::OPT_fno_address_sanitizer, false)) {
4504 if (Args.hasArg(options::OPT_dynamiclib) ||
4505 Args.hasArg(options::OPT_bundle)) {
4506 CmdArgs.push_back("-undefined");
4507 CmdArgs.push_back("dynamic_lookup");
4508 }
4509 }
4510
Daniel Dunbar02633b52009-03-26 16:23:12 +00004511 if (Args.hasArg(options::OPT_fopenmp))
4512 // This is more complicated in gcc...
4513 CmdArgs.push_back("-lgomp");
4514
Douglas Gregor04e326b2012-05-15 21:00:27 +00004515 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4516
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004517 if (isObjCRuntimeLinked(Args) &&
4518 !Args.hasArg(options::OPT_nostdlib) &&
4519 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004520 // Avoid linking compatibility stubs on i386 mac.
4521 if (!getDarwinToolChain().isTargetMacOS() ||
4522 getDarwinToolChain().getArchName() != "i386") {
4523 // If we don't have ARC or subscripting runtime support, link in the
4524 // runtime stubs. We have to do this *before* adding any of the normal
4525 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004526 ObjCRuntime runtime =
4527 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004528 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004529 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004530 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004531 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004532 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004533 CmdArgs.push_back("-framework");
4534 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004535 // Link libobj.
4536 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004537 }
John McCallf85e1932011-06-15 23:02:42 +00004538
Daniel Dunbar02633b52009-03-26 16:23:12 +00004539 if (LinkingOutput) {
4540 CmdArgs.push_back("-arch_multiple");
4541 CmdArgs.push_back("-final_output");
4542 CmdArgs.push_back(LinkingOutput);
4543 }
4544
Daniel Dunbar02633b52009-03-26 16:23:12 +00004545 if (Args.hasArg(options::OPT_fnested_functions))
4546 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004547
Daniel Dunbar02633b52009-03-26 16:23:12 +00004548 if (!Args.hasArg(options::OPT_nostdlib) &&
4549 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004550 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004551 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004552
Daniel Dunbar02633b52009-03-26 16:23:12 +00004553 // link_ssp spec is empty.
4554
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004555 // Let the tool chain choose which runtime library to link.
4556 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004557 }
4558
Chad Rosier18937312012-05-16 23:45:12 +00004559 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004560 !Args.hasArg(options::OPT_nostartfiles)) {
4561 // endfile_spec is empty.
4562 }
4563
4564 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4565 Args.AddAllArgs(CmdArgs, options::OPT_F);
4566
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004567 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004568 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004569 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004570}
4571
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004572void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004573 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004574 const InputInfoList &Inputs,
4575 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004576 const char *LinkingOutput) const {
4577 ArgStringList CmdArgs;
4578
4579 CmdArgs.push_back("-create");
4580 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004581
4582 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004583 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004584
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004585 for (InputInfoList::const_iterator
4586 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4587 const InputInfo &II = *it;
4588 assert(II.isFilename() && "Unexpected lipo input.");
4589 CmdArgs.push_back(II.getFilename());
4590 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004591 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004592 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004593 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004594}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004595
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004596void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004597 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004598 const InputInfoList &Inputs,
4599 const ArgList &Args,
4600 const char *LinkingOutput) const {
4601 ArgStringList CmdArgs;
4602
Daniel Dunbar03e92302011-05-09 17:23:16 +00004603 CmdArgs.push_back("-o");
4604 CmdArgs.push_back(Output.getFilename());
4605
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004606 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4607 const InputInfo &Input = Inputs[0];
4608 assert(Input.isFilename() && "Unexpected dsymutil input.");
4609 CmdArgs.push_back(Input.getFilename());
4610
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004611 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004612 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004613 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004614}
4615
Eric Christopherf8571862011-08-23 17:56:55 +00004616void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4617 const InputInfo &Output,
4618 const InputInfoList &Inputs,
4619 const ArgList &Args,
4620 const char *LinkingOutput) const {
4621 ArgStringList CmdArgs;
4622 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004623 CmdArgs.push_back("--debug-info");
4624 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004625 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004626
4627 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4628 const InputInfo &Input = Inputs[0];
4629 assert(Input.isFilename() && "Unexpected verify input");
4630
4631 // Grabbing the output of the earlier dsymutil run.
4632 CmdArgs.push_back(Input.getFilename());
4633
4634 const char *Exec =
4635 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4636 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4637}
4638
David Chisnall31c46902012-02-15 13:39:01 +00004639void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4640 const InputInfo &Output,
4641 const InputInfoList &Inputs,
4642 const ArgList &Args,
4643 const char *LinkingOutput) const {
4644 ArgStringList CmdArgs;
4645
4646 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4647 options::OPT_Xassembler);
4648
4649 CmdArgs.push_back("-o");
4650 CmdArgs.push_back(Output.getFilename());
4651
4652 for (InputInfoList::const_iterator
4653 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4654 const InputInfo &II = *it;
4655 CmdArgs.push_back(II.getFilename());
4656 }
4657
4658 const char *Exec =
4659 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4660 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4661}
4662
4663
4664void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4665 const InputInfo &Output,
4666 const InputInfoList &Inputs,
4667 const ArgList &Args,
4668 const char *LinkingOutput) const {
4669 // FIXME: Find a real GCC, don't hard-code versions here
4670 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4671 const llvm::Triple &T = getToolChain().getTriple();
4672 std::string LibPath = "/usr/lib/";
4673 llvm::Triple::ArchType Arch = T.getArch();
4674 switch (Arch) {
4675 case llvm::Triple::x86:
4676 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4677 T.getOSName()).str() + "/4.5.2/";
4678 break;
4679 case llvm::Triple::x86_64:
4680 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4681 T.getOSName()).str();
4682 GCCLibPath += "/4.5.2/amd64/";
4683 LibPath += "amd64/";
4684 break;
4685 default:
4686 assert(0 && "Unsupported architecture");
4687 }
4688
4689 ArgStringList CmdArgs;
4690
David Chisnall41d476d2012-02-29 15:06:12 +00004691 // Demangle C++ names in errors
4692 CmdArgs.push_back("-C");
4693
David Chisnall31c46902012-02-15 13:39:01 +00004694 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4695 (!Args.hasArg(options::OPT_shared))) {
4696 CmdArgs.push_back("-e");
4697 CmdArgs.push_back("_start");
4698 }
4699
4700 if (Args.hasArg(options::OPT_static)) {
4701 CmdArgs.push_back("-Bstatic");
4702 CmdArgs.push_back("-dn");
4703 } else {
4704 CmdArgs.push_back("-Bdynamic");
4705 if (Args.hasArg(options::OPT_shared)) {
4706 CmdArgs.push_back("-shared");
4707 } else {
4708 CmdArgs.push_back("--dynamic-linker");
4709 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4710 }
4711 }
4712
4713 if (Output.isFilename()) {
4714 CmdArgs.push_back("-o");
4715 CmdArgs.push_back(Output.getFilename());
4716 } else {
4717 assert(Output.isNothing() && "Invalid output.");
4718 }
4719
4720 if (!Args.hasArg(options::OPT_nostdlib) &&
4721 !Args.hasArg(options::OPT_nostartfiles)) {
4722 if (!Args.hasArg(options::OPT_shared)) {
4723 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4724 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004725 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004726 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4727 } else {
4728 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004729 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4730 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004731 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004732 if (getToolChain().getDriver().CCCIsCXX)
4733 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004734 }
4735
4736 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4737
4738 Args.AddAllArgs(CmdArgs, options::OPT_L);
4739 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4740 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00004741 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00004742
4743 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4744
4745 if (!Args.hasArg(options::OPT_nostdlib) &&
4746 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00004747 if (getToolChain().getDriver().CCCIsCXX)
4748 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00004749 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00004750 if (!Args.hasArg(options::OPT_shared)) {
4751 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00004752 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00004753 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00004754 }
David Chisnall31c46902012-02-15 13:39:01 +00004755 }
4756
4757 if (!Args.hasArg(options::OPT_nostdlib) &&
4758 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00004759 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004760 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00004761 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004762
4763 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4764
4765 const char *Exec =
4766 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4767 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4768}
4769
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004770void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004771 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004772 const InputInfoList &Inputs,
4773 const ArgList &Args,
4774 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004775 ArgStringList CmdArgs;
4776
4777 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4778 options::OPT_Xassembler);
4779
4780 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004781 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004782
4783 for (InputInfoList::const_iterator
4784 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4785 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004786 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004787 }
4788
4789 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004790 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004791 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004792}
4793
4794void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004795 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004796 const InputInfoList &Inputs,
4797 const ArgList &Args,
4798 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004799 ArgStringList CmdArgs;
4800
4801 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004802 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004803 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004804 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004805 }
4806
4807 if (Args.hasArg(options::OPT_static)) {
4808 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004809 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004810 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004811// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004812 CmdArgs.push_back("-Bdynamic");
4813 if (Args.hasArg(options::OPT_shared)) {
4814 CmdArgs.push_back("-shared");
4815 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00004816 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004817 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4818 }
4819 }
4820
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004821 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004822 CmdArgs.push_back("-o");
4823 CmdArgs.push_back(Output.getFilename());
4824 } else {
4825 assert(Output.isNothing() && "Invalid output.");
4826 }
4827
4828 if (!Args.hasArg(options::OPT_nostdlib) &&
4829 !Args.hasArg(options::OPT_nostartfiles)) {
4830 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00004831 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004832 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004833 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004834 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004835 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004836 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004837 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004838 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004839 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004840 }
Chris Lattner38e317d2010-07-07 16:01:42 +00004841 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004842 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004843 }
4844
Daniel Dunbar294691e2009-11-04 06:24:38 +00004845 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4846 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004847 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004848
4849 Args.AddAllArgs(CmdArgs, options::OPT_L);
4850 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4851 Args.AddAllArgs(CmdArgs, options::OPT_e);
4852
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004853 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004854
4855 if (!Args.hasArg(options::OPT_nostdlib) &&
4856 !Args.hasArg(options::OPT_nodefaultlibs)) {
4857 // FIXME: For some reason GCC passes -lgcc before adding
4858 // the default system libraries. Just mimic this for now.
4859 CmdArgs.push_back("-lgcc");
4860
4861 if (Args.hasArg(options::OPT_pthread))
4862 CmdArgs.push_back("-pthread");
4863 if (!Args.hasArg(options::OPT_shared))
4864 CmdArgs.push_back("-lc");
4865 CmdArgs.push_back("-lgcc");
4866 }
4867
4868 if (!Args.hasArg(options::OPT_nostdlib) &&
4869 !Args.hasArg(options::OPT_nostartfiles)) {
4870 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004871 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004872 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004873 }
4874
Bill Wendling3f4be6f2011-06-27 19:15:03 +00004875 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00004876
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004877 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004878 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004879 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004880}
4881
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004882void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004883 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004884 const InputInfoList &Inputs,
4885 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00004886 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004887 ArgStringList CmdArgs;
4888
4889 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4890 options::OPT_Xassembler);
4891
4892 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004893 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004894
4895 for (InputInfoList::const_iterator
4896 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4897 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004898 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004899 }
4900
4901 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004902 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004903 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004904}
4905
4906void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004907 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004908 const InputInfoList &Inputs,
4909 const ArgList &Args,
4910 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004911 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004912 ArgStringList CmdArgs;
4913
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004914 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004915 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004916 CmdArgs.push_back("-e");
4917 CmdArgs.push_back("__start");
4918 }
4919
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004920 if (Args.hasArg(options::OPT_static)) {
4921 CmdArgs.push_back("-Bstatic");
4922 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00004923 if (Args.hasArg(options::OPT_rdynamic))
4924 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004925 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004926 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004927 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004928 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004929 } else {
4930 CmdArgs.push_back("-dynamic-linker");
4931 CmdArgs.push_back("/usr/libexec/ld.so");
4932 }
4933 }
4934
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004935 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004936 CmdArgs.push_back("-o");
4937 CmdArgs.push_back(Output.getFilename());
4938 } else {
4939 assert(Output.isNothing() && "Invalid output.");
4940 }
4941
4942 if (!Args.hasArg(options::OPT_nostdlib) &&
4943 !Args.hasArg(options::OPT_nostartfiles)) {
4944 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00004945 if (Args.hasArg(options::OPT_pg))
4946 CmdArgs.push_back(Args.MakeArgString(
4947 getToolChain().GetFilePath("gcrt0.o")));
4948 else
4949 CmdArgs.push_back(Args.MakeArgString(
4950 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004951 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004952 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004953 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004954 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004955 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004956 }
4957 }
4958
Edward O'Callaghane7e18202009-10-28 15:13:08 +00004959 std::string Triple = getToolChain().getTripleString();
4960 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00004961 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004962 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00004963 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004964
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004965 Args.AddAllArgs(CmdArgs, options::OPT_L);
4966 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4967 Args.AddAllArgs(CmdArgs, options::OPT_e);
4968
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004969 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004970
4971 if (!Args.hasArg(options::OPT_nostdlib) &&
4972 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00004973 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004974 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00004975 if (Args.hasArg(options::OPT_pg))
4976 CmdArgs.push_back("-lm_p");
4977 else
4978 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00004979 }
4980
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004981 // FIXME: For some reason GCC passes -lgcc before adding
4982 // the default system libraries. Just mimic this for now.
4983 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004984
Eric Christopherdc6cc872012-09-13 06:32:34 +00004985 if (Args.hasArg(options::OPT_pthread)) {
4986 if (!Args.hasArg(options::OPT_shared) &&
4987 Args.hasArg(options::OPT_pg))
4988 CmdArgs.push_back("-lpthread_p");
4989 else
4990 CmdArgs.push_back("-lpthread");
4991 }
4992
Chandler Carruth657849c2011-12-17 22:32:42 +00004993 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00004994 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00004995 CmdArgs.push_back("-lc_p");
4996 else
4997 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00004998 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00004999
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005000 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005001 }
5002
5003 if (!Args.hasArg(options::OPT_nostdlib) &&
5004 !Args.hasArg(options::OPT_nostartfiles)) {
5005 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005006 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005007 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005008 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005009 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005010 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005011 }
5012
5013 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005014 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005015 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005016}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005017
Eli Friedman42f74f22012-08-08 23:57:20 +00005018void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5019 const InputInfo &Output,
5020 const InputInfoList &Inputs,
5021 const ArgList &Args,
5022 const char *LinkingOutput) const {
5023 ArgStringList CmdArgs;
5024
5025 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5026 options::OPT_Xassembler);
5027
5028 CmdArgs.push_back("-o");
5029 CmdArgs.push_back(Output.getFilename());
5030
5031 for (InputInfoList::const_iterator
5032 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5033 const InputInfo &II = *it;
5034 CmdArgs.push_back(II.getFilename());
5035 }
5036
5037 const char *Exec =
5038 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5039 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5040}
5041
5042void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5043 const InputInfo &Output,
5044 const InputInfoList &Inputs,
5045 const ArgList &Args,
5046 const char *LinkingOutput) const {
5047 const Driver &D = getToolChain().getDriver();
5048 ArgStringList CmdArgs;
5049
5050 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5051 (!Args.hasArg(options::OPT_shared))) {
5052 CmdArgs.push_back("-e");
5053 CmdArgs.push_back("__start");
5054 }
5055
5056 if (Args.hasArg(options::OPT_static)) {
5057 CmdArgs.push_back("-Bstatic");
5058 } else {
5059 if (Args.hasArg(options::OPT_rdynamic))
5060 CmdArgs.push_back("-export-dynamic");
5061 CmdArgs.push_back("--eh-frame-hdr");
5062 CmdArgs.push_back("-Bdynamic");
5063 if (Args.hasArg(options::OPT_shared)) {
5064 CmdArgs.push_back("-shared");
5065 } else {
5066 CmdArgs.push_back("-dynamic-linker");
5067 CmdArgs.push_back("/usr/libexec/ld.so");
5068 }
5069 }
5070
5071 if (Output.isFilename()) {
5072 CmdArgs.push_back("-o");
5073 CmdArgs.push_back(Output.getFilename());
5074 } else {
5075 assert(Output.isNothing() && "Invalid output.");
5076 }
5077
5078 if (!Args.hasArg(options::OPT_nostdlib) &&
5079 !Args.hasArg(options::OPT_nostartfiles)) {
5080 if (!Args.hasArg(options::OPT_shared)) {
5081 if (Args.hasArg(options::OPT_pg))
5082 CmdArgs.push_back(Args.MakeArgString(
5083 getToolChain().GetFilePath("gcrt0.o")));
5084 else
5085 CmdArgs.push_back(Args.MakeArgString(
5086 getToolChain().GetFilePath("crt0.o")));
5087 CmdArgs.push_back(Args.MakeArgString(
5088 getToolChain().GetFilePath("crtbegin.o")));
5089 } else {
5090 CmdArgs.push_back(Args.MakeArgString(
5091 getToolChain().GetFilePath("crtbeginS.o")));
5092 }
5093 }
5094
5095 Args.AddAllArgs(CmdArgs, options::OPT_L);
5096 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5097 Args.AddAllArgs(CmdArgs, options::OPT_e);
5098
5099 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5100
5101 if (!Args.hasArg(options::OPT_nostdlib) &&
5102 !Args.hasArg(options::OPT_nodefaultlibs)) {
5103 if (D.CCCIsCXX) {
5104 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5105 if (Args.hasArg(options::OPT_pg))
5106 CmdArgs.push_back("-lm_p");
5107 else
5108 CmdArgs.push_back("-lm");
5109 }
5110
5111 if (Args.hasArg(options::OPT_pthread))
5112 CmdArgs.push_back("-lpthread");
5113 if (!Args.hasArg(options::OPT_shared)) {
5114 if (Args.hasArg(options::OPT_pg))
5115 CmdArgs.push_back("-lc_p");
5116 else
5117 CmdArgs.push_back("-lc");
5118 }
5119
5120 std::string myarch = "-lclang_rt.";
5121 const llvm::Triple &T = getToolChain().getTriple();
5122 llvm::Triple::ArchType Arch = T.getArch();
5123 switch (Arch) {
5124 case llvm::Triple::arm:
5125 myarch += ("arm");
5126 break;
5127 case llvm::Triple::x86:
5128 myarch += ("i386");
5129 break;
5130 case llvm::Triple::x86_64:
5131 myarch += ("amd64");
5132 break;
5133 default:
5134 assert(0 && "Unsupported architecture");
5135 }
5136 CmdArgs.push_back(Args.MakeArgString(myarch));
5137 }
5138
5139 if (!Args.hasArg(options::OPT_nostdlib) &&
5140 !Args.hasArg(options::OPT_nostartfiles)) {
5141 if (!Args.hasArg(options::OPT_shared))
5142 CmdArgs.push_back(Args.MakeArgString(
5143 getToolChain().GetFilePath("crtend.o")));
5144 else
5145 CmdArgs.push_back(Args.MakeArgString(
5146 getToolChain().GetFilePath("crtendS.o")));
5147 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005148
5149 const char *Exec =
5150 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5151 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005152}
5153
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005154void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005155 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005156 const InputInfoList &Inputs,
5157 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005158 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005159 ArgStringList CmdArgs;
5160
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005161 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5162 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005163 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005164 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005165 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005166 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005167 else if (getToolChain().getArch() == llvm::Triple::mips ||
5168 getToolChain().getArch() == llvm::Triple::mipsel ||
5169 getToolChain().getArch() == llvm::Triple::mips64 ||
5170 getToolChain().getArch() == llvm::Triple::mips64el) {
5171 StringRef CPUName;
5172 StringRef ABIName;
5173 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005174
Eric Christopherc55da4b2012-09-05 21:32:44 +00005175 CmdArgs.push_back("-march");
5176 CmdArgs.push_back(CPUName.data());
5177
5178 // Convert ABI name to the GNU tools acceptable variant.
5179 if (ABIName == "o32")
5180 ABIName = "32";
5181 else if (ABIName == "n64")
5182 ABIName = "64";
5183
5184 CmdArgs.push_back("-mabi");
5185 CmdArgs.push_back(ABIName.data());
5186
5187 if (getToolChain().getArch() == llvm::Triple::mips ||
5188 getToolChain().getArch() == llvm::Triple::mips64)
5189 CmdArgs.push_back("-EB");
5190 else
5191 CmdArgs.push_back("-EL");
5192
5193 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5194 options::OPT_fpic, options::OPT_fno_pic,
5195 options::OPT_fPIE, options::OPT_fno_PIE,
5196 options::OPT_fpie, options::OPT_fno_pie);
5197 if (LastPICArg &&
5198 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5199 LastPICArg->getOption().matches(options::OPT_fpic) ||
5200 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5201 LastPICArg->getOption().matches(options::OPT_fpie))) {
5202 CmdArgs.push_back("-KPIC");
5203 }
5204 }
Eric Christophered734732010-03-02 02:41:08 +00005205
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005206 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5207 options::OPT_Xassembler);
5208
5209 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005210 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005211
5212 for (InputInfoList::const_iterator
5213 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5214 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005215 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005216 }
5217
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005218 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005219 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005220 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005221}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005222
5223void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005224 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005225 const InputInfoList &Inputs,
5226 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005227 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005228 const toolchains::FreeBSD& ToolChain =
5229 static_cast<const toolchains::FreeBSD&>(getToolChain());
5230 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005231 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005232
5233 // Silence warning for "clang -g foo.o -o foo"
5234 Args.ClaimAllArgs(options::OPT_g_Group);
5235 // and "clang -emit-llvm foo.o -o foo"
5236 Args.ClaimAllArgs(options::OPT_emit_llvm);
5237 // and for "clang -w foo.o -o foo". Other warning options are already
5238 // handled somewhere else.
5239 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005240
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005241 if (!D.SysRoot.empty())
5242 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5243
Roman Divacky94380162012-08-28 15:09:03 +00005244 if (Args.hasArg(options::OPT_pie))
5245 CmdArgs.push_back("-pie");
5246
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005247 if (Args.hasArg(options::OPT_static)) {
5248 CmdArgs.push_back("-Bstatic");
5249 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005250 if (Args.hasArg(options::OPT_rdynamic))
5251 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005252 CmdArgs.push_back("--eh-frame-hdr");
5253 if (Args.hasArg(options::OPT_shared)) {
5254 CmdArgs.push_back("-Bshareable");
5255 } else {
5256 CmdArgs.push_back("-dynamic-linker");
5257 CmdArgs.push_back("/libexec/ld-elf.so.1");
5258 }
Roman Divacky94380162012-08-28 15:09:03 +00005259 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5260 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005261 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5262 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5263 CmdArgs.push_back("--hash-style=both");
5264 }
5265 }
5266 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005267 }
5268
5269 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5270 // instruct ld in the base system to link 32-bit code.
Roman Divacky94380162012-08-28 15:09:03 +00005271 if (ToolChain.getArchName() == "i386") {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005272 CmdArgs.push_back("-m");
5273 CmdArgs.push_back("elf_i386_fbsd");
5274 }
5275
Roman Divacky94380162012-08-28 15:09:03 +00005276 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky000a6552011-06-04 07:40:24 +00005277 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005278 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005279 }
5280
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005281 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005282 CmdArgs.push_back("-o");
5283 CmdArgs.push_back(Output.getFilename());
5284 } else {
5285 assert(Output.isNothing() && "Invalid output.");
5286 }
5287
5288 if (!Args.hasArg(options::OPT_nostdlib) &&
5289 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005290 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005291 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005292 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005293 crt1 = "gcrt1.o";
5294 else if (Args.hasArg(options::OPT_pie))
5295 crt1 = "Scrt1.o";
5296 else
5297 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005298 }
Roman Divacky94380162012-08-28 15:09:03 +00005299 if (crt1)
5300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5301
5302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5303
5304 const char *crtbegin = NULL;
5305 if (Args.hasArg(options::OPT_static))
5306 crtbegin = "crtbeginT.o";
5307 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5308 crtbegin = "crtbeginS.o";
5309 else
5310 crtbegin = "crtbegin.o";
5311
5312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005313 }
5314
5315 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005316 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005317 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5318 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005319 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005320 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5321 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005322 Args.AddAllArgs(CmdArgs, options::OPT_s);
5323 Args.AddAllArgs(CmdArgs, options::OPT_t);
5324 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5325 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005326
Roman Divacky94380162012-08-28 15:09:03 +00005327 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005328
5329 if (!Args.hasArg(options::OPT_nostdlib) &&
5330 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005331 if (D.CCCIsCXX) {
Roman Divacky94380162012-08-28 15:09:03 +00005332 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005333 if (Args.hasArg(options::OPT_pg))
5334 CmdArgs.push_back("-lm_p");
5335 else
5336 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005337 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005338 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5339 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005340 if (Args.hasArg(options::OPT_pg))
5341 CmdArgs.push_back("-lgcc_p");
5342 else
5343 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005344 if (Args.hasArg(options::OPT_static)) {
5345 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005346 } else if (Args.hasArg(options::OPT_pg)) {
5347 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005348 } else {
5349 CmdArgs.push_back("--as-needed");
5350 CmdArgs.push_back("-lgcc_s");
5351 CmdArgs.push_back("--no-as-needed");
5352 }
5353
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005354 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005355 if (Args.hasArg(options::OPT_pg))
5356 CmdArgs.push_back("-lpthread_p");
5357 else
5358 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005359 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005360
Roman Divackyc16bb762011-02-10 16:59:40 +00005361 if (Args.hasArg(options::OPT_pg)) {
5362 if (Args.hasArg(options::OPT_shared))
5363 CmdArgs.push_back("-lc");
5364 else
5365 CmdArgs.push_back("-lc_p");
5366 CmdArgs.push_back("-lgcc_p");
5367 } else {
5368 CmdArgs.push_back("-lc");
5369 CmdArgs.push_back("-lgcc");
5370 }
5371
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005372 if (Args.hasArg(options::OPT_static)) {
5373 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005374 } else if (Args.hasArg(options::OPT_pg)) {
5375 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005376 } else {
5377 CmdArgs.push_back("--as-needed");
5378 CmdArgs.push_back("-lgcc_s");
5379 CmdArgs.push_back("--no-as-needed");
5380 }
5381 }
5382
5383 if (!Args.hasArg(options::OPT_nostdlib) &&
5384 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005385 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005386 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005387 else
5388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005389 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005390 }
5391
Roman Divacky94380162012-08-28 15:09:03 +00005392 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005393
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005394 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005395 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005396 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005397}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005398
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005399void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5400 const InputInfo &Output,
5401 const InputInfoList &Inputs,
5402 const ArgList &Args,
5403 const char *LinkingOutput) const {
5404 ArgStringList CmdArgs;
5405
5406 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5407 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005408 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005409 CmdArgs.push_back("--32");
5410
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005411 // Set byte order explicitly
5412 if (getToolChain().getArchName() == "mips")
5413 CmdArgs.push_back("-EB");
5414 else if (getToolChain().getArchName() == "mipsel")
5415 CmdArgs.push_back("-EL");
5416
5417 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5418 options::OPT_Xassembler);
5419
5420 CmdArgs.push_back("-o");
5421 CmdArgs.push_back(Output.getFilename());
5422
5423 for (InputInfoList::const_iterator
5424 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5425 const InputInfo &II = *it;
5426 CmdArgs.push_back(II.getFilename());
5427 }
5428
David Chisnall5adcec12011-09-27 22:03:18 +00005429 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005430 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5431}
5432
5433void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5434 const InputInfo &Output,
5435 const InputInfoList &Inputs,
5436 const ArgList &Args,
5437 const char *LinkingOutput) const {
5438 const Driver &D = getToolChain().getDriver();
5439 ArgStringList CmdArgs;
5440
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005441 if (!D.SysRoot.empty())
5442 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5443
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005444 if (Args.hasArg(options::OPT_static)) {
5445 CmdArgs.push_back("-Bstatic");
5446 } else {
5447 if (Args.hasArg(options::OPT_rdynamic))
5448 CmdArgs.push_back("-export-dynamic");
5449 CmdArgs.push_back("--eh-frame-hdr");
5450 if (Args.hasArg(options::OPT_shared)) {
5451 CmdArgs.push_back("-Bshareable");
5452 } else {
5453 CmdArgs.push_back("-dynamic-linker");
5454 CmdArgs.push_back("/libexec/ld.elf_so");
5455 }
5456 }
5457
5458 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5459 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005460 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005461 CmdArgs.push_back("-m");
5462 CmdArgs.push_back("elf_i386");
5463 }
5464
5465 if (Output.isFilename()) {
5466 CmdArgs.push_back("-o");
5467 CmdArgs.push_back(Output.getFilename());
5468 } else {
5469 assert(Output.isNothing() && "Invalid output.");
5470 }
5471
5472 if (!Args.hasArg(options::OPT_nostdlib) &&
5473 !Args.hasArg(options::OPT_nostartfiles)) {
5474 if (!Args.hasArg(options::OPT_shared)) {
5475 CmdArgs.push_back(Args.MakeArgString(
5476 getToolChain().GetFilePath("crt0.o")));
5477 CmdArgs.push_back(Args.MakeArgString(
5478 getToolChain().GetFilePath("crti.o")));
5479 CmdArgs.push_back(Args.MakeArgString(
5480 getToolChain().GetFilePath("crtbegin.o")));
5481 } else {
5482 CmdArgs.push_back(Args.MakeArgString(
5483 getToolChain().GetFilePath("crti.o")));
5484 CmdArgs.push_back(Args.MakeArgString(
5485 getToolChain().GetFilePath("crtbeginS.o")));
5486 }
5487 }
5488
5489 Args.AddAllArgs(CmdArgs, options::OPT_L);
5490 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5491 Args.AddAllArgs(CmdArgs, options::OPT_e);
5492 Args.AddAllArgs(CmdArgs, options::OPT_s);
5493 Args.AddAllArgs(CmdArgs, options::OPT_t);
5494 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5495 Args.AddAllArgs(CmdArgs, options::OPT_r);
5496
5497 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5498
5499 if (!Args.hasArg(options::OPT_nostdlib) &&
5500 !Args.hasArg(options::OPT_nodefaultlibs)) {
5501 if (D.CCCIsCXX) {
5502 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5503 CmdArgs.push_back("-lm");
5504 }
5505 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5506 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005507 if (Args.hasArg(options::OPT_static)) {
5508 CmdArgs.push_back("-lgcc_eh");
5509 } else {
5510 CmdArgs.push_back("--as-needed");
5511 CmdArgs.push_back("-lgcc_s");
5512 CmdArgs.push_back("--no-as-needed");
5513 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005514 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005515
5516 if (Args.hasArg(options::OPT_pthread))
5517 CmdArgs.push_back("-lpthread");
5518 CmdArgs.push_back("-lc");
5519
5520 CmdArgs.push_back("-lgcc");
5521 if (Args.hasArg(options::OPT_static)) {
5522 CmdArgs.push_back("-lgcc_eh");
5523 } else {
5524 CmdArgs.push_back("--as-needed");
5525 CmdArgs.push_back("-lgcc_s");
5526 CmdArgs.push_back("--no-as-needed");
5527 }
5528 }
5529
5530 if (!Args.hasArg(options::OPT_nostdlib) &&
5531 !Args.hasArg(options::OPT_nostartfiles)) {
5532 if (!Args.hasArg(options::OPT_shared))
5533 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5534 "crtend.o")));
5535 else
5536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5537 "crtendS.o")));
5538 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5539 "crtn.o")));
5540 }
5541
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005542 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005543
David Chisnall5adcec12011-09-27 22:03:18 +00005544 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005545 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5546}
5547
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005548void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5549 const InputInfo &Output,
5550 const InputInfoList &Inputs,
5551 const ArgList &Args,
5552 const char *LinkingOutput) const {
5553 ArgStringList CmdArgs;
5554
5555 // Add --32/--64 to make sure we get the format we want.
5556 // This is incomplete
5557 if (getToolChain().getArch() == llvm::Triple::x86) {
5558 CmdArgs.push_back("--32");
5559 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5560 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005561 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5562 CmdArgs.push_back("-a32");
5563 CmdArgs.push_back("-mppc");
5564 CmdArgs.push_back("-many");
5565 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5566 CmdArgs.push_back("-a64");
5567 CmdArgs.push_back("-mppc64");
5568 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005569 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005570 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005571 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5572 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005573
5574 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5575 getToolChain().getTriple());
5576 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005577
5578 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5579 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5580 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005581 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5582 getToolChain().getArch() == llvm::Triple::mipsel ||
5583 getToolChain().getArch() == llvm::Triple::mips64 ||
5584 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005585 StringRef CPUName;
5586 StringRef ABIName;
5587 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005588
Simon Atanasyan073a7802012-04-07 22:31:29 +00005589 CmdArgs.push_back("-march");
5590 CmdArgs.push_back(CPUName.data());
5591
5592 // Convert ABI name to the GNU tools acceptable variant.
5593 if (ABIName == "o32")
5594 ABIName = "32";
5595 else if (ABIName == "n64")
5596 ABIName = "64";
5597
5598 CmdArgs.push_back("-mabi");
5599 CmdArgs.push_back(ABIName.data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005600
5601 if (getToolChain().getArch() == llvm::Triple::mips ||
5602 getToolChain().getArch() == llvm::Triple::mips64)
5603 CmdArgs.push_back("-EB");
5604 else
5605 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005606
5607 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5608 options::OPT_fpic, options::OPT_fno_pic,
5609 options::OPT_fPIE, options::OPT_fno_PIE,
5610 options::OPT_fpie, options::OPT_fno_pie);
5611 if (LastPICArg &&
5612 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5613 LastPICArg->getOption().matches(options::OPT_fpic) ||
5614 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5615 LastPICArg->getOption().matches(options::OPT_fpie))) {
5616 CmdArgs.push_back("-KPIC");
5617 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005618 }
5619
5620 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5621 options::OPT_Xassembler);
5622
5623 CmdArgs.push_back("-o");
5624 CmdArgs.push_back(Output.getFilename());
5625
5626 for (InputInfoList::const_iterator
5627 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5628 const InputInfo &II = *it;
5629 CmdArgs.push_back(II.getFilename());
5630 }
5631
5632 const char *Exec =
5633 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5634 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5635}
5636
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005637static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5638 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005639 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005640 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005641 Args.hasArg(options::OPT_static_libgcc);
5642 if (!D.CCCIsCXX)
5643 CmdArgs.push_back("-lgcc");
5644
5645 if (StaticLibgcc) {
5646 if (D.CCCIsCXX)
5647 CmdArgs.push_back("-lgcc");
5648 } else {
5649 if (!D.CCCIsCXX)
5650 CmdArgs.push_back("--as-needed");
5651 CmdArgs.push_back("-lgcc_s");
5652 if (!D.CCCIsCXX)
5653 CmdArgs.push_back("--no-as-needed");
5654 }
5655
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005656 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005657 CmdArgs.push_back("-lgcc_eh");
5658 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5659 CmdArgs.push_back("-lgcc");
5660}
5661
Rafael Espindolac1da9812010-11-07 20:14:31 +00005662void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5663 const InputInfo &Output,
5664 const InputInfoList &Inputs,
5665 const ArgList &Args,
5666 const char *LinkingOutput) const {
5667 const toolchains::Linux& ToolChain =
5668 static_cast<const toolchains::Linux&>(getToolChain());
5669 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005670 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chien94a71422012-09-02 09:30:11 +00005671 llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005672
Rafael Espindolac1da9812010-11-07 20:14:31 +00005673 ArgStringList CmdArgs;
5674
Rafael Espindola26f14c32010-11-15 18:28:16 +00005675 // Silence warning for "clang -g foo.o -o foo"
5676 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005677 // and "clang -emit-llvm foo.o -o foo"
5678 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00005679 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00005680 // handled somewhere else.
5681 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00005682
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005683 if (!D.SysRoot.empty())
5684 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005685
Rafael Espindolafdda1712010-11-17 22:26:15 +00005686 if (Args.hasArg(options::OPT_pie))
5687 CmdArgs.push_back("-pie");
5688
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00005689 if (Args.hasArg(options::OPT_rdynamic))
5690 CmdArgs.push_back("-export-dynamic");
5691
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00005692 if (Args.hasArg(options::OPT_s))
5693 CmdArgs.push_back("-s");
5694
Rafael Espindolac1da9812010-11-07 20:14:31 +00005695 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5696 e = ToolChain.ExtraOpts.end();
5697 i != e; ++i)
5698 CmdArgs.push_back(i->c_str());
5699
5700 if (!Args.hasArg(options::OPT_static)) {
5701 CmdArgs.push_back("--eh-frame-hdr");
5702 }
5703
5704 CmdArgs.push_back("-m");
5705 if (ToolChain.getArch() == llvm::Triple::x86)
5706 CmdArgs.push_back("elf_i386");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005707 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00005708 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005709 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005710 else if (ToolChain.getArch() == llvm::Triple::ppc)
5711 CmdArgs.push_back("elf32ppclinux");
5712 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5713 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00005714 else if (ToolChain.getArch() == llvm::Triple::mips)
5715 CmdArgs.push_back("elf32btsmip");
5716 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5717 CmdArgs.push_back("elf32ltsmip");
5718 else if (ToolChain.getArch() == llvm::Triple::mips64)
5719 CmdArgs.push_back("elf64btsmip");
5720 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5721 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005722 else
5723 CmdArgs.push_back("elf_x86_64");
5724
5725 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00005726 if (ToolChain.getArch() == llvm::Triple::arm
5727 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005728 CmdArgs.push_back("-Bstatic");
5729 else
5730 CmdArgs.push_back("-static");
5731 } else if (Args.hasArg(options::OPT_shared)) {
5732 CmdArgs.push_back("-shared");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005733 if ((ToolChain.getArch() == llvm::Triple::arm
5734 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5735 CmdArgs.push_back("-Bsymbolic");
5736 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005737 }
5738
5739 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00005740 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00005741 (!Args.hasArg(options::OPT_static) &&
5742 !Args.hasArg(options::OPT_shared))) {
5743 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005744 if (isAndroid)
5745 CmdArgs.push_back("/system/bin/linker");
5746 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005747 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregorf0594d82011-03-06 19:11:49 +00005748 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liu6cc9dc82012-07-30 11:05:56 +00005749 ToolChain.getArch() == llvm::Triple::thumb) {
5750 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5751 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5752 else
5753 CmdArgs.push_back("/lib/ld-linux.so.3");
5754 }
Eli Friedman5bea4f62011-11-08 19:43:37 +00005755 else if (ToolChain.getArch() == llvm::Triple::mips ||
5756 ToolChain.getArch() == llvm::Triple::mipsel)
5757 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan8491cb22012-04-06 20:14:27 +00005758 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5759 ToolChain.getArch() == llvm::Triple::mips64el)
5760 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005761 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005762 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005763 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005764 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005765 else
5766 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5767 }
5768
5769 CmdArgs.push_back("-o");
5770 CmdArgs.push_back(Output.getFilename());
5771
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005772 if (!Args.hasArg(options::OPT_nostdlib) &&
5773 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005774 if (!isAndroid) {
5775 const char *crt1 = NULL;
5776 if (!Args.hasArg(options::OPT_shared)){
5777 if (Args.hasArg(options::OPT_pie))
5778 crt1 = "Scrt1.o";
5779 else
5780 crt1 = "crt1.o";
5781 }
5782 if (crt1)
5783 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005784
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005785 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5786 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005787
Rafael Espindola89414b32010-11-12 03:00:39 +00005788 const char *crtbegin;
5789 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005790 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005791 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005792 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005793 else if (Args.hasArg(options::OPT_pie))
5794 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005795 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005796 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005797 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5798 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005799
5800 Args.AddAllArgs(CmdArgs, options::OPT_L);
5801
5802 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5803
Roman Divacky58e5ac92011-03-01 17:53:14 +00005804 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5805 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005806 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005807
Rafael Espindolac5151542012-04-09 23:53:34 +00005808 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5809 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5810 // forward.
5811 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5812 CmdArgs.push_back("-plugin");
5813 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5814 CmdArgs.push_back(Args.MakeArgString(Plugin));
5815 }
5816
Nick Lewyckye276cfc2012-08-17 03:39:16 +00005817 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5818 CmdArgs.push_back("--no-demangle");
5819
Rafael Espindolac1da9812010-11-07 20:14:31 +00005820 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5821
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005822 if (D.CCCIsCXX &&
5823 !Args.hasArg(options::OPT_nostdlib) &&
5824 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00005825 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5826 !Args.hasArg(options::OPT_static);
5827 if (OnlyLibstdcxxStatic)
5828 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005829 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00005830 if (OnlyLibstdcxxStatic)
5831 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005832 CmdArgs.push_back("-lm");
5833 }
5834
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005835 // Call this before we add the C run-time.
5836 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00005837 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005838
Rafael Espindola89414b32010-11-12 03:00:39 +00005839 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005840 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5841 if (Args.hasArg(options::OPT_static))
5842 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00005843
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005844 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00005845
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005846 if (Args.hasArg(options::OPT_pthread) ||
5847 Args.hasArg(options::OPT_pthreads))
5848 CmdArgs.push_back("-lpthread");
5849
5850 CmdArgs.push_back("-lc");
5851
5852 if (Args.hasArg(options::OPT_static))
5853 CmdArgs.push_back("--end-group");
5854 else
5855 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5856 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00005857
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005858 if (!Args.hasArg(options::OPT_nostartfiles)) {
5859 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005860 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005861 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005862 else if (Args.hasArg(options::OPT_pie))
5863 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005864 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005865 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005866
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005867 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005868 if (!isAndroid)
5869 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005870 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005871 }
5872
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005873 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005874
Rafael Espindolac1da9812010-11-07 20:14:31 +00005875 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5876}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005877
Chris Lattner38e317d2010-07-07 16:01:42 +00005878void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005879 const InputInfo &Output,
5880 const InputInfoList &Inputs,
5881 const ArgList &Args,
5882 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005883 ArgStringList CmdArgs;
5884
5885 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5886 options::OPT_Xassembler);
5887
5888 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005889 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005890
5891 for (InputInfoList::const_iterator
5892 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5893 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005894 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005895 }
5896
5897 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00005898 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005899 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005900}
5901
5902void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005903 const InputInfo &Output,
5904 const InputInfoList &Inputs,
5905 const ArgList &Args,
5906 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005907 const Driver &D = getToolChain().getDriver();
5908 ArgStringList CmdArgs;
5909
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005910 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005911 CmdArgs.push_back("-o");
5912 CmdArgs.push_back(Output.getFilename());
5913 } else {
5914 assert(Output.isNothing() && "Invalid output.");
5915 }
5916
5917 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00005918 !Args.hasArg(options::OPT_nostartfiles)) {
5919 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5920 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5921 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5922 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5923 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005924
5925 Args.AddAllArgs(CmdArgs, options::OPT_L);
5926 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5927 Args.AddAllArgs(CmdArgs, options::OPT_e);
5928
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005929 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005930
Eli Friedman6d402dc2011-12-08 23:54:21 +00005931 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5932
Chris Lattner38e317d2010-07-07 16:01:42 +00005933 if (!Args.hasArg(options::OPT_nostdlib) &&
5934 !Args.hasArg(options::OPT_nodefaultlibs)) {
5935 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005936 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005937 CmdArgs.push_back("-lm");
5938 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005939 }
5940
5941 if (!Args.hasArg(options::OPT_nostdlib) &&
5942 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00005943 if (Args.hasArg(options::OPT_pthread))
5944 CmdArgs.push_back("-lpthread");
5945 CmdArgs.push_back("-lc");
5946 CmdArgs.push_back("-lCompilerRT-Generic");
5947 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5948 CmdArgs.push_back(
5949 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005950 }
5951
Eli Friedman6d402dc2011-12-08 23:54:21 +00005952 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005953 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005954}
5955
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005956/// DragonFly Tools
5957
5958// For now, DragonFly Assemble does just about the same as for
5959// FreeBSD, but this may change soon.
5960void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005961 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005962 const InputInfoList &Inputs,
5963 const ArgList &Args,
5964 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005965 ArgStringList CmdArgs;
5966
5967 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5968 // instruct as in the base system to assemble 32-bit code.
5969 if (getToolChain().getArchName() == "i386")
5970 CmdArgs.push_back("--32");
5971
5972 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5973 options::OPT_Xassembler);
5974
5975 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005976 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005977
5978 for (InputInfoList::const_iterator
5979 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5980 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005981 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005982 }
5983
5984 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005985 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005986 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005987}
5988
5989void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005990 const InputInfo &Output,
5991 const InputInfoList &Inputs,
5992 const ArgList &Args,
5993 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005994 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005995 ArgStringList CmdArgs;
5996
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005997 if (!D.SysRoot.empty())
5998 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5999
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006000 if (Args.hasArg(options::OPT_static)) {
6001 CmdArgs.push_back("-Bstatic");
6002 } else {
6003 if (Args.hasArg(options::OPT_shared))
6004 CmdArgs.push_back("-Bshareable");
6005 else {
6006 CmdArgs.push_back("-dynamic-linker");
6007 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6008 }
6009 }
6010
6011 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6012 // instruct ld in the base system to link 32-bit code.
6013 if (getToolChain().getArchName() == "i386") {
6014 CmdArgs.push_back("-m");
6015 CmdArgs.push_back("elf_i386");
6016 }
6017
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006018 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006019 CmdArgs.push_back("-o");
6020 CmdArgs.push_back(Output.getFilename());
6021 } else {
6022 assert(Output.isNothing() && "Invalid output.");
6023 }
6024
6025 if (!Args.hasArg(options::OPT_nostdlib) &&
6026 !Args.hasArg(options::OPT_nostartfiles)) {
6027 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006028 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006029 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006030 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006031 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006032 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006033 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006034 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00006035 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006036 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006037 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006038 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006039 }
6040 }
6041
6042 Args.AddAllArgs(CmdArgs, options::OPT_L);
6043 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6044 Args.AddAllArgs(CmdArgs, options::OPT_e);
6045
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006046 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006047
6048 if (!Args.hasArg(options::OPT_nostdlib) &&
6049 !Args.hasArg(options::OPT_nodefaultlibs)) {
6050 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6051 // rpaths
6052 CmdArgs.push_back("-L/usr/lib/gcc41");
6053
6054 if (!Args.hasArg(options::OPT_static)) {
6055 CmdArgs.push_back("-rpath");
6056 CmdArgs.push_back("/usr/lib/gcc41");
6057
6058 CmdArgs.push_back("-rpath-link");
6059 CmdArgs.push_back("/usr/lib/gcc41");
6060
6061 CmdArgs.push_back("-rpath");
6062 CmdArgs.push_back("/usr/lib");
6063
6064 CmdArgs.push_back("-rpath-link");
6065 CmdArgs.push_back("/usr/lib");
6066 }
6067
Rafael Espindola405861d2010-07-20 12:59:03 +00006068 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006069 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006070 CmdArgs.push_back("-lm");
6071 }
6072
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006073 if (Args.hasArg(options::OPT_shared)) {
6074 CmdArgs.push_back("-lgcc_pic");
6075 } else {
6076 CmdArgs.push_back("-lgcc");
6077 }
6078
6079
6080 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006081 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006082
6083 if (!Args.hasArg(options::OPT_nolibc)) {
6084 CmdArgs.push_back("-lc");
6085 }
6086
6087 if (Args.hasArg(options::OPT_shared)) {
6088 CmdArgs.push_back("-lgcc_pic");
6089 } else {
6090 CmdArgs.push_back("-lgcc");
6091 }
6092 }
6093
6094 if (!Args.hasArg(options::OPT_nostdlib) &&
6095 !Args.hasArg(options::OPT_nostartfiles)) {
6096 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006097 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006098 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006099 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006100 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006101 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006102 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006103 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006104 }
6105
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006106 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006107
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006108 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006109 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006111}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006112
6113void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6114 const InputInfo &Output,
6115 const InputInfoList &Inputs,
6116 const ArgList &Args,
6117 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006118 ArgStringList CmdArgs;
6119
6120 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006121 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6122 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006123 } else {
6124 assert(Output.isNothing() && "Invalid output.");
6125 }
6126
6127 if (!Args.hasArg(options::OPT_nostdlib) &&
6128 !Args.hasArg(options::OPT_nostartfiles)) {
6129 CmdArgs.push_back("-defaultlib:libcmt");
6130 }
6131
6132 CmdArgs.push_back("-nologo");
6133
Michael J. Spencera2284f52012-06-18 16:56:04 +00006134 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6135
6136 // Add filenames immediately.
6137 for (InputInfoList::const_iterator
6138 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6139 if (it->isFilename())
6140 CmdArgs.push_back(it->getFilename());
6141 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006142
6143 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006144 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006145 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6146}