blob: d85bc4adbdb0c89970e6cbcf240b067135e3473d [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);
Chad Rosier89aa2ce2012-10-30 21:42:09 +000096 bool CombinedArg = false;
97
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000098 if (!DirList)
99 return; // Nothing to do.
100
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000101 StringRef Name(ArgName);
102 if (Name.equals("-I") || Name.equals("-L"))
103 CombinedArg = true;
104
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000105 StringRef Dirs(DirList);
106 if (Dirs.empty()) // Empty string should not add '.'.
107 return;
108
109 StringRef::size_type Delim;
110 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
111 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000112 if (CombinedArg) {
113 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
114 } else {
115 CmdArgs.push_back(ArgName);
116 CmdArgs.push_back(".");
117 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000118 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000119 if (CombinedArg) {
120 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
121 } else {
122 CmdArgs.push_back(ArgName);
123 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
124 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000125 }
Nico Weber09c5c392012-03-19 15:00:03 +0000126 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000127 }
128
129 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000130 if (CombinedArg) {
131 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
132 } else {
133 CmdArgs.push_back(ArgName);
134 CmdArgs.push_back(".");
135 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000136 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000137 if (CombinedArg) {
138 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
139 } else {
140 CmdArgs.push_back(ArgName);
141 CmdArgs.push_back(Args.MakeArgString(Dirs));
142 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000143 }
144}
145
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000146static void AddLinkerInputs(const ToolChain &TC,
147 const InputInfoList &Inputs, const ArgList &Args,
148 ArgStringList &CmdArgs) {
149 const Driver &D = TC.getDriver();
150
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000151 // Add extra linker input arguments which are not treated as inputs
152 // (constructed via -Xarch_).
153 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
154
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000155 for (InputInfoList::const_iterator
156 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
157 const InputInfo &II = *it;
158
159 if (!TC.HasNativeLLVMSupport()) {
160 // Don't try to pass LLVM inputs unless we have native support.
161 if (II.getType() == types::TY_LLVM_IR ||
162 II.getType() == types::TY_LTO_IR ||
163 II.getType() == types::TY_LLVM_BC ||
164 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000165 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000166 << TC.getTripleString();
167 }
168
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000169 // Add filenames immediately.
170 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000171 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000172 continue;
173 }
174
175 // Otherwise, this is a linker input argument.
176 const Arg &A = II.getInputArg();
177
178 // Handle reserved library options.
179 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000180 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Sen7433fed2010-09-17 18:39:08 +0000181 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
182 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000183 } else
184 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000185 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000186
187 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendling3d717152012-03-12 22:10:06 +0000188 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000189}
190
John McCallf85e1932011-06-15 23:02:42 +0000191/// \brief Determine whether Objective-C automated reference counting is
192/// enabled.
193static bool isObjCAutoRefCount(const ArgList &Args) {
194 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
195}
196
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000197/// \brief Determine whether we are linking the ObjC runtime.
198static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000199 if (isObjCAutoRefCount(Args)) {
200 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000201 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000202 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000203 return Args.hasArg(options::OPT_fobjc_link_runtime);
204}
205
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000206static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000207 ArgStringList &CmdArgs,
208 llvm::Triple Triple) {
209 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
210 Args.hasArg(options::OPT_fprofile_generate) ||
211 Args.hasArg(options::OPT_fcreate_profile) ||
212 Args.hasArg(options::OPT_coverage)))
213 return;
214
215 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
216 // the link line. We cannot do the same thing because unlike gcov there is a
217 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
218 // not supported by old linkers.
Benjamin Kramerf2db04c2011-11-07 16:02:25 +0000219 std::string ProfileRT =
220 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000221
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000222 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000223}
224
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000225static bool forwardToGCC(const Option &O) {
226 return !O.hasFlag(options::NoForward) &&
227 !O.hasFlag(options::DriverOption) &&
228 !O.hasFlag(options::LinkerInput);
229}
230
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000231void Clang::AddPreprocessingOptions(Compilation &C,
232 const Driver &D,
Douglas Gregordf91ef32009-04-18 00:34:01 +0000233 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000234 ArgStringList &CmdArgs,
235 const InputInfo &Output,
236 const InputInfoList &Inputs) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000237 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000238
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000239 CheckPreprocessingOptions(D, Args);
240
241 Args.AddLastArg(CmdArgs, options::OPT_C);
242 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000243
244 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000245 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000246 (A = Args.getLastArg(options::OPT_MD)) ||
247 (A = Args.getLastArg(options::OPT_MMD))) {
248 // Determine the output location.
249 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000250 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000251 DepFile = MF->getValue();
Peter Collingbourne5d4d9802011-11-21 00:01:05 +0000252 C.addFailureResultFile(DepFile);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000253 } else if (Output.getType() == types::TY_Dependencies) {
254 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000255 } else if (A->getOption().matches(options::OPT_M) ||
256 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000257 DepFile = "-";
258 } else {
259 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne5d4d9802011-11-21 00:01:05 +0000260 C.addFailureResultFile(DepFile);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000261 }
262 CmdArgs.push_back("-dependency-file");
263 CmdArgs.push_back(DepFile);
264
Chris Lattner3edbeb72010-03-29 17:55:58 +0000265 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000266 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
267 const char *DepTarget;
268
269 // If user provided -o, that is the dependency target, except
270 // when we are only generating a dependency file.
271 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
272 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000273 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000274 } else {
275 // Otherwise derive from the base input.
276 //
277 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000278 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000279 llvm::sys::path::replace_extension(P, "o");
280 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000281 }
282
283 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000285 QuoteTarget(DepTarget, Quoted);
286 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000287 }
288
Daniel Dunbarb827a052009-11-19 03:26:40 +0000289 if (A->getOption().matches(options::OPT_M) ||
290 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000291 CmdArgs.push_back("-sys-header-deps");
292 }
293
Peter Collingbournebb527862011-07-12 19:35:15 +0000294 if (Args.hasArg(options::OPT_MG)) {
295 if (!A || A->getOption().matches(options::OPT_MD) ||
296 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000297 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000298 CmdArgs.push_back("-MG");
299 }
300
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000301 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000302
303 // Convert all -MQ <target> args to -MT <quoted target>
304 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
305 options::OPT_MQ),
306 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000307 const Arg *A = *it;
308 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000309
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000310 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000311 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000312 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000313 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000314 CmdArgs.push_back(Args.MakeArgString(Quoted));
315
316 // -MT flag - no change
317 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000318 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000319 }
320 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000321
Douglas Gregordf91ef32009-04-18 00:34:01 +0000322 // Add -i* options, and automatically translate to
323 // -include-pch/-include-pth for transparent PCH support. It's
324 // wonky, but we include looking for .gch so we can support seamless
325 // replacement into a build system already set up to be generating
326 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000327 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000328 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
329 ie = Args.filtered_end(); it != ie; ++it) {
330 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000331
332 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000333 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
334 RenderedImplicitInclude = true;
335
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000336 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000337 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000338
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000339 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000340 bool FoundPCH = false;
Richard Smith1d489cf2012-11-01 04:30:05 +0000341 llvm::sys::Path P(A->getValue());
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000342 bool Exists;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000343 if (UsePCH) {
Douglas Gregordf91ef32009-04-18 00:34:01 +0000344 P.appendSuffix("pch");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000345 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregordf91ef32009-04-18 00:34:01 +0000346 FoundPCH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000347 else
Douglas Gregordf91ef32009-04-18 00:34:01 +0000348 P.eraseSuffix();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000349 }
350
Douglas Gregordf91ef32009-04-18 00:34:01 +0000351 if (!FoundPCH) {
352 P.appendSuffix("pth");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000353 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregordf91ef32009-04-18 00:34:01 +0000354 FoundPTH = true;
355 else
356 P.eraseSuffix();
Mike Stump1eb44332009-09-09 15:08:12 +0000357 }
358
Douglas Gregordf91ef32009-04-18 00:34:01 +0000359 if (!FoundPCH && !FoundPTH) {
360 P.appendSuffix("gch");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000361 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000362 FoundPCH = UsePCH;
363 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000364 }
Mike Stump1eb44332009-09-09 15:08:12 +0000365 else
Douglas Gregordf91ef32009-04-18 00:34:01 +0000366 P.eraseSuffix();
367 }
368
369 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000370 if (IsFirstImplicitInclude) {
371 A->claim();
372 if (UsePCH)
373 CmdArgs.push_back("-include-pch");
374 else
375 CmdArgs.push_back("-include-pth");
376 CmdArgs.push_back(Args.MakeArgString(P.str()));
377 continue;
378 } else {
379 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000380 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000381 << P.str() << A->getAsString(Args);
382 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000383 }
384 }
385
386 // Not translated, render as usual.
387 A->claim();
388 A->render(Args, CmdArgs);
389 }
390
391 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000392 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
393 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000394
395 // Add -Wp, and -Xassembler if using the preprocessor.
396
397 // FIXME: There is a very unfortunate problem here, some troubled
398 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
399 // really support that we would have to parse and then translate
400 // those options. :(
401 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
402 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000403
404 // -I- is a deprecated GCC feature, reject it.
405 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000406 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000407
408 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
409 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000410 StringRef sysroot = C.getSysRoot();
411 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000412 if (!Args.hasArg(options::OPT_isysroot)) {
413 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000414 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000415 }
416 }
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000417
418 // If a module path was provided, pass it along. Otherwise, use a temporary
419 // directory.
420 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000421 A->claim();
422 A->render(Args, CmdArgs);
423 } else {
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000424 SmallString<128> DefaultModuleCache;
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000425 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
426 DefaultModuleCache);
427 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
428 CmdArgs.push_back("-fmodule-cache-path");
429 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
430 }
Douglas Gregorfba18aa2011-09-15 22:00:41 +0000431
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000432 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000433 // FIXME: We should probably sink the logic for handling these from the
434 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000435 // CPATH - included following the user specified includes (but prior to
436 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000438 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000440 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000442 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000443 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000444 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000445 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000446
Chandler Carruth88491fc2011-11-04 07:12:53 +0000447 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000448 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000449 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000450
451 // Add system include arguments.
452 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000453}
454
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000455/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000456/// CPU.
457//
458// FIXME: This is redundant with -mcpu, why does LLVM use this.
459// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000460static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000461 return llvm::StringSwitch<const char *>(CPU)
462 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
463 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
464 .Cases("arm920", "arm920t", "arm922t", "v4t")
465 .Cases("arm940t", "ep9312","v4t")
466 .Cases("arm10tdmi", "arm1020t", "v5")
467 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
468 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
469 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
470 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
471 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
472 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Silviu Baranga2df67ea2012-09-13 15:06:00 +0000473 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "v7")
Bob Wilson57f6d192012-03-21 17:19:12 +0000474 .Case("cortex-m3", "v7m")
Jim Grosbach69033132012-03-29 19:53:34 +0000475 .Case("cortex-m4", "v7m")
Bob Wilson57f6d192012-03-21 17:19:12 +0000476 .Case("cortex-m0", "v6m")
Bob Wilson336bfa32012-09-29 23:52:50 +0000477 .Case("cortex-a9-mp", "v7f")
478 .Case("swift", "v7s")
Chad Rosierae1aee62011-10-07 17:48:56 +0000479 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000480}
481
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000482/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
483//
484// FIXME: tblgen this.
485static std::string getARMTargetCPU(const ArgList &Args,
486 const llvm::Triple &Triple) {
487 // FIXME: Warn on inconsistent use of -mcpu and -march.
488
489 // If we have -mcpu=, use that.
490 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000491 StringRef MCPU = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000492 // Handle -mcpu=native.
493 if (MCPU == "native")
494 return llvm::sys::getHostCPUName();
495 else
496 return MCPU;
497 }
498
499 StringRef MArch;
500 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
501 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smith1d489cf2012-11-01 04:30:05 +0000502 MArch = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000503 } else {
504 // Otherwise, use the Arch from the triple.
505 MArch = Triple.getArchName();
506 }
507
508 // Handle -march=native.
509 std::string NativeMArch;
510 if (MArch == "native") {
511 std::string CPU = llvm::sys::getHostCPUName();
512 if (CPU != "generic") {
513 // Translate the native cpu into the architecture. The switch below will
514 // then chose the minimum cpu for that arch.
515 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
516 MArch = NativeMArch;
517 }
518 }
519
520 return llvm::StringSwitch<const char *>(MArch)
521 .Cases("armv2", "armv2a","arm2")
522 .Case("armv3", "arm6")
523 .Case("armv3m", "arm7m")
524 .Cases("armv4", "armv4t", "arm7tdmi")
525 .Cases("armv5", "armv5t", "arm10tdmi")
526 .Cases("armv5e", "armv5te", "arm1022e")
527 .Case("armv5tej", "arm926ej-s")
528 .Cases("armv6", "armv6k", "arm1136jf-s")
529 .Case("armv6j", "arm1136j-s")
530 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
531 .Case("armv6t2", "arm1156t2-s")
532 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson336bfa32012-09-29 23:52:50 +0000533 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
534 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000535 .Cases("armv7r", "armv7-r", "cortex-r4")
536 .Cases("armv7m", "armv7-m", "cortex-m3")
537 .Case("ep9312", "ep9312")
538 .Case("iwmmxt", "iwmmxt")
539 .Case("xscale", "xscale")
540 .Cases("armv6m", "armv6-m", "cortex-m0")
541 // If all else failed, return the most base CPU LLVM supports.
542 .Default("arm7tdmi");
543}
544
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000545// FIXME: Move to target hook.
546static bool isSignedCharDefault(const llvm::Triple &Triple) {
547 switch (Triple.getArch()) {
548 default:
549 return true;
550
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000551 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000552 case llvm::Triple::ppc:
553 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000554 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000555 return true;
556 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000557 }
558}
559
Chad Rosier99317272012-04-04 20:51:35 +0000560// Handle -mfpu=.
561//
562// FIXME: Centralize feature selection, defaulting shouldn't be also in the
563// frontend target.
564static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
565 ArgStringList &CmdArgs) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000566 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000567
568 // Set the target features based on the FPU.
569 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
570 // Disable any default FPU support.
571 CmdArgs.push_back("-target-feature");
572 CmdArgs.push_back("-vfp2");
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("-vfp3");
575 CmdArgs.push_back("-target-feature");
576 CmdArgs.push_back("-neon");
577 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("+vfp3");
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+d16");
582 CmdArgs.push_back("-target-feature");
583 CmdArgs.push_back("-neon");
584 } else if (FPU == "vfp") {
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("+vfp2");
587 CmdArgs.push_back("-target-feature");
588 CmdArgs.push_back("-neon");
589 } else if (FPU == "vfp3" || FPU == "vfpv3") {
590 CmdArgs.push_back("-target-feature");
591 CmdArgs.push_back("+vfp3");
592 CmdArgs.push_back("-target-feature");
593 CmdArgs.push_back("-neon");
594 } else if (FPU == "neon") {
595 CmdArgs.push_back("-target-feature");
596 CmdArgs.push_back("+neon");
597 } else
598 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
599}
600
Chad Rosier7a938fa2012-04-04 20:39:32 +0000601// Handle -mfpmath=.
602static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000603 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000604 StringRef FPMath = A->getValue();
Chad Rosier7a938fa2012-04-04 20:39:32 +0000605
606 // Set the target features based on the FPMath.
607 if (FPMath == "neon") {
608 CmdArgs.push_back("-target-feature");
609 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000610
Silviu Baranga2df67ea2012-09-13 15:06:00 +0000611 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
612 CPU != "cortex-a15")
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000613 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
614
Chad Rosier7a938fa2012-04-04 20:39:32 +0000615 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
616 FPMath == "vfp4") {
617 CmdArgs.push_back("-target-feature");
618 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000619
620 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000621 } else
622 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
623}
624
Anton Korobeynikove2571792012-04-09 13:38:30 +0000625// Select the float ABI as determined by -msoft-float, -mhard-float, and
626// -mfloat-abi=.
627static StringRef getARMFloatABI(const Driver &D,
628 const ArgList &Args,
629 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000630 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000631 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
632 options::OPT_mhard_float,
633 options::OPT_mfloat_abi_EQ)) {
634 if (A->getOption().matches(options::OPT_msoft_float))
635 FloatABI = "soft";
636 else if (A->getOption().matches(options::OPT_mhard_float))
637 FloatABI = "hard";
638 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000639 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000640 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000641 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000642 << A->getAsString(Args);
643 FloatABI = "soft";
644 }
645 }
646 }
647
648 // If unspecified, choose the default based on the platform.
649 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000650 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000651 case llvm::Triple::Darwin:
652 case llvm::Triple::MacOSX:
653 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000654 // Darwin defaults to "softfp" for v6 and v7.
655 //
656 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000657 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000658 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000659 if (StringRef(ArchName).startswith("v6") ||
660 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000661 FloatABI = "softfp";
662 else
663 FloatABI = "soft";
664 break;
665 }
666
667 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000668 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000669 case llvm::Triple::GNUEABIHF:
670 FloatABI = "hard";
671 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000672 case llvm::Triple::GNUEABI:
673 FloatABI = "softfp";
674 break;
675 case llvm::Triple::EABI:
676 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
677 FloatABI = "softfp";
678 break;
Logan Chien94a71422012-09-02 09:30:11 +0000679 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000680 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000681 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000682 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000683 FloatABI = "softfp";
684 else
685 FloatABI = "soft";
686 break;
687 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000688 default:
689 // Assume "soft", but warn the user we are guessing.
690 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000691 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000692 break;
693 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000694 }
695 }
696
Anton Korobeynikove2571792012-04-09 13:38:30 +0000697 return FloatABI;
698}
699
700
701void Clang::AddARMTargetArgs(const ArgList &Args,
702 ArgStringList &CmdArgs,
703 bool KernelOrKext) const {
704 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000705 // Get the effective triple, which takes into account the deployment target.
706 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
707 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000708 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000709
710 // Select the ABI to use.
711 //
712 // FIXME: Support -meabi.
713 const char *ABIName = 0;
714 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000715 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000716 } else if (Triple.isOSDarwin()) {
717 // The backend is hardwired to assume AAPCS for M-class processors, ensure
718 // the frontend matches that.
719 if (StringRef(CPUName).startswith("cortex-m")) {
720 ABIName = "aapcs";
721 } else {
722 ABIName = "apcs-gnu";
723 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000724 } else {
725 // Select the default based on the platform.
726 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000727 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000728 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000729 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000730 ABIName = "aapcs-linux";
731 break;
732 case llvm::Triple::EABI:
733 ABIName = "aapcs";
734 break;
735 default:
736 ABIName = "apcs-gnu";
737 }
738 }
739 CmdArgs.push_back("-target-abi");
740 CmdArgs.push_back(ABIName);
741
742 // Set the CPU based on -march= and -mcpu=.
743 CmdArgs.push_back("-target-cpu");
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000744 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikove2571792012-04-09 13:38:30 +0000745
746 // Determine floating point ABI from the options & target defaults.
747 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000748 if (FloatABI == "soft") {
749 // Floating point operations and argument passing are soft.
750 //
751 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000752 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000753 CmdArgs.push_back("-mfloat-abi");
754 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000755 } else if (FloatABI == "softfp") {
756 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000757 CmdArgs.push_back("-mfloat-abi");
758 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000759 } else {
760 // Floating point operations and argument passing are hard.
761 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000762 CmdArgs.push_back("-mfloat-abi");
763 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000764 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000765
766 // Set appropriate target features for floating point mode.
767 //
768 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
769 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
770 // stripped out by the ARM target.
771
772 // Use software floating point operations?
773 if (FloatABI == "soft") {
774 CmdArgs.push_back("-target-feature");
775 CmdArgs.push_back("+soft-float");
776 }
777
778 // Use software floating point argument passing?
779 if (FloatABI != "hard") {
780 CmdArgs.push_back("-target-feature");
781 CmdArgs.push_back("+soft-float-abi");
782 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000783
784 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000785 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000786 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000787
Chad Rosier7a938fa2012-04-04 20:39:32 +0000788 // Honor -mfpmath=.
789 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000790 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000791
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000792 // Setting -msoft-float effectively disables NEON because of the GCC
793 // implementation, although the same isn't true of VFP or VFP3.
794 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000795 CmdArgs.push_back("-target-feature");
796 CmdArgs.push_back("-neon");
797 }
798
799 // Kernel code has more strict alignment requirements.
800 if (KernelOrKext) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000801 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
802 CmdArgs.push_back("-backend-option");
803 CmdArgs.push_back("-arm-long-calls");
804 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000805
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000806 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000807 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000808
809 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000810 CmdArgs.push_back("-backend-option");
811 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000812 }
Chad Rosier1b906052011-08-26 00:26:29 +0000813
814 // Setting -mno-global-merge disables the codegen global merge pass. Setting
815 // -mglobal-merge has no effect as the pass is enabled by default.
816 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
817 options::OPT_mno_global_merge)) {
818 if (A->getOption().matches(options::OPT_mno_global_merge))
819 CmdArgs.push_back("-mno-global-merge");
820 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000821
Chad Rosier005af272012-05-16 21:19:55 +0000822 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000823 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000824}
825
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000826// Translate MIPS CPU name alias option to CPU name.
827static StringRef getMipsCPUFromAlias(const Arg &A) {
828 if (A.getOption().matches(options::OPT_mips32))
829 return "mips32";
830 if (A.getOption().matches(options::OPT_mips32r2))
831 return "mips32r2";
832 if (A.getOption().matches(options::OPT_mips64))
833 return "mips64";
834 if (A.getOption().matches(options::OPT_mips64r2))
835 return "mips64r2";
836 llvm_unreachable("Unexpected option");
837 return "";
838}
839
Simon Atanasyana2768be2012-04-07 22:09:23 +0000840// Get CPU and ABI names. They are not independent
841// so we have to calculate them together.
842static void getMipsCPUAndABI(const ArgList &Args,
843 const ToolChain &TC,
844 StringRef &CPUName,
845 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000846 const char *DefMips32CPU = "mips32";
847 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000848
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000849 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000850 options::OPT_mcpu_EQ,
851 options::OPT_mips_CPUs_Group)) {
852 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
853 CPUName = getMipsCPUFromAlias(*A);
854 else
Richard Smith1d489cf2012-11-01 04:30:05 +0000855 CPUName = A->getValue();
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000856 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000857
Akira Hatanaka9f360622011-09-26 21:07:52 +0000858 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +0000859 ABIName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000860
861 // Setup default CPU and ABI names.
862 if (CPUName.empty() && ABIName.empty()) {
863 switch (TC.getTriple().getArch()) {
864 default:
865 llvm_unreachable("Unexpected triple arch name");
866 case llvm::Triple::mips:
867 case llvm::Triple::mipsel:
868 CPUName = DefMips32CPU;
869 break;
870 case llvm::Triple::mips64:
871 case llvm::Triple::mips64el:
872 CPUName = DefMips64CPU;
873 break;
874 }
875 }
876
877 if (!ABIName.empty()) {
878 // Deduce CPU name from ABI name.
879 CPUName = llvm::StringSwitch<const char *>(ABIName)
880 .Cases("o32", "eabi", DefMips32CPU)
881 .Cases("n32", "n64", DefMips64CPU)
882 .Default("");
883 }
884 else if (!CPUName.empty()) {
885 // Deduce ABI name from CPU name.
886 ABIName = llvm::StringSwitch<const char *>(CPUName)
887 .Cases("mips32", "mips32r2", "o32")
888 .Cases("mips64", "mips64r2", "n64")
889 .Default("");
890 }
891
892 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000893}
894
Simon Atanasyan5e627792012-06-02 15:06:29 +0000895// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
896// and -mfloat-abi=.
897static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000898 // Select the float ABI as determined by -msoft-float, -mhard-float,
899 // and -mfloat-abi=.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000900 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000901 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000902 options::OPT_mhard_float,
903 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000904 if (A->getOption().matches(options::OPT_msoft_float))
905 FloatABI = "soft";
906 else if (A->getOption().matches(options::OPT_mhard_float))
907 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000908 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000909 FloatABI = A->getValue();
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000910 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000911 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000912 FloatABI = "hard";
913 }
914 }
Eric Christophered734732010-03-02 02:41:08 +0000915 }
916
917 // If unspecified, choose the default based on the platform.
918 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000919 // Assume "hard", because it's a default value used by gcc.
920 // When we start to recognize specific target MIPS processors,
921 // we will be able to select the default more correctly.
922 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000923 }
924
Simon Atanasyan5e627792012-06-02 15:06:29 +0000925 return FloatABI;
926}
927
Simon Atanasyandc536f52012-07-05 18:51:43 +0000928static void AddTargetFeature(const ArgList &Args,
929 ArgStringList &CmdArgs,
930 OptSpecifier OnOpt,
931 OptSpecifier OffOpt,
932 StringRef FeatureName) {
933 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
934 CmdArgs.push_back("-target-feature");
935 if (A->getOption().matches(OnOpt))
936 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
937 else
938 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
939 }
940}
941
Simon Atanasyan5e627792012-06-02 15:06:29 +0000942void Clang::AddMIPSTargetArgs(const ArgList &Args,
943 ArgStringList &CmdArgs) const {
944 const Driver &D = getToolChain().getDriver();
945 StringRef CPUName;
946 StringRef ABIName;
947 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
948
949 CmdArgs.push_back("-target-cpu");
950 CmdArgs.push_back(CPUName.data());
951
952 CmdArgs.push_back("-target-abi");
953 CmdArgs.push_back(ABIName.data());
954
955 StringRef FloatABI = getMipsFloatABI(D, Args);
956
Eric Christophered734732010-03-02 02:41:08 +0000957 if (FloatABI == "soft") {
958 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000959 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000960 CmdArgs.push_back("-mfloat-abi");
961 CmdArgs.push_back("soft");
962
963 // FIXME: Note, this is a hack. We need to pass the selected float
964 // mode to the MipsTargetInfoBase to define appropriate macros there.
965 // Now it is the only method.
966 CmdArgs.push_back("-target-feature");
967 CmdArgs.push_back("+soft-float");
968 }
969 else if (FloatABI == "single") {
970 // Restrict the use of hardware floating-point
971 // instructions to 32-bit operations.
972 CmdArgs.push_back("-target-feature");
973 CmdArgs.push_back("+single-float");
974 }
975 else {
976 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +0000977 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000978 CmdArgs.push_back("-mfloat-abi");
979 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +0000980 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +0000981
Simon Atanasyandc536f52012-07-05 18:51:43 +0000982 AddTargetFeature(Args, CmdArgs,
983 options::OPT_mips16, options::OPT_mno_mips16,
984 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +0000985 AddTargetFeature(Args, CmdArgs,
986 options::OPT_mdsp, options::OPT_mno_dsp,
987 "dsp");
988 AddTargetFeature(Args, CmdArgs,
989 options::OPT_mdspr2, options::OPT_mno_dspr2,
990 "dspr2");
Simon Atanasyan9804b762012-08-27 20:55:56 +0000991
992 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000993 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +0000994 CmdArgs.push_back("-mllvm");
995 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
996 A->claim();
997 }
Eric Christophered734732010-03-02 02:41:08 +0000998}
999
Hal Finkel02a84272012-06-11 22:35:19 +00001000/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1001static std::string getPPCTargetCPU(const ArgList &Args) {
1002 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001003 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001004
1005 if (CPUName == "native") {
1006 std::string CPU = llvm::sys::getHostCPUName();
1007 if (!CPU.empty() && CPU != "generic")
1008 return CPU;
1009 else
1010 return "";
1011 }
1012
1013 return llvm::StringSwitch<const char *>(CPUName)
1014 .Case("common", "generic")
1015 .Case("440", "440")
1016 .Case("440fp", "440")
1017 .Case("450", "450")
1018 .Case("601", "601")
1019 .Case("602", "602")
1020 .Case("603", "603")
1021 .Case("603e", "603e")
1022 .Case("603ev", "603ev")
1023 .Case("604", "604")
1024 .Case("604e", "604e")
1025 .Case("620", "620")
1026 .Case("G3", "g3")
1027 .Case("7400", "7400")
1028 .Case("G4", "g4")
1029 .Case("7450", "7450")
1030 .Case("G4+", "g4+")
1031 .Case("750", "750")
1032 .Case("970", "970")
1033 .Case("G5", "g5")
1034 .Case("a2", "a2")
Hal Finkel7de32962012-09-18 22:25:03 +00001035 .Case("e500mc", "e500mc")
1036 .Case("e5500", "e5500")
Hal Finkel02a84272012-06-11 22:35:19 +00001037 .Case("power6", "pwr6")
1038 .Case("power7", "pwr7")
1039 .Case("powerpc", "ppc")
1040 .Case("powerpc64", "ppc64")
1041 .Default("");
1042 }
1043
1044 return "";
1045}
1046
1047void Clang::AddPPCTargetArgs(const ArgList &Args,
1048 ArgStringList &CmdArgs) const {
1049 std::string TargetCPUName = getPPCTargetCPU(Args);
1050
1051 // LLVM may default to generating code for the native CPU,
1052 // but, like gcc, we default to a more generic option for
1053 // each architecture. (except on Darwin)
1054 llvm::Triple Triple = getToolChain().getTriple();
1055 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1056 if (Triple.getArch() == llvm::Triple::ppc64)
1057 TargetCPUName = "ppc64";
1058 else
1059 TargetCPUName = "ppc";
1060 }
1061
1062 if (!TargetCPUName.empty()) {
1063 CmdArgs.push_back("-target-cpu");
1064 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1065 }
1066}
1067
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001068void Clang::AddSparcTargetArgs(const ArgList &Args,
1069 ArgStringList &CmdArgs) const {
1070 const Driver &D = getToolChain().getDriver();
1071
1072 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001073 CmdArgs.push_back("-target-cpu");
Richard Smith1d489cf2012-11-01 04:30:05 +00001074 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001075 }
1076
1077 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001078 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001079 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1080 options::OPT_mhard_float)) {
1081 if (A->getOption().matches(options::OPT_msoft_float))
1082 FloatABI = "soft";
1083 else if (A->getOption().matches(options::OPT_mhard_float))
1084 FloatABI = "hard";
1085 }
1086
1087 // If unspecified, choose the default based on the platform.
1088 if (FloatABI.empty()) {
1089 switch (getToolChain().getTriple().getOS()) {
1090 default:
1091 // Assume "soft", but warn the user we are guessing.
1092 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +00001093 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001094 break;
1095 }
1096 }
1097
1098 if (FloatABI == "soft") {
1099 // Floating point operations and argument passing are soft.
1100 //
1101 // FIXME: This changes CPP defines, we need -target-soft-float.
1102 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001103 CmdArgs.push_back("-target-feature");
1104 CmdArgs.push_back("+soft-float");
1105 } else {
1106 assert(FloatABI == "hard" && "Invalid float abi!");
1107 CmdArgs.push_back("-mhard-float");
1108 }
1109}
1110
Daniel Dunbar6acda162009-09-09 22:33:08 +00001111void Clang::AddX86TargetArgs(const ArgList &Args,
1112 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001113 if (!Args.hasFlag(options::OPT_mred_zone,
1114 options::OPT_mno_red_zone,
1115 true) ||
1116 Args.hasArg(options::OPT_mkernel) ||
1117 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001118 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001119
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001120 if (Args.hasFlag(options::OPT_msoft_float,
1121 options::OPT_mno_soft_float,
1122 false))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001123 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001124
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001125 const char *CPUName = 0;
Daniel Dunbar6acda162009-09-09 22:33:08 +00001126 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001127 if (StringRef(A->getValue()) == "native") {
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001128 // FIXME: Reject attempts to use -march=native unless the target matches
1129 // the host.
1130 //
1131 // FIXME: We should also incorporate the detected target features for use
1132 // with -native.
1133 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone0cc3092012-05-09 17:53:10 +00001134 if (!CPU.empty() && CPU != "generic")
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001135 CPUName = Args.MakeArgString(CPU);
1136 } else
Richard Smith1d489cf2012-11-01 04:30:05 +00001137 CPUName = A->getValue();
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001138 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001139
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001140 // Select the default CPU if none was given (or detection failed).
1141 if (!CPUName) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00001142 // FIXME: Need target hooks.
Bob Wilson905c45f2011-10-14 05:03:44 +00001143 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001144 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001145 CPUName = "core2";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001146 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001147 CPUName = "yonah";
Chris Lattner86ed3a32010-04-11 19:29:39 +00001148 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001149 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001150 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001151 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattner86ed3a32010-04-11 19:29:39 +00001152 CPUName = "i586";
Daniel Dunbar95c04572010-08-01 23:13:54 +00001153 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001154 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001155 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001156 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar95c04572010-08-01 23:13:54 +00001157 CPUName = "i486";
Eli Friedman42f74f22012-08-08 23:57:20 +00001158 } else if (getToolChain().getOS().startswith("bitrig")) {
1159 if (getToolChain().getArch() == llvm::Triple::x86_64)
1160 CPUName = "x86-64";
1161 else if (getToolChain().getArch() == llvm::Triple::x86)
1162 CPUName = "i686";
Roman Divacky451f8ca2011-03-01 18:11:37 +00001163 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001164 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001165 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001166 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky451f8ca2011-03-01 18:11:37 +00001167 CPUName = "i486";
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001168 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001169 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001170 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001171 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001172 CPUName = "i486";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001173 } else {
Daniel Dunbar951733d2011-05-31 15:58:55 +00001174 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001175 CPUName = "x86-64";
Daniel Dunbar951733d2011-05-31 15:58:55 +00001176 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001177 CPUName = "pentium4";
Daniel Dunbar6acda162009-09-09 22:33:08 +00001178 }
1179 }
1180
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001181 if (CPUName) {
Daniel Dunbar38b48af2009-12-18 06:30:12 +00001182 CmdArgs.push_back("-target-cpu");
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001183 CmdArgs.push_back(CPUName);
1184 }
1185
Eli Friedmand18eeca2011-07-02 00:34:19 +00001186 // The required algorithm here is slightly strange: the options are applied
1187 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1188 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1189 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1190 // former correctly, but not the latter; handle directly-overridden
1191 // attributes here.
1192 llvm::StringMap<unsigned> PrevFeature;
1193 std::vector<const char*> Features;
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001194 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1195 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001196 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001197 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001198
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001199 // Skip over "-m".
Michael J. Spencerc6357102012-10-22 22:13:48 +00001200 assert(Name.startswith("m") && "Invalid feature name.");
1201 Name = Name.substr(1);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001202
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001203 bool IsNegative = Name.startswith("no-");
1204 if (IsNegative)
1205 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001206
Eli Friedmand18eeca2011-07-02 00:34:19 +00001207 unsigned& Prev = PrevFeature[Name];
1208 if (Prev)
1209 Features[Prev - 1] = 0;
1210 Prev = Features.size() + 1;
1211 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1212 }
1213 for (unsigned i = 0; i < Features.size(); i++) {
1214 if (Features[i]) {
1215 CmdArgs.push_back("-target-feature");
1216 CmdArgs.push_back(Features[i]);
1217 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001218 }
1219}
1220
Tony Linthicum96319392011-12-12 21:14:55 +00001221static Arg* getLastHexagonArchArg (const ArgList &Args)
1222{
1223 Arg * A = NULL;
1224
Sebastian Pop43115d42012-01-13 20:37:10 +00001225 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1226 it != ie; ++it) {
1227 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum96319392011-12-12 21:14:55 +00001228 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1229 A = *it;
1230 A->claim();
1231 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001232 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
Richard Smith1d489cf2012-11-01 04:30:05 +00001233 StringRef Value = (*it)->getValue(0);
Sebastian Pop43115d42012-01-13 20:37:10 +00001234 if (Value.startswith("v")) {
1235 A = *it;
1236 A->claim();
1237 }
1238 }
Tony Linthicum96319392011-12-12 21:14:55 +00001239 }
1240 return A;
1241}
1242
Sebastian Pop43115d42012-01-13 20:37:10 +00001243static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum96319392011-12-12 21:14:55 +00001244{
1245 Arg *A;
1246 llvm::StringRef WhichHexagon;
1247
Sebastian Pop43115d42012-01-13 20:37:10 +00001248 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum96319392011-12-12 21:14:55 +00001249 if ((A = getLastHexagonArchArg (Args))) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001250 WhichHexagon = A->getValue();
Sebastian Pop43115d42012-01-13 20:37:10 +00001251 if (WhichHexagon == "")
1252 return "v4";
1253 else
1254 return WhichHexagon;
Tony Linthicum96319392011-12-12 21:14:55 +00001255 }
Sebastian Pop43115d42012-01-13 20:37:10 +00001256 else
1257 return "v4";
Tony Linthicum96319392011-12-12 21:14:55 +00001258}
1259
1260void Clang::AddHexagonTargetArgs(const ArgList &Args,
1261 ArgStringList &CmdArgs) const {
1262 llvm::Triple Triple = getToolChain().getTriple();
1263
1264 CmdArgs.push_back("-target-cpu");
Sebastian Pop43115d42012-01-13 20:37:10 +00001265 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00001266 CmdArgs.push_back("-fno-signed-char");
1267 CmdArgs.push_back("-nobuiltininc");
1268
Sirish Pande5f9688b2012-05-10 20:19:54 +00001269 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum96319392011-12-12 21:14:55 +00001270 CmdArgs.push_back("-mqdsp6-compat");
1271
1272 if (Arg *A = Args.getLastArg(options::OPT_G,
1273 options::OPT_msmall_data_threshold_EQ)) {
1274 std::string SmallDataThreshold="-small-data-threshold=";
Richard Smith1d489cf2012-11-01 04:30:05 +00001275 SmallDataThreshold += A->getValue();
Tony Linthicum96319392011-12-12 21:14:55 +00001276 CmdArgs.push_back ("-mllvm");
1277 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1278 A->claim();
1279 }
1280
Sirish Pande5f9688b2012-05-10 20:19:54 +00001281 if (!Args.hasArg(options::OPT_fno_short_enums))
1282 CmdArgs.push_back("-fshort-enums");
1283 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1284 CmdArgs.push_back ("-mllvm");
1285 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1286 }
Tony Linthicum96319392011-12-12 21:14:55 +00001287 CmdArgs.push_back ("-mllvm");
1288 CmdArgs.push_back ("-machine-sink-split=0");
1289}
1290
Eric Christopher88b7cf02011-08-19 00:30:14 +00001291static bool
John McCall260611a2012-06-20 06:18:46 +00001292shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001293 const llvm::Triple &Triple) {
1294 // We use the zero-cost exception tables for Objective-C if the non-fragile
1295 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1296 // later.
John McCall260611a2012-06-20 06:18:46 +00001297 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001298 return true;
1299
Bob Wilson905c45f2011-10-14 05:03:44 +00001300 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001301 return false;
1302
Eric Christopheraa7333c2011-07-02 00:20:22 +00001303 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001304 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001305 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001306}
1307
Anders Carlsson15348ae2011-02-28 02:27:16 +00001308/// addExceptionArgs - Adds exception related arguments to the driver command
1309/// arguments. There's a master flag, -fexceptions and also language specific
1310/// flags to enable/disable C++ and Objective-C exceptions.
1311/// This makes it possible to for example disable C++ exceptions but enable
1312/// Objective-C exceptions.
1313static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1314 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001315 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001316 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001317 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001318 if (KernelOrKext) {
1319 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1320 // arguments now to avoid warnings about unused arguments.
1321 Args.ClaimAllArgs(options::OPT_fexceptions);
1322 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1323 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1324 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1325 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1326 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001327 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001328 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001329
1330 // Exceptions are enabled by default.
1331 bool ExceptionsEnabled = true;
1332
1333 // This keeps track of whether exceptions were explicitly turned on or off.
1334 bool DidHaveExplicitExceptionFlag = false;
1335
Rafael Espindolaf759df02009-10-01 13:33:33 +00001336 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1337 options::OPT_fno_exceptions)) {
1338 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001339 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001340 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001341 ExceptionsEnabled = false;
1342
1343 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001344 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001345
Anders Carlsson15348ae2011-02-28 02:27:16 +00001346 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001347
Anders Carlsson15348ae2011-02-28 02:27:16 +00001348 // Exception tables and cleanups can be enabled with -fexceptions even if the
1349 // language itself doesn't support exceptions.
1350 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1351 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001352
Daniel Dunbard47ea692011-03-17 23:28:31 +00001353 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1354 // is not necessarily sensible, but follows GCC.
1355 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001356 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001357 options::OPT_fno_objc_exceptions,
1358 true)) {
1359 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001360
Eric Christopher88b7cf02011-08-19 00:30:14 +00001361 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001362 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001363 }
1364
1365 if (types::isCXX(InputType)) {
1366 bool CXXExceptionsEnabled = ExceptionsEnabled;
1367
Eric Christopher88b7cf02011-08-19 00:30:14 +00001368 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1369 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001370 options::OPT_fexceptions,
1371 options::OPT_fno_exceptions)) {
1372 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1373 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001374 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001375 CXXExceptionsEnabled = false;
1376 }
1377
1378 if (CXXExceptionsEnabled) {
1379 CmdArgs.push_back("-fcxx-exceptions");
1380
1381 ShouldUseExceptionTables = true;
1382 }
1383 }
1384
1385 if (ShouldUseExceptionTables)
1386 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001387}
1388
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001389static bool ShouldDisableCFI(const ArgList &Args,
1390 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001391 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001392 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001393 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001394 // we disable them if we think the .s file will be passed to it.
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001395 Default = Args.hasFlag(options::OPT_integrated_as,
1396 options::OPT_no_integrated_as,
1397 TC.IsIntegratedAssemblerDefault());
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001398 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001399 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1400 options::OPT_fno_dwarf2_cfi_asm,
1401 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001402}
1403
Nick Lewyckyea523d72011-10-17 23:05:52 +00001404static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1405 const ToolChain &TC) {
1406 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1407 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1408 options::OPT_no_integrated_as,
1409 IsIADefault);
1410 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1411 options::OPT_fno_dwarf_directory_asm,
1412 UseIntegratedAs);
1413 return !UseDwarfDirectory;
1414}
1415
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001416/// \brief Check whether the given input tree contains any compilation actions.
1417static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001418 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001419 return true;
1420
1421 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1422 if (ContainsCompileAction(*it))
1423 return true;
1424
1425 return false;
1426}
1427
1428/// \brief Check if -relax-all should be passed to the internal assembler.
1429/// This is done by default when compiling non-assembler source with -O0.
1430static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1431 bool RelaxDefault = true;
1432
1433 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1434 RelaxDefault = A->getOption().matches(options::OPT_O0);
1435
1436 if (RelaxDefault) {
1437 RelaxDefault = false;
1438 for (ActionList::const_iterator it = C.getActions().begin(),
1439 ie = C.getActions().end(); it != ie; ++it) {
1440 if (ContainsCompileAction(*it)) {
1441 RelaxDefault = true;
1442 break;
1443 }
1444 }
1445 }
1446
1447 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1448 RelaxDefault);
1449}
1450
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001451/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1452/// This needs to be called before we add the C run-time (malloc, etc).
1453static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001454 ArgStringList &CmdArgs) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001455 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001456 options::OPT_fno_address_sanitizer, false))
1457 return;
Logan Chien94a71422012-09-02 09:30:11 +00001458 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001459 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanov83738622012-06-04 11:15:05 +00001460 if (!Args.hasArg(options::OPT_pie))
1461 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001462 }
Daniel Dunbar8cd0d252011-12-07 23:22:17 +00001463
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001464 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1465 llvm::sys::path::append(LibAsan, "lib", "linux",
1466 (Twine("libclang_rt.asan-") +
1467 TC.getArchName() + "-android.so"));
1468 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001469 } else {
1470 if (!Args.hasArg(options::OPT_shared)) {
1471 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1472 // resource directory.
1473 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1474 llvm::sys::path::append(LibAsan, "lib", "linux",
1475 (Twine("libclang_rt.asan-") +
1476 TC.getArchName() + ".a"));
1477 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1478 CmdArgs.push_back("-lpthread");
1479 CmdArgs.push_back("-ldl");
1480 CmdArgs.push_back("-export-dynamic");
1481 }
1482 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001483}
1484
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001485/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1486/// This needs to be called before we add the C run-time (malloc, etc).
1487static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1488 ArgStringList &CmdArgs) {
1489 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1490 options::OPT_fno_thread_sanitizer, false))
1491 return;
1492 if (!Args.hasArg(options::OPT_shared)) {
1493 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1494 // resource directory.
1495 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1496 llvm::sys::path::append(LibTsan, "lib", "linux",
1497 (Twine("libclang_rt.tsan-") +
1498 TC.getArchName() + ".a"));
1499 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1500 CmdArgs.push_back("-lpthread");
1501 CmdArgs.push_back("-ldl");
1502 CmdArgs.push_back("-export-dynamic");
1503 }
1504}
1505
Richard Smith4def70d2012-10-09 19:52:38 +00001506/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1507/// (Linux).
1508static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1509 ArgStringList &CmdArgs) {
1510 if (!Args.hasArg(options::OPT_fcatch_undefined_behavior))
1511 return;
1512 if (!Args.hasArg(options::OPT_shared)) {
1513 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1514 // resource directory.
1515 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1516 llvm::sys::path::append(LibUbsan, "lib", "linux",
1517 (Twine("libclang_rt.ubsan-") +
1518 TC.getArchName() + ".a"));
1519 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
1520 }
1521}
1522
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001523static bool shouldUseFramePointer(const ArgList &Args,
1524 const llvm::Triple &Triple) {
1525 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1526 options::OPT_fomit_frame_pointer))
1527 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1528
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001529 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001530 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1531 Triple.getArch() == llvm::Triple::x86) &&
1532 Triple.getOS() == llvm::Triple::Linux) {
1533 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1534 if (!A->getOption().matches(options::OPT_O0))
1535 return false;
1536 }
1537
1538 return true;
1539}
1540
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001541void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001542 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001543 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001544 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001545 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001546 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1547 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001548 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001549 ArgStringList CmdArgs;
1550
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001551 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1552
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001553 // Invoke ourselves in -cc1 mode.
1554 //
1555 // FIXME: Implement custom jobs for internal actions.
1556 CmdArgs.push_back("-cc1");
1557
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001558 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001559 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001560 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001561 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001562
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001563 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001564 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001565
Daniel Dunbar1d460332009-03-18 10:01:51 +00001566 if (isa<AnalyzeJobAction>(JA)) {
1567 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1568 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001569 } else if (isa<MigrateJobAction>(JA)) {
1570 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001571 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001572 if (Output.getType() == types::TY_Dependencies)
1573 CmdArgs.push_back("-Eonly");
1574 else
1575 CmdArgs.push_back("-E");
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001576 } else if (isa<AssembleJobAction>(JA)) {
1577 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001578
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001579 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001580 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001581
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001582 // When using an integrated assembler, translate -Wa, and -Xassembler
1583 // options.
1584 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1585 options::OPT_Xassembler),
1586 ie = Args.filtered_end(); it != ie; ++it) {
1587 const Arg *A = *it;
1588 A->claim();
1589
1590 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001591 StringRef Value = A->getValue(i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001592
1593 if (Value == "-force_cpusubtype_ALL") {
1594 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001595 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001596 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001597 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001598 CmdArgs.push_back("-mllvm");
1599 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001600 } else if (Value == "--noexecstack") {
1601 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001602 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001603 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001604 << A->getOption().getName() << Value;
1605 }
1606 }
1607 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001608
1609 // Also ignore explicit -force_cpusubtype_ALL option.
1610 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001611 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001612 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001613 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001614
Aaron Ballman761322b2012-07-31 01:21:00 +00001615 if (JA.getType() == types::TY_Nothing)
1616 CmdArgs.push_back("-fsyntax-only");
1617 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001618 CmdArgs.push_back("-emit-pch");
1619 else
1620 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001621 } else {
1622 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001623
Daniel Dunbar1d460332009-03-18 10:01:51 +00001624 if (JA.getType() == types::TY_Nothing) {
1625 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001626 } else if (JA.getType() == types::TY_LLVM_IR ||
1627 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001628 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001629 } else if (JA.getType() == types::TY_LLVM_BC ||
1630 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001631 CmdArgs.push_back("-emit-llvm-bc");
1632 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001633 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001634 } else if (JA.getType() == types::TY_AST) {
1635 CmdArgs.push_back("-emit-pch");
Daniel Dunbar64952502010-02-11 03:16:21 +00001636 } else if (JA.getType() == types::TY_RewrittenObjC) {
1637 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001638 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001639 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1640 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001641 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001642 } else {
1643 assert(JA.getType() == types::TY_PP_Asm &&
1644 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001645 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001646 }
1647
Daniel Dunbar1d460332009-03-18 10:01:51 +00001648 // The make clang go fast button.
1649 CmdArgs.push_back("-disable-free");
1650
John McCallb689afb2010-02-13 03:50:24 +00001651 // Disable the verification pass in -asserts builds.
1652#ifdef NDEBUG
1653 CmdArgs.push_back("-disable-llvm-verifier");
1654#endif
1655
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001656 // Set the main file name, so that debug info works even with
1657 // -save-temps.
1658 CmdArgs.push_back("-main-file-name");
1659 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1660
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001661 // Some flags which affect the language (via preprocessor
1662 // defines). See darwin::CC1::AddCPPArgs.
1663 if (Args.hasArg(options::OPT_static))
1664 CmdArgs.push_back("-static-define");
1665
Daniel Dunbar1d460332009-03-18 10:01:51 +00001666 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001667 // Enable region store model by default.
1668 CmdArgs.push_back("-analyzer-store=region");
1669
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001670 // Treat blocks as analysis entry points.
1671 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1672
Ted Kremenek51885072011-03-24 00:28:47 +00001673 CmdArgs.push_back("-analyzer-eagerly-assume");
1674
Daniel Dunbar1d460332009-03-18 10:01:51 +00001675 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001676 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001677 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001678
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001679 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1680 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001681
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001682 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001683 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001684
1685 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001686
1687 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00001688 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1690 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1693 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001694 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001695
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001696 // Set the output format. The default is plist, for (lame) historical
1697 // reasons.
1698 CmdArgs.push_back("-analyzer-output");
1699 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00001700 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001701 else
1702 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001703
Ted Kremenek0647a7b2010-03-22 22:32:05 +00001704 // Disable the presentation of standard compiler warnings when
1705 // using --analyze. We only want to show static analyzer diagnostics
1706 // or frontend errors.
1707 CmdArgs.push_back("-w");
1708
Daniel Dunbar1d460332009-03-18 10:01:51 +00001709 // Add -Xanalyzer arguments when running as analyzer.
1710 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00001711 }
1712
Daniel Dunbare2fd6642009-09-10 01:21:12 +00001713 CheckCodeGenerationOptions(D, Args);
1714
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001715 // Perform argument translation for LLVM backend. This
1716 // takes some care in reconciling with llvm-gcc. The
1717 // issue is that llvm-gcc translates these options based on
1718 // the values in cc1, whereas we are processing based on
1719 // the driver arguments.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001720
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001721 // This comes from the default translation the driver + cc1
1722 // would do to enable flag_pic.
Simon Atanasyan003ab662012-05-29 18:50:33 +00001723
1724 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1725 options::OPT_fpic, options::OPT_fno_pic,
1726 options::OPT_fPIE, options::OPT_fno_PIE,
1727 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001728 bool PICDisabled = false;
1729 bool PICEnabled = false;
1730 bool PICForPIE = false;
1731 if (LastPICArg) {
1732 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1733 LastPICArg->getOption().matches(options::OPT_fpie));
1734 PICEnabled = (PICForPIE ||
1735 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1736 LastPICArg->getOption().matches(options::OPT_fpic));
1737 PICDisabled = !PICEnabled;
1738 }
1739 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1740 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00001741 llvm::Triple Triple(TripleStr);
1742 if ((Args.hasArg(options::OPT_mkernel) ||
1743 Args.hasArg(options::OPT_fapple_kext)) &&
1744 (Triple.getOS() != llvm::Triple::IOS ||
1745 Triple.isOSVersionLT(6)))
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001746 PICDisabled = true;
1747 if (Args.hasArg(options::OPT_static))
1748 PICDisabled = true;
1749 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1750
1751 // Select the relocation model.
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001752 const char *Model = getToolChain().GetForcedPicModel();
1753 if (!Model) {
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001754 if (DynamicNoPIC)
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001755 Model = "dynamic-no-pic";
1756 else if (PICDisabled)
1757 Model = "static";
1758 else if (PICEnabled)
1759 Model = "pic";
Daniel Dunbar1d460332009-03-18 10:01:51 +00001760 else
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001761 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbar1d460332009-03-18 10:01:51 +00001762 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001763 StringRef ModelStr = Model ? Model : "";
1764 if (Model && ModelStr != "pic") {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001765 CmdArgs.push_back("-mrelocation-model");
1766 CmdArgs.push_back(Model);
1767 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001768
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001769 // Infer the __PIC__ and __PIE__ values.
1770 if (ModelStr == "pic" && PICForPIE) {
1771 CmdArgs.push_back("-pie-level");
1772 CmdArgs.push_back((LastPICArg &&
1773 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1774 "2" : "1");
1775 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar76743522009-11-29 02:39:08 +00001776 CmdArgs.push_back("-pic-level");
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001777 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1778 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1779 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001780 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001781
Tanya Lattner59876c22009-11-04 01:18:09 +00001782 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1783 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00001784 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001785
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001786 // LLVM Code Generator Options.
1787
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001788 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1789 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00001790 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001791 }
1792
Roman Divackycfe9af22011-03-01 17:40:53 +00001793 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1794 CmdArgs.push_back("-mrtd");
1795
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001796 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001797 CmdArgs.push_back("-mdisable-fp-elim");
1798 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1799 options::OPT_fno_zero_initialized_in_bss))
1800 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar398c6102011-02-04 02:20:39 +00001801 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1802 options::OPT_fno_strict_aliasing,
1803 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00001804 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00001805 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1806 false))
1807 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00001808 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1809 options::OPT_fno_optimize_sibling_calls))
1810 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001811
Chandler Carruthabf07a72012-01-02 14:19:45 +00001812 // Handle various floating point optimization flags, mapping them to the
1813 // appropriate LLVM code generation flags. The pattern for all of these is to
1814 // default off the codegen optimizations, and if any flag enables them and no
1815 // flag disables them after the flag enabling them, enable the codegen
1816 // optimization. This is complicated by several "umbrella" flags.
1817 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001818 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001819 options::OPT_ffinite_math_only,
1820 options::OPT_fno_finite_math_only,
1821 options::OPT_fhonor_infinities,
1822 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001823 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1824 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001825 A->getOption().getID() != options::OPT_fhonor_infinities)
1826 CmdArgs.push_back("-menable-no-infs");
1827 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001828 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001829 options::OPT_ffinite_math_only,
1830 options::OPT_fno_finite_math_only,
1831 options::OPT_fhonor_nans,
1832 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001833 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1834 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001835 A->getOption().getID() != options::OPT_fhonor_nans)
1836 CmdArgs.push_back("-menable-no-nans");
1837
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00001838 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1839 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruthabf07a72012-01-02 14:19:45 +00001840 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001841 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001842 options::OPT_fmath_errno,
Chandler Carruth4f50c502012-04-26 02:10:51 +00001843 options::OPT_fno_math_errno))
1844 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1845 if (MathErrno)
1846 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001847
1848 // There are several flags which require disabling very specific
1849 // optimizations. Any of these being disabled forces us to turn off the
1850 // entire set of LLVM optimizations, so collect them through all the flag
1851 // madness.
1852 bool AssociativeMath = false;
1853 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001854 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001855 options::OPT_funsafe_math_optimizations,
1856 options::OPT_fno_unsafe_math_optimizations,
1857 options::OPT_fassociative_math,
1858 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001859 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1860 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001861 A->getOption().getID() != options::OPT_fno_associative_math)
1862 AssociativeMath = true;
1863 bool ReciprocalMath = false;
1864 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001865 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001866 options::OPT_funsafe_math_optimizations,
1867 options::OPT_fno_unsafe_math_optimizations,
1868 options::OPT_freciprocal_math,
1869 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001870 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1871 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001872 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1873 ReciprocalMath = true;
1874 bool SignedZeros = true;
1875 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001876 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001877 options::OPT_funsafe_math_optimizations,
1878 options::OPT_fno_unsafe_math_optimizations,
1879 options::OPT_fsigned_zeros,
1880 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001881 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1882 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001883 A->getOption().getID() != options::OPT_fsigned_zeros)
1884 SignedZeros = false;
1885 bool TrappingMath = true;
1886 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001887 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00001888 options::OPT_funsafe_math_optimizations,
1889 options::OPT_fno_unsafe_math_optimizations,
1890 options::OPT_ftrapping_math,
1891 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001892 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1893 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00001894 A->getOption().getID() != options::OPT_ftrapping_math)
1895 TrappingMath = false;
1896 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1897 !TrappingMath)
1898 CmdArgs.push_back("-menable-unsafe-fp-math");
1899
Lang Hamesc9686712012-07-06 00:59:19 +00001900
1901 // Validate and pass through -fp-contract option.
1902 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001903 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00001904 options::OPT_ffp_contract)) {
1905 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001906 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00001907 if (Val == "fast" || Val == "on" || Val == "off") {
1908 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1909 } else {
1910 D.Diag(diag::err_drv_unsupported_option_argument)
1911 << A->getOption().getName() << Val;
1912 }
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001913 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesc9686712012-07-06 00:59:19 +00001914 // If fast-math is set then set the fp-contract mode to fast.
1915 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1916 }
1917 }
1918
Bob Wilson455e72e2012-07-19 03:52:53 +00001919 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1920 // and if we find them, tell the frontend to provide the appropriate
1921 // preprocessor macros. This is distinct from enabling any optimizations as
1922 // these options induce language changes which must survive serialization
1923 // and deserialization, etc.
Chad Rosier80ecf5e2012-09-25 22:03:25 +00001924 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1925 if (A->getOption().matches(options::OPT_ffast_math))
1926 CmdArgs.push_back("-ffast-math");
1927 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1928 if (A->getOption().matches(options::OPT_ffinite_math_only))
1929 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00001930
Daniel Dunbar1b718482010-05-14 22:00:22 +00001931 // Decide whether to use verbose asm. Verbose assembly is the default on
1932 // toolchains which have the integrated assembler on by default.
1933 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1934 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00001935 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00001936 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001937 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001938
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001939 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1940 CmdArgs.push_back("-mdebug-pass");
1941 CmdArgs.push_back("Structure");
1942 }
1943 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1944 CmdArgs.push_back("-mdebug-pass");
1945 CmdArgs.push_back("Arguments");
1946 }
1947
John McCalld0c2ec42010-02-19 02:45:38 +00001948 // Enable -mconstructor-aliases except on darwin, where we have to
1949 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00001950 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00001951 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00001952
John McCall32096692011-03-18 02:56:14 +00001953 // Darwin's kernel doesn't support guard variables; just die if we
1954 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00001955 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00001956 CmdArgs.push_back("-fforbid-guard-variables");
1957
Douglas Gregor6f755502011-02-01 15:15:22 +00001958 if (Args.hasArg(options::OPT_mms_bitfields)) {
1959 CmdArgs.push_back("-mms-bitfields");
1960 }
John McCalld0c2ec42010-02-19 02:45:38 +00001961
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001962 // This is a coarse approximation of what llvm-gcc actually does, both
1963 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1964 // complicated ways.
1965 bool AsynchronousUnwindTables =
1966 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1967 options::OPT_fno_asynchronous_unwind_tables,
1968 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001969 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001970 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1971 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001972 CmdArgs.push_back("-munwind-tables");
1973
Rafael Espindola8af669f2012-06-19 01:26:10 +00001974 getToolChain().addClangTargetOptions(CmdArgs);
1975
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001976 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1977 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00001978 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001979 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001980
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001981 // FIXME: Handle -mtune=.
1982 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001983
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001984 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001985 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00001986 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00001987 }
1988
Daniel Dunbar6acda162009-09-09 22:33:08 +00001989 // Add target specific cpu and features flags.
1990 switch(getToolChain().getTriple().getArch()) {
1991 default:
1992 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001993
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001994 case llvm::Triple::arm:
1995 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00001996 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001997 break;
1998
Eric Christophered734732010-03-02 02:41:08 +00001999 case llvm::Triple::mips:
2000 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002001 case llvm::Triple::mips64:
2002 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002003 AddMIPSTargetArgs(Args, CmdArgs);
2004 break;
2005
Hal Finkel02a84272012-06-11 22:35:19 +00002006 case llvm::Triple::ppc:
2007 case llvm::Triple::ppc64:
2008 AddPPCTargetArgs(Args, CmdArgs);
2009 break;
2010
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002011 case llvm::Triple::sparc:
2012 AddSparcTargetArgs(Args, CmdArgs);
2013 break;
2014
Daniel Dunbar6acda162009-09-09 22:33:08 +00002015 case llvm::Triple::x86:
2016 case llvm::Triple::x86_64:
2017 AddX86TargetArgs(Args, CmdArgs);
2018 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002019
2020 case llvm::Triple::hexagon:
2021 AddHexagonTargetArgs(Args, CmdArgs);
2022 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002023 }
2024
Tony Linthicum96319392011-12-12 21:14:55 +00002025
2026
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002027 // Pass the linker version in use.
2028 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2029 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002030 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002031 }
2032
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00002033 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002034 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00002035 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson905c45f2011-10-14 05:03:44 +00002036 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002037 CmdArgs.push_back("-momit-leaf-frame-pointer");
2038
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002039 // Explicitly error on some things we know we don't support and can't just
2040 // ignore.
2041 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002042 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2043 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002044 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002045 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00002046 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002047 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2048 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002049 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002050 << Unsupported->getOption().getName();
2051 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002052 }
2053
Daniel Dunbar1d460332009-03-18 10:01:51 +00002054 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002055 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002056 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002057 CmdArgs.push_back("-header-include-file");
2058 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2059 D.CCPrintHeadersFilename : "-");
2060 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002061 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002062 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002063
Chad Rosier2b819102011-08-02 17:58:04 +00002064 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002065 CmdArgs.push_back("-diagnostic-log-file");
2066 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2067 D.CCLogDiagnosticsFilename : "-");
2068 }
2069
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002070 // Use the last option from "-g" group. "-gline-tables-only" is
2071 // preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002072 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002073 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2074 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2075 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002076 } else if (!A->getOption().matches(options::OPT_g0) &&
2077 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00002078 CmdArgs.push_back("-g");
Chad Rosier2875bda2011-11-04 19:28:44 +00002079 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002080 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002081
Alexey Samsonov7f326072012-06-21 08:22:39 +00002082 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2083 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002084 if (Args.hasArg(options::OPT_gcolumn_info))
2085 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002086
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002087 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2088 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2089
Chris Lattner7255a2d2010-06-22 00:03:40 +00002090 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2091
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002092 if (Args.hasArg(options::OPT_ftest_coverage) ||
2093 Args.hasArg(options::OPT_coverage))
2094 CmdArgs.push_back("-femit-coverage-notes");
2095 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2096 Args.hasArg(options::OPT_coverage))
2097 CmdArgs.push_back("-femit-coverage-data");
2098
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002099 if (C.getArgs().hasArg(options::OPT_c) ||
2100 C.getArgs().hasArg(options::OPT_S)) {
2101 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002102 CmdArgs.push_back("-coverage-file");
Bill Wendlingecbbea42012-08-30 00:43:41 +00002103 SmallString<128> absFilename(Output.getFilename());
2104 llvm::sys::fs::make_absolute(absFilename);
2105 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002106 }
2107 }
2108
Daniel Dunbara268fc02011-10-11 18:20:10 +00002109 // Pass options for controlling the default header search paths.
2110 if (Args.hasArg(options::OPT_nostdinc)) {
2111 CmdArgs.push_back("-nostdsysteminc");
2112 CmdArgs.push_back("-nobuiltininc");
2113 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002114 if (Args.hasArg(options::OPT_nostdlibinc))
2115 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002116 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2117 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2118 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002119
Daniel Dunbar5f122322009-12-15 01:02:52 +00002120 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002121 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002122 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002123
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002124 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2125
Ted Kremenek30660a82012-03-06 20:06:33 +00002126 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002127 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002128 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002129 options::OPT_ccc_arcmt_modify,
2130 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002131 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002132 switch (A->getOption().getID()) {
2133 default:
2134 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002135 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002136 CmdArgs.push_back("-arcmt-check");
2137 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002138 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002139 CmdArgs.push_back("-arcmt-modify");
2140 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002141 case options::OPT_ccc_arcmt_migrate:
2142 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002143 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002144 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002145
2146 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2147 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002148 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002149 }
2150 }
2151 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002152
Ted Kremenek30660a82012-03-06 20:06:33 +00002153 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2154 if (ARCMTEnabled) {
2155 D.Diag(diag::err_drv_argument_not_allowed_with)
2156 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2157 }
2158 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002159 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002160
2161 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2162 options::OPT_objcmt_migrate_subscripting)) {
2163 // None specified, means enable them all.
2164 CmdArgs.push_back("-objcmt-migrate-literals");
2165 CmdArgs.push_back("-objcmt-migrate-subscripting");
2166 } else {
2167 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2168 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2169 }
2170 }
2171
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002172 // Add preprocessing options like -I, -D, etc. if we are using the
2173 // preprocessor.
2174 //
2175 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002176 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne54db68b2011-11-06 00:40:05 +00002177 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002178
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002179 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2180 // that "The compiler can only warn and ignore the option if not recognized".
2181 // When building with ccache, it will pass -D options to clang even on
2182 // preprocessed inputs and configure concludes that -fPIC is not supported.
2183 Args.ClaimAllArgs(options::OPT_D);
2184
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002185 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002186 // others.
2187 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002188 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002189 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002190 else if (A->getOption().matches(options::OPT_O) &&
Richard Smith1d489cf2012-11-01 04:30:05 +00002191 A->getValue()[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002192 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002193 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002194 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002195 }
2196
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002197 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002198 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2199 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002200 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002201 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002202
2203 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2204 // (-ansi is equivalent to -std=c89).
2205 //
2206 // If a std is supplied, only add -trigraphs if it follows the
2207 // option.
2208 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2209 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002210 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002211 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002212 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002213 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002214 else
2215 Std->render(Args, CmdArgs);
2216
Daniel Dunbar0e100312010-06-14 21:23:08 +00002217 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2218 options::OPT_trigraphs))
2219 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002220 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002221 } else {
2222 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002223 //
2224 // FIXME: Clang doesn't correctly handle -std= when the input language
2225 // doesn't match. For the time being just ignore this for C++ inputs;
2226 // eventually we want to do all the standard defaulting here instead of
2227 // splitting it between the driver and clang -cc1.
2228 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002229 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2230 "-std=", /*Joined=*/true);
2231 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2232 CmdArgs.push_back("-std=c++11");
2233
Daniel Dunbard573d262009-04-07 22:13:21 +00002234 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002235 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002236
Chandler Carruth50465d12011-04-23 06:30:43 +00002237 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2238 // '-fconst-strings'; this better indicates its actual behavior.
2239 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2240 false)) {
2241 // For perfect compatibility with GCC, we do this even in the presence of
2242 // '-w'. This flag names something other than a warning for GCC.
2243 CmdArgs.push_back("-fconst-strings");
2244 }
2245
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002246 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002247 // during C++ compilation, which it is by default. GCC keeps this define even
2248 // in the presence of '-w', match this behavior bug-for-bug.
2249 if (types::isCXX(InputType) &&
2250 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2251 true)) {
2252 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002253 }
2254
Chandler Carruthc304ba32010-05-22 02:21:53 +00002255 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2256 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2257 if (Asm->getOption().matches(options::OPT_fasm))
2258 CmdArgs.push_back("-fgnu-keywords");
2259 else
2260 CmdArgs.push_back("-fno-gnu-keywords");
2261 }
2262
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002263 if (ShouldDisableCFI(Args, getToolChain()))
2264 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002265
Nick Lewyckyea523d72011-10-17 23:05:52 +00002266 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2267 CmdArgs.push_back("-fno-dwarf-directory-asm");
2268
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002269 if (const char *pwd = ::getenv("PWD")) {
2270 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2271 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumi813a4072011-10-22 10:25:25 +00002272 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002273 std::string CompDir = pwd;
2274 CmdArgs.push_back("-fdebug-compilation-dir");
2275 CmdArgs.push_back(Args.MakeArgString(CompDir));
2276 }
2277 }
2278
Richard Smithc18c4232011-11-21 19:36:32 +00002279 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2280 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002281 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002282 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002283 }
2284
Richard Smithc18c4232011-11-21 19:36:32 +00002285 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2286 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002287 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002288 }
2289
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002290 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2291 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002292 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002293 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002294 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2295 } else
2296 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002297 }
2298
Nuno Lopesb3198a82012-05-08 22:10:46 +00002299 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2300 options::OPT_fbounds_checking_EQ)) {
2301 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002302 StringRef val = A->getValue();
Nuno Lopesb3198a82012-05-08 22:10:46 +00002303 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2304 } else
2305 CmdArgs.push_back("-fbounds-checking=1");
2306 }
2307
Michael J. Spencerc6357102012-10-22 22:13:48 +00002308 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002309 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002310
Daniel Dunbar294691e2009-11-04 06:24:38 +00002311 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2312 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002313 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002314 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002315
Chris Lattner124fca52010-01-09 21:54:33 +00002316 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2317 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002318 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002319 }
2320
Chris Lattner0f0c9632010-04-07 20:49:23 +00002321 CmdArgs.push_back("-ferror-limit");
2322 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002323 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002324 else
2325 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002326
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002327 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2328 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002329 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002330 }
2331
2332 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2333 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002334 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002335 }
2336
Richard Smith08d6e032011-12-16 19:06:07 +00002337 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2338 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002339 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002340 }
2341
Daniel Dunbar55efe142009-11-04 06:24:47 +00002342 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002343 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002344 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002345 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002346 } else {
2347 // If -fmessage-length=N was not specified, determine whether this is a
2348 // terminal and, if so, implicitly define -fmessage-length appropriately.
2349 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002350 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002351 }
2352
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002353 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2354 CmdArgs.push_back("-fvisibility");
Richard Smith1d489cf2012-11-01 04:30:05 +00002355 CmdArgs.push_back(A->getValue());
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002356 }
2357
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002358 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002359
Hans Wennborgde981f32012-06-28 08:01:44 +00002360 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2361
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002362 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002363 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2364 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002365 CmdArgs.push_back("-ffreestanding");
2366
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002367 // Forward -f (flag) options which we can pass directly.
Mike Stump9c276ae2009-12-12 01:27:46 +00002368 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002369 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002370 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002371 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002372 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002373 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002374 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002375 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2376 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002377
2378 // Report and error for -faltivec on anything other then PowerPC.
2379 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2380 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2381 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2382 D.Diag(diag::err_drv_argument_only_allowed_with)
2383 << A->getAsString(Args) << "ppc/ppc64";
2384
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002385 if (getToolChain().SupportsProfiling())
2386 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002387
Kostya Serebryany1b4eca62011-11-16 17:34:26 +00002388 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2389 options::OPT_fno_address_sanitizer, false))
2390 CmdArgs.push_back("-faddress-sanitizer");
2391
Kostya Serebryany3c931222012-03-01 22:27:08 +00002392 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2393 options::OPT_fno_thread_sanitizer, false))
2394 CmdArgs.push_back("-fthread-sanitizer");
2395
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002396 // -flax-vector-conversions is default.
2397 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2398 options::OPT_fno_lax_vector_conversions))
2399 CmdArgs.push_back("-fno-lax-vector-conversions");
2400
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002401 if (Args.getLastArg(options::OPT_fapple_kext))
2402 CmdArgs.push_back("-fapple-kext");
2403
David Blaikie940152f2012-06-14 18:55:27 +00002404 if (Args.hasFlag(options::OPT_frewrite_includes,
2405 options::OPT_fno_rewrite_includes, false))
2406 CmdArgs.push_back("-frewrite-includes");
2407
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002408 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002409 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002410 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002411 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2412 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002413
2414 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2415 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002416 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002417 }
2418
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002419 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002420
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002421 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2422 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2423 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2424 options::OPT_fno_wrapv)) {
2425 if (A->getOption().matches(options::OPT_fwrapv))
2426 CmdArgs.push_back("-fwrapv");
2427 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2428 options::OPT_fno_strict_overflow)) {
2429 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2430 CmdArgs.push_back("-fwrapv");
2431 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002432 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002433 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002434
Daniel Dunbar5345c392009-09-03 04:54:28 +00002435 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2436
Mahesha Sf3b52312012-10-27 07:47:56 +00002437
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002438 // -stack-protector=0 is default.
2439 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002440 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2441 options::OPT_fstack_protector_all,
2442 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002443 if (A->getOption().matches(options::OPT_fstack_protector))
2444 StackProtectorLevel = 1;
2445 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2446 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002447 } else {
2448 StackProtectorLevel =
2449 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2450 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002451 if (StackProtectorLevel) {
2452 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002453 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002454 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002455
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002456 // --param ssp-buffer-size=
2457 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2458 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002459 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002460 if (Str.startswith("ssp-buffer-size=")) {
2461 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002462 CmdArgs.push_back("-stack-protector-buffer-size");
2463 // FIXME: Verify the argument is a valid integer.
2464 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002465 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002466 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002467 }
Bill Wendling45483f72009-06-28 07:36:13 +00002468 }
2469
Nick Lewycky4e785c92011-12-06 03:33:03 +00002470 // Translate -mstackrealign
2471 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2472 false)) {
2473 CmdArgs.push_back("-backend-option");
2474 CmdArgs.push_back("-force-align-stack");
2475 }
2476 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2477 false)) {
2478 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2479 }
2480
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002481 if (Args.hasArg(options::OPT_mstack_alignment)) {
2482 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2483 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002484 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002485
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002486 // Forward -f options with positive and negative forms; we translate
2487 // these by hand.
2488
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002489 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002490 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002491 CmdArgs.push_back("-fapple-kext");
2492 if (!Args.hasArg(options::OPT_fbuiltin))
2493 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002494 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002495 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002496 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002497 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002498 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002499
Nuno Lopesfc284482009-12-16 16:59:22 +00002500 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2501 options::OPT_fno_assume_sane_operator_new))
2502 CmdArgs.push_back("-fno-assume-sane-operator-new");
2503
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002504 // -fblocks=0 is default.
2505 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002506 getToolChain().IsBlocksDefault()) ||
2507 (Args.hasArg(options::OPT_fgnu_runtime) &&
2508 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2509 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002510 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002511
2512 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2513 !getToolChain().hasBlocksRuntime())
2514 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002515 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002516
Douglas Gregor64554ba2012-01-18 15:19:58 +00002517 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2518 // users must also pass -fcxx-modules. The latter flag will disappear once the
2519 // modules implementation is solid for C++/Objective-C++ programs as well.
2520 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2521 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2522 options::OPT_fno_cxx_modules,
2523 false);
2524 if (AllowedInCXX || !types::isCXX(InputType))
2525 CmdArgs.push_back("-fmodules");
2526 }
Douglas Gregor7025d2c2012-01-03 17:13:05 +00002527
John McCall32579cf2010-04-09 19:12:06 +00002528 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00002529 if (Args.hasFlag(options::OPT_fno_access_control,
2530 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00002531 false))
John McCall7002f4c2010-04-09 19:03:51 +00002532 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00002533
Anders Carlssona4c24752010-11-21 00:09:52 +00002534 // -felide-constructors is the default.
2535 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2536 options::OPT_felide_constructors,
2537 false))
2538 CmdArgs.push_back("-fno-elide-constructors");
2539
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002540 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002541 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2542 KernelOrKext)
Daniel Dunbar53e84842009-11-19 04:55:23 +00002543 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00002544
Tony Linthicum96319392011-12-12 21:14:55 +00002545 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002546 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00002547 options::OPT_fno_short_enums,
2548 getToolChain().getTriple().getArch() ==
2549 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002550 CmdArgs.push_back("-fshort-enums");
2551
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002552 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002553 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002554 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00002555 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00002556
Anders Carlssona508b7d2010-02-06 23:23:06 +00002557 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00002558 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00002559 options::OPT_fno_threadsafe_statics))
2560 CmdArgs.push_back("-fno-threadsafe-statics");
2561
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002562 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002563 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2564 options::OPT_fno_use_cxa_atexit,
2565 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00002566 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00002567 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2568 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002569 CmdArgs.push_back("-fno-use-cxa-atexit");
2570
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002571 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002572 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002573 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2574 CmdArgs.push_back("-fms-extensions");
2575
Chad Rosierf925e042012-07-20 21:20:33 +00002576 // -fms-inline-asm.
Chad Rosierd256f862012-07-20 23:12:26 +00002577 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2578 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosierf925e042012-07-20 21:20:33 +00002579
Francois Pichetae556082011-09-17 04:32:15 +00002580 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00002581 if (Args.hasFlag(options::OPT_fms_compatibility,
2582 options::OPT_fno_ms_compatibility,
2583 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2584 Args.hasFlag(options::OPT_fms_extensions,
2585 options::OPT_fno_ms_extensions,
2586 true))))
Francois Pichetae556082011-09-17 04:32:15 +00002587 CmdArgs.push_back("-fms-compatibility");
2588
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002589 // -fmsc-version=1300 is default.
2590 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2591 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2592 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002593 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002594 if (msc_ver.empty())
2595 CmdArgs.push_back("-fmsc-version=1300");
2596 else
2597 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2598 }
2599
2600
Dawn Perchik400b6072010-09-02 23:59:25 +00002601 // -fborland-extensions=0 is default.
2602 if (Args.hasFlag(options::OPT_fborland_extensions,
2603 options::OPT_fno_borland_extensions, false))
2604 CmdArgs.push_back("-fborland-extensions");
2605
Francois Pichet8efcc012011-09-01 16:38:08 +00002606 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2607 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00002608 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2609 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00002610 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00002611 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00002612
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002613 // -fgnu-keywords default varies depending on language; only pass if
2614 // specified.
2615 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00002616 options::OPT_fno_gnu_keywords))
2617 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002618
Rafael Espindola01ba8542011-06-02 17:30:53 +00002619 if (Args.hasFlag(options::OPT_fgnu89_inline,
2620 options::OPT_fno_gnu89_inline,
2621 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00002622 CmdArgs.push_back("-fgnu89-inline");
2623
Chad Rosierfc055f92012-03-15 22:31:42 +00002624 if (Args.hasArg(options::OPT_fno_inline))
2625 CmdArgs.push_back("-fno-inline");
2626
Chad Rosier634a4b12012-03-06 21:17:19 +00002627 if (Args.hasArg(options::OPT_fno_inline_functions))
2628 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00002629
John McCall260611a2012-06-20 06:18:46 +00002630 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00002631
John McCall260611a2012-06-20 06:18:46 +00002632 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2633 // legacy is the default.
2634 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002635 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2636 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00002637 objcRuntime.isLegacyDispatchDefaultForArch(
2638 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002639 if (getToolChain().UseObjCMixedDispatch())
2640 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2641 else
2642 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2643 }
2644 }
2645
Nico Weberdf423542012-03-09 21:19:44 +00002646 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2647 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00002648 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002649 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2650 }
2651
John McCall9f084a32011-07-06 00:26:06 +00002652 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2653 // NOTE: This logic is duplicated in ToolChains.cpp.
2654 bool ARC = isObjCAutoRefCount(Args);
2655 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00002656 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00002657
John McCall9f084a32011-07-06 00:26:06 +00002658 CmdArgs.push_back("-fobjc-arc");
2659
Chandler Carruth7ffa0322011-11-04 07:34:47 +00002660 // FIXME: It seems like this entire block, and several around it should be
2661 // wrapped in isObjC, but for now we just use it here as this is where it
2662 // was being used previously.
2663 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2664 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2665 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2666 else
2667 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2668 }
2669
John McCall9f084a32011-07-06 00:26:06 +00002670 // Allow the user to enable full exceptions code emission.
2671 // We define off for Objective-CC, on for Objective-C++.
2672 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2673 options::OPT_fno_objc_arc_exceptions,
2674 /*default*/ types::isCXX(InputType)))
2675 CmdArgs.push_back("-fobjc-arc-exceptions");
2676 }
2677
2678 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2679 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00002680 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00002681 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002682
John McCall9f084a32011-07-06 00:26:06 +00002683 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2684 // takes precedence.
2685 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2686 if (!GCArg)
2687 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2688 if (GCArg) {
2689 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002690 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00002691 << GCArg->getAsString(Args);
2692 } else if (getToolChain().SupportsObjCGC()) {
2693 GCArg->render(Args, CmdArgs);
2694 } else {
2695 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002696 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00002697 << GCArg->getAsString(Args);
2698 }
2699 }
2700
John McCalld71315c2011-06-22 00:53:57 +00002701 // Add exception args.
2702 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00002703 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00002704
2705 if (getToolChain().UseSjLjExceptions())
2706 CmdArgs.push_back("-fsjlj-exceptions");
2707
2708 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00002709 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2710 options::OPT_fno_assume_sane_operator_new))
2711 CmdArgs.push_back("-fno-assume-sane-operator-new");
2712
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00002713 // -fconstant-cfstrings is default, and may be subject to argument translation
2714 // on Darwin.
2715 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2716 options::OPT_fno_constant_cfstrings) ||
2717 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2718 options::OPT_mno_constant_cfstrings))
2719 CmdArgs.push_back("-fno-constant-cfstrings");
2720
John Thompsona6fda122009-11-05 20:14:16 +00002721 // -fshort-wchar default varies depending on platform; only
2722 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00002723 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2724 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00002725
Daniel Dunbaree848a72009-10-29 02:39:57 +00002726 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2727 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00002728 //
2729 // FIXME: This is gross; that translation should be pulled from the
2730 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002731 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00002732 options::OPT_fno_pascal_strings,
2733 false) ||
2734 Args.hasFlag(options::OPT_mpascal_strings,
2735 options::OPT_mno_pascal_strings,
2736 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002737 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002738
Daniel Dunbar88934e82011-10-05 21:04:55 +00002739 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2740 // -fno-pack-struct doesn't apply to -fpack-struct=.
2741 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00002742 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00002743 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00002744 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00002745 } else if (Args.hasFlag(options::OPT_fpack_struct,
2746 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00002747 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00002748 }
2749
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002750 if (Args.hasArg(options::OPT_mkernel) ||
2751 Args.hasArg(options::OPT_fapple_kext)) {
2752 if (!Args.hasArg(options::OPT_fcommon))
2753 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00002754 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002755 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00002756
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002757 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002758 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002759 CmdArgs.push_back("-fno-common");
2760
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002761 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002762 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00002763 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002764 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002765 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002766 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2767
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002768 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2769 if (!Args.hasFlag(options::OPT_ffor_scope,
2770 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002771 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002772 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2773
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00002774 // -fcaret-diagnostics is default.
2775 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2776 options::OPT_fno_caret_diagnostics, true))
2777 CmdArgs.push_back("-fno-caret-diagnostics");
2778
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002779 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00002780 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002781 options::OPT_fno_diagnostics_fixit_info))
2782 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002783
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002784 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00002785 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002786 options::OPT_fno_diagnostics_show_option))
2787 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00002788
Chris Lattner6fbe8392010-05-04 21:55:25 +00002789 if (const Arg *A =
2790 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2791 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00002792 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00002793 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002794
Douglas Gregorc9471b02011-05-21 17:07:29 +00002795 if (const Arg *A =
2796 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2797 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00002798 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00002799 }
2800
Chandler Carruthabaca7a2011-03-27 01:50:55 +00002801 if (Arg *A = Args.getLastArg(
2802 options::OPT_fdiagnostics_show_note_include_stack,
2803 options::OPT_fno_diagnostics_show_note_include_stack)) {
2804 if (A->getOption().matches(
2805 options::OPT_fdiagnostics_show_note_include_stack))
2806 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2807 else
2808 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2809 }
2810
Daniel Dunbar838be482009-11-04 06:24:57 +00002811 // Color diagnostics are the default, unless the terminal doesn't support
2812 // them.
2813 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidisf765d762010-09-23 12:56:06 +00002814 options::OPT_fno_color_diagnostics,
2815 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00002816 CmdArgs.push_back("-fcolor-diagnostics");
2817
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00002818 if (!Args.hasFlag(options::OPT_fshow_source_location,
2819 options::OPT_fno_show_source_location))
2820 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002821
Douglas Gregorc9471b02011-05-21 17:07:29 +00002822 if (!Args.hasFlag(options::OPT_fshow_column,
2823 options::OPT_fno_show_column,
2824 true))
2825 CmdArgs.push_back("-fno-show-column");
2826
Douglas Gregora0068fc2010-07-09 17:35:33 +00002827 if (!Args.hasFlag(options::OPT_fspell_checking,
2828 options::OPT_fno_spell_checking))
2829 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002830
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002831
Daniel Dunbar16894392010-11-02 19:42:04 +00002832 // Silently ignore -fasm-blocks for now.
2833 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2834 false);
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00002835
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00002836 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2837 A->render(Args, CmdArgs);
2838
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002839 // -fdollars-in-identifiers default varies depending on platform and
2840 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00002841 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002842 options::OPT_fno_dollars_in_identifiers)) {
2843 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00002844 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002845 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00002846 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00002847 }
2848
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002849 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2850 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00002851 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002852 options::OPT_fno_unit_at_a_time)) {
2853 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002854 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00002855 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002856
Eli Friedman19bda3a2011-11-02 01:53:16 +00002857 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2858 options::OPT_fno_apple_pragma_pack, false))
2859 CmdArgs.push_back("-fapple-pragma-pack");
2860
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002861 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002862 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002863 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002864#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00002865 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002866 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2867 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2868 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2869 CmdArgs.push_back("-fno-builtin-strcat");
2870 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2871 CmdArgs.push_back("-fno-builtin-strcpy");
2872 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00002873#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00002874
Daniel Dunbard98750f2011-03-18 21:23:40 +00002875 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00002876 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00002877 options::OPT_traditional_cpp)) {
2878 if (isa<PreprocessJobAction>(JA))
2879 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002880 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00002881 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00002882 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00002883
Daniel Dunbar1d460332009-03-18 10:01:51 +00002884 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00002885 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00002886
2887 // Handle serialized diagnostics.
2888 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2889 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00002890 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00002891 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002892
Ted Kremenek127ff2e2012-09-13 06:41:18 +00002893 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2894 CmdArgs.push_back("-fretain-comments-from-system-headers");
2895
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002896 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2897 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00002898 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002899 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2900 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002901 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00002902
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002903 // We translate this by hand to the -cc1 argument, since nightly test uses
2904 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00002905 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002906 CmdArgs.push_back("-disable-llvm-optzns");
2907 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00002908 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00002909 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002910
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002911 if (Output.getType() == types::TY_Dependencies) {
2912 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00002913 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002914 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00002915 CmdArgs.push_back(Output.getFilename());
2916 } else {
2917 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002918 }
2919
Daniel Dunbar1d460332009-03-18 10:01:51 +00002920 for (InputInfoList::const_iterator
2921 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2922 const InputInfo &II = *it;
2923 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00002924 if (Args.hasArg(options::OPT_rewrite_objc))
2925 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2926 else
2927 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00002928 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00002929 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002930 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00002931 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002932 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002933
Chris Lattnere6113de2009-11-03 19:50:27 +00002934 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2935
Daniel Dunbara001c1c2010-07-18 21:16:15 +00002936 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002937
2938 // Optionally embed the -cc1 level arguments into the debug info, for build
2939 // analysis.
2940 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00002941 ArgStringList OriginalArgs;
2942 for (ArgList::const_iterator it = Args.begin(),
2943 ie = Args.end(); it != ie; ++it)
2944 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00002945
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00002946 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002947 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00002948 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002949 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00002950 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00002951 }
2952 CmdArgs.push_back("-dwarf-debug-flags");
2953 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2954 }
2955
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00002956 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00002957
Roman Divackybe4c8702011-02-10 16:52:03 +00002958 if (Arg *A = Args.getLastArg(options::OPT_pg))
2959 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002960 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00002961 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002962
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002963 // Claim some arguments which clang supports automatically.
2964
Daniel Dunbarf4046862010-04-15 06:18:42 +00002965 // -fpch-preprocess is used with gcc to add a special marker in the output to
2966 // include the PCH file. Clang's PTH solution is completely transparent, so we
2967 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00002968 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002969
Daniel Dunbara880db02009-03-23 19:03:36 +00002970 // Claim some arguments which clang doesn't support, but we don't
2971 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00002972 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2973 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002974
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002975 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00002976 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00002977 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002978}
2979
Jim Grosbachfc308292012-02-10 20:37:10 +00002980void ClangAs::AddARMTargetArgs(const ArgList &Args,
2981 ArgStringList &CmdArgs) const {
2982 const Driver &D = getToolChain().getDriver();
2983 llvm::Triple Triple = getToolChain().getTriple();
2984
2985 // Set the CPU based on -march= and -mcpu=.
2986 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00002987 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00002988
2989 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00002990 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00002991 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00002992
2993 // Honor -mfpmath=.
2994 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00002995 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00002996}
2997
John McCall260611a2012-06-20 06:18:46 +00002998/// Add options related to the Objective-C runtime/ABI.
2999///
3000/// Returns true if the runtime is non-fragile.
3001ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3002 ArgStringList &cmdArgs,
3003 RewriteKind rewriteKind) const {
3004 // Look for the controlling runtime option.
3005 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3006 options::OPT_fgnu_runtime,
3007 options::OPT_fobjc_runtime_EQ);
3008
3009 // Just forward -fobjc-runtime= to the frontend. This supercedes
3010 // options about fragility.
3011 if (runtimeArg &&
3012 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3013 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003014 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003015 if (runtime.tryParse(value)) {
3016 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3017 << value;
3018 }
3019
3020 runtimeArg->render(args, cmdArgs);
3021 return runtime;
3022 }
3023
3024 // Otherwise, we'll need the ABI "version". Version numbers are
3025 // slightly confusing for historical reasons:
3026 // 1 - Traditional "fragile" ABI
3027 // 2 - Non-fragile ABI, version 1
3028 // 3 - Non-fragile ABI, version 2
3029 unsigned objcABIVersion = 1;
3030 // If -fobjc-abi-version= is present, use that to set the version.
3031 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003032 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003033 if (value == "1")
3034 objcABIVersion = 1;
3035 else if (value == "2")
3036 objcABIVersion = 2;
3037 else if (value == "3")
3038 objcABIVersion = 3;
3039 else
3040 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3041 << value;
3042 } else {
3043 // Otherwise, determine if we are using the non-fragile ABI.
3044 bool nonFragileABIIsDefault =
3045 (rewriteKind == RK_NonFragile ||
3046 (rewriteKind == RK_None &&
3047 getToolChain().IsObjCNonFragileABIDefault()));
3048 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3049 options::OPT_fno_objc_nonfragile_abi,
3050 nonFragileABIIsDefault)) {
3051 // Determine the non-fragile ABI version to use.
3052#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3053 unsigned nonFragileABIVersion = 1;
3054#else
3055 unsigned nonFragileABIVersion = 2;
3056#endif
3057
3058 if (Arg *abiArg = args.getLastArg(
3059 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003060 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003061 if (value == "1")
3062 nonFragileABIVersion = 1;
3063 else if (value == "2")
3064 nonFragileABIVersion = 2;
3065 else
3066 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3067 << value;
3068 }
3069
3070 objcABIVersion = 1 + nonFragileABIVersion;
3071 } else {
3072 objcABIVersion = 1;
3073 }
3074 }
3075
3076 // We don't actually care about the ABI version other than whether
3077 // it's non-fragile.
3078 bool isNonFragile = objcABIVersion != 1;
3079
3080 // If we have no runtime argument, ask the toolchain for its default runtime.
3081 // However, the rewriter only really supports the Mac runtime, so assume that.
3082 ObjCRuntime runtime;
3083 if (!runtimeArg) {
3084 switch (rewriteKind) {
3085 case RK_None:
3086 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3087 break;
3088 case RK_Fragile:
3089 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3090 break;
3091 case RK_NonFragile:
3092 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3093 break;
3094 }
3095
3096 // -fnext-runtime
3097 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3098 // On Darwin, make this use the default behavior for the toolchain.
3099 if (getToolChain().getTriple().isOSDarwin()) {
3100 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3101
3102 // Otherwise, build for a generic macosx port.
3103 } else {
3104 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3105 }
3106
3107 // -fgnu-runtime
3108 } else {
3109 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003110 // Legacy behaviour is to target the gnustep runtime if we are i
3111 // non-fragile mode or the GCC runtime in fragile mode.
3112 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003113 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003114 else
3115 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003116 }
3117
3118 cmdArgs.push_back(args.MakeArgString(
3119 "-fobjc-runtime=" + runtime.getAsString()));
3120 return runtime;
3121}
3122
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003123void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003124 const InputInfo &Output,
3125 const InputInfoList &Inputs,
3126 const ArgList &Args,
3127 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003128 ArgStringList CmdArgs;
3129
3130 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3131 const InputInfo &Input = Inputs[0];
3132
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003133 // Don't warn about "clang -w -c foo.s"
3134 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003135 // and "clang -emit-llvm -c foo.s"
3136 Args.ClaimAllArgs(options::OPT_emit_llvm);
3137 // and "clang -use-gold-plugin -c foo.s"
3138 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003139
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003140 // Invoke ourselves in -cc1as mode.
3141 //
3142 // FIXME: Implement custom jobs for internal actions.
3143 CmdArgs.push_back("-cc1as");
3144
3145 // Add the "effective" target triple.
3146 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003147 std::string TripleStr =
3148 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003149 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3150
3151 // Set the output mode, we currently only expect to be used as a real
3152 // assembler.
3153 CmdArgs.push_back("-filetype");
3154 CmdArgs.push_back("obj");
3155
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003156 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003157 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003158
Jim Grosbachfc308292012-02-10 20:37:10 +00003159 // Add target specific cpu and features flags.
3160 switch(getToolChain().getTriple().getArch()) {
3161 default:
3162 break;
3163
3164 case llvm::Triple::arm:
3165 case llvm::Triple::thumb:
3166 AddARMTargetArgs(Args, CmdArgs);
3167 break;
3168 }
3169
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003170 // Ignore explicit -force_cpusubtype_ALL option.
3171 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003172
Eric Christopher8f0a4032012-01-10 00:38:01 +00003173 // Determine the original source input.
3174 const Action *SourceAction = &JA;
3175 while (SourceAction->getKind() != Action::InputClass) {
3176 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3177 SourceAction = SourceAction->getInputs()[0];
3178 }
3179
3180 // Forward -g, assuming we are dealing with an actual assembly file.
3181 if (SourceAction->getType() == types::TY_Asm ||
3182 SourceAction->getType() == types::TY_PP_Asm) {
3183 Args.ClaimAllArgs(options::OPT_g_Group);
3184 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3185 if (!A->getOption().matches(options::OPT_g0))
3186 CmdArgs.push_back("-g");
3187 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003188
3189 // Optionally embed the -cc1as level arguments into the debug info, for build
3190 // analysis.
3191 if (getToolChain().UseDwarfDebugFlags()) {
3192 ArgStringList OriginalArgs;
3193 for (ArgList::const_iterator it = Args.begin(),
3194 ie = Args.end(); it != ie; ++it)
3195 (*it)->render(Args, OriginalArgs);
3196
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003197 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003198 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3199 Flags += Exec;
3200 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3201 Flags += " ";
3202 Flags += OriginalArgs[i];
3203 }
3204 CmdArgs.push_back("-dwarf-debug-flags");
3205 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3206 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003207
3208 // FIXME: Add -static support, once we have it.
3209
3210 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3211 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003212 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003213
3214 assert(Output.isFilename() && "Unexpected lipo output.");
3215 CmdArgs.push_back("-o");
3216 CmdArgs.push_back(Output.getFilename());
3217
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003218 assert(Input.isFilename() && "Invalid input.");
3219 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003220
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003221 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003222 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003223}
3224
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003225void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003226 const InputInfo &Output,
3227 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003228 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003229 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003230 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003231 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003232
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003233 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003234 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003235 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00003236 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003237 // Don't forward any -g arguments to assembly steps.
3238 if (isa<AssembleJobAction>(JA) &&
3239 A->getOption().matches(options::OPT_g_Group))
3240 continue;
3241
Daniel Dunbar75877192009-03-19 07:55:12 +00003242 // It is unfortunate that we have to claim here, as this means
3243 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003244 // platforms using a generic gcc, even if we are just using gcc
3245 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003246 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003247 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003248 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003249 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003250
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003251 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003252
3253 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003254 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00003255 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003256 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003257
3258 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003259 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003260 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003261 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003262 CmdArgs.push_back("ppc64");
3263 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003264 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003265 }
3266
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003267 // Try to force gcc to match the tool chain we want, if we recognize
3268 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003269 //
3270 // FIXME: The triple class should directly provide the information we want
3271 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003272 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003273 CmdArgs.push_back("-m32");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003274 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003275 CmdArgs.push_back("-m64");
3276
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003277 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003278 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003279 CmdArgs.push_back(Output.getFilename());
3280 } else {
3281 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003282 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003283 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003284
Tony Linthicum96319392011-12-12 21:14:55 +00003285 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3286 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003287
3288 // Only pass -x if gcc will understand it; otherwise hope gcc
3289 // understands the suffix correctly. The main use case this would go
3290 // wrong in is for linker inputs if they happened to have an odd
3291 // suffix; really the only way to get this to happen is a command
3292 // like '-x foobar a.c' which will treat a.c like a linker input.
3293 //
3294 // FIXME: For the linker case specifically, can we safely convert
3295 // inputs into '-Wl,' options?
3296 for (InputInfoList::const_iterator
3297 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3298 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003299
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003300 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003301 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3302 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003303 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003304 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003305 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003306 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003307 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003308
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003309 if (types::canTypeBeUserSpecified(II.getType())) {
3310 CmdArgs.push_back("-x");
3311 CmdArgs.push_back(types::getTypeName(II.getType()));
3312 }
3313
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003314 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003315 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003316 else {
3317 const Arg &A = II.getInputArg();
3318
3319 // Reverse translate some rewritten options.
3320 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3321 CmdArgs.push_back("-lstdc++");
3322 continue;
3323 }
3324
Daniel Dunbar115a7922009-03-19 07:29:38 +00003325 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003326 A.render(Args, CmdArgs);
3327 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003328 }
3329
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003330 const std::string customGCCName = D.getCCCGenericGCCName();
3331 const char *GCCName;
3332 if (!customGCCName.empty())
3333 GCCName = customGCCName.c_str();
3334 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003335 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003336 } else
3337 GCCName = "gcc";
3338
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003339 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003340 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003341 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003342}
3343
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003344void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3345 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003346 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003347}
3348
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003349void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3350 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003351 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003352}
3353
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003354void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3355 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003356 const Driver &D = getToolChain().getDriver();
3357
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003358 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003359 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3360 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003361 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00003362 else {
3363 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003364 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003365 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00003366
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003367 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00003368 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003369}
3370
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003371void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3372 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003373 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003374}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003375
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003376void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3377 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003378 // The types are (hopefully) good enough.
3379}
3380
Tony Linthicum96319392011-12-12 21:14:55 +00003381// Hexagon tools start.
3382void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3383 ArgStringList &CmdArgs) const {
3384
3385}
3386void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3387 const InputInfo &Output,
3388 const InputInfoList &Inputs,
3389 const ArgList &Args,
3390 const char *LinkingOutput) const {
3391
3392 const Driver &D = getToolChain().getDriver();
3393 ArgStringList CmdArgs;
3394
3395 std::string MarchString = "-march=";
3396 MarchString += getHexagonTargetCPU(Args);
3397 CmdArgs.push_back(Args.MakeArgString(MarchString));
3398
3399 RenderExtraToolArgs(JA, CmdArgs);
3400
3401 if (Output.isFilename()) {
3402 CmdArgs.push_back("-o");
3403 CmdArgs.push_back(Output.getFilename());
3404 } else {
3405 assert(Output.isNothing() && "Unexpected output");
3406 CmdArgs.push_back("-fsyntax-only");
3407 }
3408
3409
3410 // Only pass -x if gcc will understand it; otherwise hope gcc
3411 // understands the suffix correctly. The main use case this would go
3412 // wrong in is for linker inputs if they happened to have an odd
3413 // suffix; really the only way to get this to happen is a command
3414 // like '-x foobar a.c' which will treat a.c like a linker input.
3415 //
3416 // FIXME: For the linker case specifically, can we safely convert
3417 // inputs into '-Wl,' options?
3418 for (InputInfoList::const_iterator
3419 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3420 const InputInfo &II = *it;
3421
3422 // Don't try to pass LLVM or AST inputs to a generic gcc.
3423 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3424 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3425 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3426 << getToolChain().getTripleString();
3427 else if (II.getType() == types::TY_AST)
3428 D.Diag(clang::diag::err_drv_no_ast_support)
3429 << getToolChain().getTripleString();
3430
3431 if (II.isFilename())
3432 CmdArgs.push_back(II.getFilename());
3433 else
3434 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3435 II.getInputArg().render(Args, CmdArgs);
3436 }
3437
3438 const char *GCCName = "hexagon-as";
3439 const char *Exec =
3440 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3441 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3442
3443}
3444void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3445 ArgStringList &CmdArgs) const {
3446 // The types are (hopefully) good enough.
3447}
3448
3449void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3450 const InputInfo &Output,
3451 const InputInfoList &Inputs,
3452 const ArgList &Args,
3453 const char *LinkingOutput) const {
3454
3455 const Driver &D = getToolChain().getDriver();
3456 ArgStringList CmdArgs;
3457
3458 for (ArgList::const_iterator
3459 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3460 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00003461 if (forwardToGCC(A->getOption())) {
Tony Linthicum96319392011-12-12 21:14:55 +00003462 // Don't forward any -g arguments to assembly steps.
3463 if (isa<AssembleJobAction>(JA) &&
3464 A->getOption().matches(options::OPT_g_Group))
3465 continue;
3466
3467 // It is unfortunate that we have to claim here, as this means
3468 // we will basically never report anything interesting for
3469 // platforms using a generic gcc, even if we are just using gcc
3470 // to get to the assembler.
3471 A->claim();
3472 A->render(Args, CmdArgs);
3473 }
3474 }
3475
3476 RenderExtraToolArgs(JA, CmdArgs);
3477
3478 // Add Arch Information
3479 Arg *A;
Sebastian Pop43115d42012-01-13 20:37:10 +00003480 if ((A = getLastHexagonArchArg(Args))) {
3481 if (A->getOption().matches(options::OPT_m_Joined))
3482 A->render(Args, CmdArgs);
Tony Linthicum96319392011-12-12 21:14:55 +00003483 else
Sebastian Pop43115d42012-01-13 20:37:10 +00003484 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00003485 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003486 else {
3487 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3488 }
3489
Tony Linthicum96319392011-12-12 21:14:55 +00003490 CmdArgs.push_back("-mqdsp6-compat");
3491
3492 const char *GCCName;
3493 if (C.getDriver().CCCIsCXX)
3494 GCCName = "hexagon-g++";
3495 else
3496 GCCName = "hexagon-gcc";
3497 const char *Exec =
3498 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3499
3500 if (Output.isFilename()) {
3501 CmdArgs.push_back("-o");
3502 CmdArgs.push_back(Output.getFilename());
3503 }
3504
3505 for (InputInfoList::const_iterator
3506 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3507 const InputInfo &II = *it;
3508
3509 // Don't try to pass LLVM or AST inputs to a generic gcc.
3510 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3511 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3512 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3513 << getToolChain().getTripleString();
3514 else if (II.getType() == types::TY_AST)
3515 D.Diag(clang::diag::err_drv_no_ast_support)
3516 << getToolChain().getTripleString();
3517
3518 if (II.isFilename())
3519 CmdArgs.push_back(II.getFilename());
3520 else
3521 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3522 II.getInputArg().render(Args, CmdArgs);
3523 }
3524 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3525
3526}
3527// Hexagon tools end.
3528
Rafael Espindolacfed8282012-10-31 18:51:07 +00003529llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3530 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3531 // archs which Darwin doesn't use.
3532
3533 // The matching this routine does is fairly pointless, since it is neither the
3534 // complete architecture list, nor a reasonable subset. The problem is that
3535 // historically the driver driver accepts this and also ties its -march=
3536 // handling to the architecture name, so we need to be careful before removing
3537 // support for it.
3538
3539 // This code must be kept in sync with Clang's Darwin specific argument
3540 // translation.
3541
3542 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3543 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3544 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3545 .Case("ppc64", llvm::Triple::ppc64)
3546 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3547 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3548 llvm::Triple::x86)
3549 .Case("x86_64", llvm::Triple::x86_64)
3550 // This is derived from the driver driver.
3551 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3552 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3553 .Case("r600", llvm::Triple::r600)
3554 .Case("nvptx", llvm::Triple::nvptx)
3555 .Case("nvptx64", llvm::Triple::nvptx64)
3556 .Case("amdil", llvm::Triple::amdil)
3557 .Case("spir", llvm::Triple::spir)
3558 .Default(llvm::Triple::UnknownArch);
3559}
Tony Linthicum96319392011-12-12 21:14:55 +00003560
Daniel Dunbar40f12652009-03-29 17:08:39 +00003561const char *darwin::CC1::getCC1Name(types::ID Type) const {
3562 switch (Type) {
3563 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00003564 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbar40f12652009-03-29 17:08:39 +00003565 case types::TY_Asm:
3566 case types::TY_C: case types::TY_CHeader:
3567 case types::TY_PP_C: case types::TY_PP_CHeader:
3568 return "cc1";
3569 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003570 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3571 case types::TY_PP_ObjCHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003572 return "cc1obj";
3573 case types::TY_CXX: case types::TY_CXXHeader:
3574 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3575 return "cc1plus";
3576 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webercc52a062011-08-13 23:13:37 +00003577 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3578 case types::TY_PP_ObjCXXHeader:
Daniel Dunbar40f12652009-03-29 17:08:39 +00003579 return "cc1objplus";
3580 }
3581}
3582
David Blaikie99ba9e32011-12-20 02:48:34 +00003583void darwin::CC1::anchor() {}
3584
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003585const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003586 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00003587 return Args.MakeArgString(
3588 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003589}
3590
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003591const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003592 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003593 const char *Str = getBaseInputName(Args, Inputs);
3594
Chris Lattner657ca662011-01-16 08:14:11 +00003595 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00003596 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003597
3598 return Str;
3599}
3600
3601const char *
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003602darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003603 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003604 // FIXME: Think about this more.
3605 std::string Res;
3606
3607 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003608 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003609 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00003610 } else {
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003611 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00003612 }
Daniel Dunbar88137642009-09-09 22:32:48 +00003613 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003614}
3615
Chad Rosier285f9a22011-08-17 18:24:55 +00003616void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher88b7cf02011-08-19 00:30:14 +00003617 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosier285f9a22011-08-17 18:24:55 +00003618 it != ie;) {
Chad Rosier8722a5d2011-08-18 17:56:32 +00003619
3620 StringRef Option = *it;
Chad Rosier80717972011-08-26 18:30:43 +00003621 bool RemoveOption = false;
Chad Rosier04225c12011-08-18 01:18:28 +00003622
Bob Wilson2872c8d2012-02-07 01:17:55 +00003623 // Erase both -fmodule-cache-path and its argument.
3624 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3625 it = CmdArgs.erase(it, it+2);
Chad Rosier80717972011-08-26 18:30:43 +00003626 ie = CmdArgs.end();
Chad Rosier04225c12011-08-18 01:18:28 +00003627 continue;
3628 }
3629
Bob Wilson2872c8d2012-02-07 01:17:55 +00003630 // Remove unsupported -f options.
3631 if (Option.startswith("-f")) {
3632 // Remove -f/-fno- to reduce the number of cases.
3633 if (Option.startswith("-fno-"))
3634 Option = Option.substr(5);
3635 else
3636 Option = Option.substr(2);
3637 RemoveOption = llvm::StringSwitch<bool>(Option)
3638 .Case("altivec", true)
3639 .Case("modules", true)
3640 .Case("diagnostics-show-note-include-stack", true)
3641 .Default(false);
3642 }
3643
Chad Rosier80717972011-08-26 18:30:43 +00003644 // Handle machine specific options.
3645 if (Option.startswith("-m")) {
3646 RemoveOption = llvm::StringSwitch<bool>(Option)
3647 .Case("-mthumb", true)
3648 .Case("-mno-thumb", true)
3649 .Case("-mno-fused-madd", true)
3650 .Case("-mlong-branch", true)
3651 .Case("-mlongcall", true)
3652 .Case("-mcpu=G4", true)
3653 .Case("-mcpu=G5", true)
3654 .Default(false);
3655 }
3656
3657 // Handle warning options.
3658 if (Option.startswith("-W")) {
3659 // Remove -W/-Wno- to reduce the number of cases.
3660 if (Option.startswith("-Wno-"))
3661 Option = Option.substr(5);
3662 else
3663 Option = Option.substr(2);
3664
3665 RemoveOption = llvm::StringSwitch<bool>(Option)
3666 .Case("address-of-temporary", true)
3667 .Case("ambiguous-member-template", true)
3668 .Case("analyzer-incompatible-plugin", true)
3669 .Case("array-bounds", true)
3670 .Case("array-bounds-pointer-arithmetic", true)
3671 .Case("bind-to-temporary-copy", true)
3672 .Case("bitwise-op-parentheses", true)
3673 .Case("bool-conversions", true)
3674 .Case("builtin-macro-redefined", true)
3675 .Case("c++-hex-floats", true)
3676 .Case("c++0x-compat", true)
3677 .Case("c++0x-extensions", true)
3678 .Case("c++0x-narrowing", true)
Richard Smith575fdda2011-10-13 23:32:09 +00003679 .Case("c++11-compat", true)
3680 .Case("c++11-extensions", true)
3681 .Case("c++11-narrowing", true)
Chad Rosier80717972011-08-26 18:30:43 +00003682 .Case("conditional-uninitialized", true)
3683 .Case("constant-conversion", true)
David Blaikie95187bd2012-03-15 04:50:32 +00003684 .Case("conversion-null", true)
Chad Rosier80717972011-08-26 18:30:43 +00003685 .Case("CFString-literal", true)
3686 .Case("constant-logical-operand", true)
3687 .Case("custom-atomic-properties", true)
3688 .Case("default-arg-special-member", true)
3689 .Case("delegating-ctor-cycles", true)
3690 .Case("delete-non-virtual-dtor", true)
3691 .Case("deprecated-implementations", true)
3692 .Case("deprecated-writable-strings", true)
3693 .Case("distributed-object-modifiers", true)
3694 .Case("duplicate-method-arg", true)
3695 .Case("dynamic-class-memaccess", true)
3696 .Case("enum-compare", true)
Ted Kremenek2c3d8fa2012-10-09 19:29:48 +00003697 .Case("enum-conversion", true)
Chad Rosier80717972011-08-26 18:30:43 +00003698 .Case("exit-time-destructors", true)
3699 .Case("gnu", true)
3700 .Case("gnu-designator", true)
3701 .Case("header-hygiene", true)
3702 .Case("idiomatic-parentheses", true)
3703 .Case("ignored-qualifiers", true)
3704 .Case("implicit-atomic-properties", true)
3705 .Case("incompatible-pointer-types", true)
3706 .Case("incomplete-implementation", true)
Ted Kremenek28e2aff2012-10-09 19:29:46 +00003707 .Case("int-conversion", true)
Chad Rosier80717972011-08-26 18:30:43 +00003708 .Case("initializer-overrides", true)
3709 .Case("invalid-noreturn", true)
3710 .Case("invalid-token-paste", true)
Ivan Krasin08f35a72011-10-06 02:46:34 +00003711 .Case("language-extension-token", true)
Chad Rosier80717972011-08-26 18:30:43 +00003712 .Case("literal-conversion", true)
3713 .Case("literal-range", true)
3714 .Case("local-type-template-args", true)
3715 .Case("logical-op-parentheses", true)
3716 .Case("method-signatures", true)
3717 .Case("microsoft", true)
3718 .Case("mismatched-tags", true)
3719 .Case("missing-method-return-type", true)
3720 .Case("non-pod-varargs", true)
3721 .Case("nonfragile-abi2", true)
3722 .Case("null-arithmetic", true)
3723 .Case("null-dereference", true)
3724 .Case("out-of-line-declaration", true)
3725 .Case("overriding-method-mismatch", true)
3726 .Case("readonly-setter-attrs", true)
3727 .Case("return-stack-address", true)
3728 .Case("self-assign", true)
3729 .Case("semicolon-before-method-body", true)
3730 .Case("sentinel", true)
3731 .Case("shift-overflow", true)
3732 .Case("shift-sign-overflow", true)
3733 .Case("sign-conversion", true)
3734 .Case("sizeof-array-argument", true)
3735 .Case("sizeof-pointer-memaccess", true)
3736 .Case("string-compare", true)
3737 .Case("super-class-method-mismatch", true)
3738 .Case("tautological-compare", true)
3739 .Case("typedef-redefinition", true)
3740 .Case("typename-missing", true)
3741 .Case("undefined-reinterpret-cast", true)
3742 .Case("unknown-warning-option", true)
3743 .Case("unnamed-type-template-args", true)
3744 .Case("unneeded-internal-declaration", true)
3745 .Case("unneeded-member-function", true)
3746 .Case("unused-comparison", true)
3747 .Case("unused-exception-parameter", true)
3748 .Case("unused-member-function", true)
3749 .Case("unused-result", true)
3750 .Case("vector-conversions", true)
3751 .Case("vla", true)
3752 .Case("used-but-marked-unused", true)
3753 .Case("weak-vtables", true)
3754 .Default(false);
3755 } // if (Option.startswith("-W"))
Chad Rosier04225c12011-08-18 01:18:28 +00003756 if (RemoveOption) {
Chad Rosier285f9a22011-08-17 18:24:55 +00003757 it = CmdArgs.erase(it);
Chad Rosiercc0de8c2011-08-17 18:51:56 +00003758 ie = CmdArgs.end();
Chad Rosier30601782011-08-17 23:08:45 +00003759 } else {
Chad Rosier285f9a22011-08-17 18:24:55 +00003760 ++it;
Chad Rosier30601782011-08-17 23:08:45 +00003761 }
Chad Rosier285f9a22011-08-17 18:24:55 +00003762 }
3763}
3764
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003765void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003766 ArgStringList &CmdArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003767 const Driver &D = getToolChain().getDriver();
Daniel Dunbare2fd6642009-09-10 01:21:12 +00003768
3769 CheckCodeGenerationOptions(D, Args);
3770
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003771 // Derived from cc1 spec.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00003772 if ((!Args.hasArg(options::OPT_mkernel) ||
3773 (getDarwinToolChain().isTargetIPhoneOS() &&
3774 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3775 !Args.hasArg(options::OPT_static) &&
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003776 !Args.hasArg(options::OPT_mdynamic_no_pic))
3777 CmdArgs.push_back("-fPIC");
3778
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003779 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3780 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3781 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3782 CmdArgs.push_back("-fno-builtin-strcat");
3783 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3784 CmdArgs.push_back("-fno-builtin-strcpy");
3785 }
3786
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003787 if (Args.hasArg(options::OPT_g_Flag) &&
3788 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3789 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3790}
3791
3792void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3793 const InputInfoList &Inputs,
3794 const ArgStringList &OutputArgs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003795 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003796
3797 // Derived from cc1_options spec.
3798 if (Args.hasArg(options::OPT_fast) ||
3799 Args.hasArg(options::OPT_fastf) ||
3800 Args.hasArg(options::OPT_fastcp))
3801 CmdArgs.push_back("-O3");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003802
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003803 if (Arg *A = Args.getLastArg(options::OPT_pg))
3804 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003805 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003806 << A->getAsString(Args) << "-fomit-frame-pointer";
3807
3808 AddCC1Args(Args, CmdArgs);
3809
3810 if (!Args.hasArg(options::OPT_Q))
3811 CmdArgs.push_back("-quiet");
3812
3813 CmdArgs.push_back("-dumpbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003814 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003815
3816 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3817
3818 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3819 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3820
3821 // FIXME: The goal is to use the user provided -o if that is our
3822 // final output, otherwise to drive from the original input
3823 // name. Find a clean way to go about this.
3824 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3825 Args.hasArg(options::OPT_o)) {
3826 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3827 CmdArgs.push_back("-auxbase-strip");
Richard Smith1d489cf2012-11-01 04:30:05 +00003828 CmdArgs.push_back(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003829 } else {
3830 CmdArgs.push_back("-auxbase");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003831 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003832 }
3833
3834 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3835
3836 Args.AddAllArgs(CmdArgs, options::OPT_O);
3837 // FIXME: -Wall is getting some special treatment. Investigate.
3838 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3839 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003840 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003841 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003842 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3843 // Honor -std-default.
3844 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3845 "-std=", /*Joined=*/true);
3846 }
3847
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003848 if (Args.hasArg(options::OPT_v))
3849 CmdArgs.push_back("-version");
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00003850 if (Args.hasArg(options::OPT_pg) &&
3851 getToolChain().SupportsProfiling())
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003852 CmdArgs.push_back("-p");
3853 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003854
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003855 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003856 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3857 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3858 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3859 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3860 //
3861 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003862 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3863 options::OPT_fsyntax_only),
3864 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003865 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3866 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3867 (*it)->claim();
3868 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003869 }
3870 }
3871 } else
3872 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003873
Daniel Dunbar089f8722011-04-07 20:41:03 +00003874 // Claim Clang only -f options, they aren't worth warning about.
3875 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3876
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003877 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3878 if (Args.hasArg(options::OPT_Qn))
3879 CmdArgs.push_back("-fno-ident");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003880
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003881 // FIXME: This isn't correct.
3882 //Args.AddLastArg(CmdArgs, options::OPT__help)
3883 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3884
3885 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3886
3887 // FIXME: Still don't get what is happening here. Investigate.
3888 Args.AddAllArgs(CmdArgs, options::OPT__param);
3889
3890 if (Args.hasArg(options::OPT_fmudflap) ||
3891 Args.hasArg(options::OPT_fmudflapth)) {
3892 CmdArgs.push_back("-fno-builtin");
3893 CmdArgs.push_back("-fno-merge-constants");
3894 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003895
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003896 if (Args.hasArg(options::OPT_coverage)) {
3897 CmdArgs.push_back("-fprofile-arcs");
3898 CmdArgs.push_back("-ftest-coverage");
3899 }
3900
3901 if (types::isCXX(Inputs[0].getType()))
3902 CmdArgs.push_back("-D__private_extern__=extern");
3903}
3904
3905void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3906 const InputInfoList &Inputs,
3907 const ArgStringList &OutputArgs) const {
3908 // Derived from cpp_options
3909 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003910
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003911 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3912
3913 AddCC1Args(Args, CmdArgs);
3914
3915 // NOTE: The code below has some commonality with cpp_options, but
3916 // in classic gcc style ends up sending things in different
3917 // orders. This may be a good merge candidate once we drop pedantic
3918 // compatibility.
3919
3920 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003921 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003922 options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003923 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3924 // Honor -std-default.
3925 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3926 "-std=", /*Joined=*/true);
3927 }
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003928 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3929 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003930
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003931 // The driver treats -fsyntax-only specially.
3932 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3933
Daniel Dunbar089f8722011-04-07 20:41:03 +00003934 // Claim Clang only -f options, they aren't worth warning about.
3935 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3936
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003937 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3938 !Args.hasArg(options::OPT_fno_working_directory))
3939 CmdArgs.push_back("-fworking-directory");
3940
3941 Args.AddAllArgs(CmdArgs, options::OPT_O);
3942 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3943 if (Args.hasArg(options::OPT_save_temps))
3944 CmdArgs.push_back("-fpch-preprocess");
3945}
3946
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003947void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003948 ArgStringList &CmdArgs,
Mike Stump1eb44332009-09-09 15:08:12 +00003949 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003950 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003951
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003952 CheckPreprocessingOptions(D, Args);
3953
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003954 // Derived from cpp_unique_options.
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +00003955 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3956 Args.AddLastArg(CmdArgs, options::OPT_C);
3957 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003958 if (!Args.hasArg(options::OPT_Q))
3959 CmdArgs.push_back("-quiet");
3960 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor4c2bcad2010-03-24 20:13:48 +00003961 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003962 Args.AddLastArg(CmdArgs, options::OPT_v);
3963 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3964 Args.AddLastArg(CmdArgs, options::OPT_P);
3965
3966 // FIXME: Handle %I properly.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003967 if (getToolChain().getArch() == llvm::Triple::x86_64) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003968 CmdArgs.push_back("-imultilib");
3969 CmdArgs.push_back("x86_64");
3970 }
3971
3972 if (Args.hasArg(options::OPT_MD)) {
3973 CmdArgs.push_back("-MD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003974 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003975 }
3976
3977 if (Args.hasArg(options::OPT_MMD)) {
3978 CmdArgs.push_back("-MMD");
Daniel Dunbara5a7bd02009-03-30 00:34:04 +00003979 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003980 }
3981
3982 Args.AddLastArg(CmdArgs, options::OPT_M);
3983 Args.AddLastArg(CmdArgs, options::OPT_MM);
3984 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3985 Args.AddLastArg(CmdArgs, options::OPT_MG);
3986 Args.AddLastArg(CmdArgs, options::OPT_MP);
3987 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3988 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3989 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3990 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3991 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3992 CmdArgs.push_back("-MQ");
Richard Smith1d489cf2012-11-01 04:30:05 +00003993 CmdArgs.push_back(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003994 }
3995 }
3996
3997 Args.AddLastArg(CmdArgs, options::OPT_remap);
3998 if (Args.hasArg(options::OPT_g3))
3999 CmdArgs.push_back("-dD");
4000 Args.AddLastArg(CmdArgs, options::OPT_H);
4001
4002 AddCPPArgs(Args, CmdArgs);
4003
4004 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
4005 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
4006
4007 for (InputInfoList::const_iterator
4008 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4009 const InputInfo &II = *it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004010
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004011 CmdArgs.push_back(II.getFilename());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004012 }
4013
4014 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
4015 options::OPT_Xpreprocessor);
4016
4017 if (Args.hasArg(options::OPT_fmudflap)) {
4018 CmdArgs.push_back("-D_MUDFLAP");
4019 CmdArgs.push_back("-include");
4020 CmdArgs.push_back("mf-runtime.h");
4021 }
4022
4023 if (Args.hasArg(options::OPT_fmudflapth)) {
4024 CmdArgs.push_back("-D_MUDFLAP");
4025 CmdArgs.push_back("-D_MUDFLAPTH");
4026 CmdArgs.push_back("-include");
4027 CmdArgs.push_back("mf-runtime.h");
4028 }
4029}
4030
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004031void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004032 ArgStringList &CmdArgs) const {
4033 // Derived from cpp spec.
4034
4035 if (Args.hasArg(options::OPT_static)) {
4036 // The gcc spec is broken here, it refers to dynamic but
4037 // that has been translated. Start by being bug compatible.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004038
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004039 // if (!Args.hasArg(arglist.parser.dynamicOption))
4040 CmdArgs.push_back("-D__STATIC__");
4041 } else
4042 CmdArgs.push_back("-D__DYNAMIC__");
4043
4044 if (Args.hasArg(options::OPT_pthread))
4045 CmdArgs.push_back("-D_REENTRANT");
4046}
4047
Daniel Dunbar40f12652009-03-29 17:08:39 +00004048void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004049 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004050 const InputInfoList &Inputs,
4051 const ArgList &Args,
Daniel Dunbar40f12652009-03-29 17:08:39 +00004052 const char *LinkingOutput) const {
4053 ArgStringList CmdArgs;
4054
4055 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4056
4057 CmdArgs.push_back("-E");
4058
4059 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbar40f12652009-03-29 17:08:39 +00004060 Args.hasArg(options::OPT_traditional_cpp))
4061 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004062
Daniel Dunbar40f12652009-03-29 17:08:39 +00004063 ArgStringList OutputArgs;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004064 assert(Output.isFilename() && "Unexpected CC1 output.");
4065 OutputArgs.push_back("-o");
4066 OutputArgs.push_back(Output.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004067
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +00004068 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbar9120f172009-03-29 22:27:40 +00004069 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4070 } else {
4071 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4072 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4073 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004074
Daniel Dunbar8a2073a2009-04-03 01:27:06 +00004075 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
4076
Chad Rosier4fe4d732011-09-08 00:38:00 +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
4085void darwin::Compile::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 Dunbar40f12652009-03-29 17:08:39 +00004089 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004090 const Driver &D = getToolChain().getDriver();
Daniel Dunbar40f12652009-03-29 17:08:39 +00004091 ArgStringList CmdArgs;
4092
4093 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4094
Bob Wilson651f3d42012-04-01 23:03:29 +00004095 // Silence warning about unused --serialize-diagnostics
4096 Args.ClaimAllArgs(options::OPT__serialize_diags);
4097
Daniel Dunbar40f12652009-03-29 17:08:39 +00004098 types::ID InputType = Inputs[0].getType();
David Blaikied624a5b2012-04-04 20:43:14 +00004099 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004100 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004101 << A->getAsString(Args) << "-E";
4102
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004103 if (JA.getType() == types::TY_LLVM_IR ||
4104 JA.getType() == types::TY_LTO_IR)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004105 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004106 else if (JA.getType() == types::TY_LLVM_BC ||
4107 JA.getType() == types::TY_LTO_BC)
Daniel Dunbar40f12652009-03-29 17:08:39 +00004108 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004109 else if (Output.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004110 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004111 << getToolChain().getTripleString();
Daniel Dunbarae24a882010-02-11 17:33:45 +00004112 else if (JA.getType() != types::TY_PP_Asm &&
4113 JA.getType() != types::TY_PCH)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004114 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004115 << getTypeName(JA.getType());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004116
4117 ArgStringList OutputArgs;
4118 if (Output.getType() != types::TY_PCH) {
4119 OutputArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004120 if (Output.isNothing())
Daniel Dunbar40f12652009-03-29 17:08:39 +00004121 OutputArgs.push_back("/dev/null");
4122 else
4123 OutputArgs.push_back(Output.getFilename());
4124 }
4125
4126 // There is no need for this level of compatibility, but it makes
4127 // diffing easier.
4128 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4129 Args.hasArg(options::OPT_S));
4130
4131 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004132 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbar40f12652009-03-29 17:08:39 +00004133 if (OutputArgsEarly) {
4134 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4135 } else {
4136 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4137 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4138 }
4139 } else {
4140 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004141
Daniel Dunbar40f12652009-03-29 17:08:39 +00004142 for (InputInfoList::const_iterator
4143 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4144 const InputInfo &II = *it;
4145
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004146 // Reject AST inputs.
4147 if (II.getType() == types::TY_AST) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004148 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004149 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004150 return;
4151 }
4152
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004153 CmdArgs.push_back(II.getFilename());
Daniel Dunbar40f12652009-03-29 17:08:39 +00004154 }
4155
4156 if (OutputArgsEarly) {
4157 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4158 } else {
4159 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4160 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4161 }
4162 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004163
Daniel Dunbar40f12652009-03-29 17:08:39 +00004164 if (Output.getType() == types::TY_PCH) {
4165 assert(Output.isFilename() && "Invalid PCH output.");
4166
4167 CmdArgs.push_back("-o");
4168 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4169 // to be a good reason.
Chad Rosier8c221b82011-08-01 19:58:48 +00004170 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004171 D.GetTemporaryPath("cc", "s"));
Chad Rosier8c221b82011-08-01 19:58:48 +00004172 C.addTempFile(TmpPath);
4173 CmdArgs.push_back(TmpPath);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004174
Eric Christopher88b7cf02011-08-19 00:30:14 +00004175 // If we're emitting a pch file with the last 4 characters of ".pth"
4176 // and falling back to llvm-gcc we want to use ".gch" instead.
4177 std::string OutputFile(Output.getFilename());
4178 size_t loc = OutputFile.rfind(".pth");
4179 if (loc != std::string::npos)
4180 OutputFile.replace(loc, 4, ".gch");
4181 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4182 CmdArgs.push_back(Tmp);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004183 }
Daniel Dunbar40f12652009-03-29 17:08:39 +00004184
Chad Rosier285f9a22011-08-17 18:24:55 +00004185 RemoveCC1UnsupportedArgs(CmdArgs);
4186
Daniel Dunbar40f12652009-03-29 17:08:39 +00004187 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004188 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004189 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004190 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar40f12652009-03-29 17:08:39 +00004191}
4192
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004193void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004194 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004195 const InputInfoList &Inputs,
4196 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004197 const char *LinkingOutput) const {
4198 ArgStringList CmdArgs;
4199
4200 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4201 const InputInfo &Input = Inputs[0];
4202
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004203 // Determine the original source input.
4204 const Action *SourceAction = &JA;
4205 while (SourceAction->getKind() != Action::InputClass) {
4206 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4207 SourceAction = SourceAction->getInputs()[0];
4208 }
4209
4210 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004211 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004212 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004213 if (Args.hasArg(options::OPT_gstabs))
4214 CmdArgs.push_back("--gstabs");
4215 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004216 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004217 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004218
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004219 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004220 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004221
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004222 // Use -force_cpusubtype_ALL on x86 by default.
4223 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4224 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004225 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4226 CmdArgs.push_back("-force_cpusubtype_ALL");
4227
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004228 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004229 (((Args.hasArg(options::OPT_mkernel) ||
4230 Args.hasArg(options::OPT_fapple_kext)) &&
4231 (!getDarwinToolChain().isTargetIPhoneOS() ||
4232 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4233 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004234 CmdArgs.push_back("-static");
4235
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004236 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4237 options::OPT_Xassembler);
4238
4239 assert(Output.isFilename() && "Unexpected lipo output.");
4240 CmdArgs.push_back("-o");
4241 CmdArgs.push_back(Output.getFilename());
4242
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004243 assert(Input.isFilename() && "Invalid input.");
4244 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004245
4246 // asm_final spec is empty.
4247
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004248 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004249 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004250 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004251}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004252
David Blaikie99ba9e32011-12-20 02:48:34 +00004253void darwin::DarwinTool::anchor() {}
4254
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004255void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4256 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004257 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004258
Daniel Dunbar02633b52009-03-26 16:23:12 +00004259 // Derived from darwin_arch spec.
4260 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004261 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004262
Daniel Dunbareeff4062010-01-22 02:04:58 +00004263 // FIXME: Is this needed anymore?
4264 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004265 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004266}
4267
Bill Wendling6acf8b42012-10-02 18:02:50 +00004268bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4269 // We only need to generate a temp path for LTO if we aren't compiling object
4270 // files. When compiling source files, we run 'dsymutil' after linking. We
4271 // don't run 'dsymutil' when compiling object files.
4272 for (InputInfoList::const_iterator
4273 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4274 if (it->getType() != types::TY_Object)
4275 return true;
4276
4277 return false;
4278}
4279
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004280void darwin::Link::AddLinkArgs(Compilation &C,
4281 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004282 ArgStringList &CmdArgs,
4283 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004284 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004285 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004286
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004287 unsigned Version[3] = { 0, 0, 0 };
4288 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4289 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004290 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004291 Version[1], Version[2], HadExtra) ||
4292 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004293 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004294 << A->getAsString(Args);
4295 }
4296
4297 // Newer linkers support -demangle, pass it if supported and not disabled by
4298 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004299 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004300 // Don't pass -demangle to ld_classic.
4301 //
4302 // FIXME: This is a temporary workaround, ld should be handling this.
4303 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4304 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004305 if (getToolChain().getArch() == llvm::Triple::x86) {
4306 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4307 options::OPT_Wl_COMMA),
4308 ie = Args.filtered_end(); it != ie; ++it) {
4309 const Arg *A = *it;
4310 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004311 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004312 UsesLdClassic = true;
4313 }
4314 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004315 if (!UsesLdClassic)
4316 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004317 }
4318
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004319 // If we are using LTO, then automatically create a temporary file path for
4320 // the linker to use, so that it's lifetime will extend past a possible
4321 // dsymutil step.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004322 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004323 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosierfe87fc72011-08-26 21:28:44 +00004324 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004325 C.addTempFile(TmpPath);
4326 CmdArgs.push_back("-object_path_lto");
4327 CmdArgs.push_back(TmpPath);
4328 }
4329
Daniel Dunbar02633b52009-03-26 16:23:12 +00004330 // Derived from the "link" spec.
4331 Args.AddAllArgs(CmdArgs, options::OPT_static);
4332 if (!Args.hasArg(options::OPT_static))
4333 CmdArgs.push_back("-dynamic");
4334 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4335 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4336 // here. How do we wish to handle such things?
4337 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004338
Daniel Dunbar02633b52009-03-26 16:23:12 +00004339 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004340 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004341 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004342 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004343
4344 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4345 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4346 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4347
4348 Arg *A;
4349 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4350 (A = Args.getLastArg(options::OPT_current__version)) ||
4351 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004352 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004353 << A->getAsString(Args) << "-dynamiclib";
4354
4355 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4356 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4357 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4358 } else {
4359 CmdArgs.push_back("-dylib");
4360
4361 Arg *A;
4362 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4363 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4364 (A = Args.getLastArg(options::OPT_client__name)) ||
4365 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4366 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4367 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004368 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004369 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004370
Daniel Dunbar02633b52009-03-26 16:23:12 +00004371 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4372 "-dylib_compatibility_version");
4373 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4374 "-dylib_current_version");
4375
Daniel Dunbara6d38492010-01-22 02:04:52 +00004376 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004377
4378 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4379 "-dylib_install_name");
4380 }
4381
4382 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4383 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4384 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004385 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004386 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004387 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4388 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4389 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4390 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4391 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4392 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004393 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004394 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4395 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4396 Args.AddAllArgs(CmdArgs, options::OPT_init);
4397
Daniel Dunbarce911f52011-04-28 21:23:41 +00004398 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004399 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004400
4401 // If we had an explicit -mios-simulator-version-min argument, honor that,
4402 // otherwise use the traditional deployment targets. We can't just check the
4403 // is-sim attribute because existing code follows this path, and the linker
4404 // may not handle the argument.
4405 //
4406 // FIXME: We may be able to remove this, once we can verify no one depends on
4407 // it.
4408 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4409 CmdArgs.push_back("-ios_simulator_version_min");
4410 else if (DarwinTC.isTargetIPhoneOS())
4411 CmdArgs.push_back("-iphoneos_version_min");
4412 else
4413 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004414 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004415
Daniel Dunbar02633b52009-03-26 16:23:12 +00004416 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4417 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4418 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4419 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4420 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004421
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004422 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4423 options::OPT_fno_pie,
4424 options::OPT_fno_PIE)) {
4425 if (A->getOption().matches(options::OPT_fpie) ||
4426 A->getOption().matches(options::OPT_fPIE))
4427 CmdArgs.push_back("-pie");
4428 else
4429 CmdArgs.push_back("-no_pie");
4430 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004431
4432 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4433 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4434 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4435 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4436 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4437 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4438 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4439 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4440 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4441 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4442 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4443 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4444 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4445 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4446 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4447 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004448
Daniel Dunbarcc957192011-05-02 21:03:47 +00004449 // Give --sysroot= preference, over the Apple specific behavior to also use
4450 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004451 StringRef sysroot = C.getSysRoot();
4452 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004453 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004454 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004455 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4456 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004457 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004458 }
4459
Daniel Dunbar02633b52009-03-26 16:23:12 +00004460 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4461 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4462 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4463 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4464 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004465 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004466 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4467 Args.AddAllArgs(CmdArgs, options::OPT_y);
4468 Args.AddLastArg(CmdArgs, options::OPT_w);
4469 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4470 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4471 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4472 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4473 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4474 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4475 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4476 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4477 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4478 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4479 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4480 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4481}
4482
4483void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004484 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004485 const InputInfoList &Inputs,
4486 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004487 const char *LinkingOutput) const {
4488 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004489
Daniel Dunbar02633b52009-03-26 16:23:12 +00004490 // The logic here is derived from gcc's behavior; most of which
4491 // comes from specs (starting with link_command). Consult gcc for
4492 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004493 ArgStringList CmdArgs;
4494
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004495 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4496 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4497 options::OPT_ccc_arcmt_migrate)) {
4498 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4499 (*I)->claim();
4500 const char *Exec =
4501 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4502 CmdArgs.push_back(Output.getFilename());
4503 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4504 return;
4505 }
4506
Daniel Dunbar02633b52009-03-26 16:23:12 +00004507 // I'm not sure why this particular decomposition exists in gcc, but
4508 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004509 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004510
Daniel Dunbar02633b52009-03-26 16:23:12 +00004511 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4512 Args.AddAllArgs(CmdArgs, options::OPT_s);
4513 Args.AddAllArgs(CmdArgs, options::OPT_t);
4514 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4515 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004516 Args.AddLastArg(CmdArgs, options::OPT_e);
4517 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4518 Args.AddAllArgs(CmdArgs, options::OPT_r);
4519
Daniel Dunbar270073c2010-10-18 22:08:36 +00004520 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4521 // members of static archive libraries which implement Objective-C classes or
4522 // categories.
4523 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4524 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004525
Daniel Dunbar02633b52009-03-26 16:23:12 +00004526 CmdArgs.push_back("-o");
4527 CmdArgs.push_back(Output.getFilename());
4528
Chad Rosier18937312012-05-16 23:45:12 +00004529 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004530 !Args.hasArg(options::OPT_nostartfiles)) {
4531 // Derived from startfile spec.
4532 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004533 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004534 if (getDarwinToolChain().isTargetIOSSimulator()) {
4535 // The simulator doesn't have a versioned crt1 file.
4536 CmdArgs.push_back("-ldylib1.o");
4537 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004538 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4539 CmdArgs.push_back("-ldylib1.o");
4540 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004541 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004542 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004543 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004544 CmdArgs.push_back("-ldylib1.10.5.o");
4545 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004546 } else {
4547 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004548 if (!Args.hasArg(options::OPT_static)) {
4549 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004550 if (getDarwinToolChain().isTargetIOSSimulator()) {
4551 // The simulator doesn't have a versioned crt1 file.
4552 CmdArgs.push_back("-lbundle1.o");
4553 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004554 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4555 CmdArgs.push_back("-lbundle1.o");
4556 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004557 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004558 CmdArgs.push_back("-lbundle1.o");
4559 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004560 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004561 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004562 if (Args.hasArg(options::OPT_pg) &&
4563 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004564 if (Args.hasArg(options::OPT_static) ||
4565 Args.hasArg(options::OPT_object) ||
4566 Args.hasArg(options::OPT_preload)) {
4567 CmdArgs.push_back("-lgcrt0.o");
4568 } else {
4569 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004570
Daniel Dunbar02633b52009-03-26 16:23:12 +00004571 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004572 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004573 // By default on OS X 10.8 and later, we don't link with a crt1.o
4574 // file and the linker knows to use _main as the entry point. But,
4575 // when compiling with -pg, we need to link with the gcrt1.o file,
4576 // so pass the -no_new_main option to tell the linker to use the
4577 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004578 if (getDarwinToolChain().isTargetMacOS() &&
4579 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4580 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004581 } else {
4582 if (Args.hasArg(options::OPT_static) ||
4583 Args.hasArg(options::OPT_object) ||
4584 Args.hasArg(options::OPT_preload)) {
4585 CmdArgs.push_back("-lcrt0.o");
4586 } else {
4587 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004588 if (getDarwinToolChain().isTargetIOSSimulator()) {
4589 // The simulator doesn't have a versioned crt1 file.
4590 CmdArgs.push_back("-lcrt1.o");
4591 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004592 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4593 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004594 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004595 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004596 } else {
4597 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4598 CmdArgs.push_back("-lcrt1.o");
4599 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4600 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004601 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004602 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004603
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004604 // darwin_crt2 spec is empty.
4605 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004606 }
4607 }
4608 }
4609 }
4610
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004611 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4612 Args.hasArg(options::OPT_shared_libgcc) &&
4613 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004614 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004615 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004616 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004617 }
4618 }
4619
4620 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004621
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004622 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4623 // symbols may appear. Mark all of them as dynamic_lookup.
4624 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4625 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4626 options::OPT_fno_address_sanitizer, false)) {
4627 if (Args.hasArg(options::OPT_dynamiclib) ||
4628 Args.hasArg(options::OPT_bundle)) {
4629 CmdArgs.push_back("-undefined");
4630 CmdArgs.push_back("dynamic_lookup");
4631 }
4632 }
4633
Daniel Dunbar02633b52009-03-26 16:23:12 +00004634 if (Args.hasArg(options::OPT_fopenmp))
4635 // This is more complicated in gcc...
4636 CmdArgs.push_back("-lgomp");
4637
Douglas Gregor04e326b2012-05-15 21:00:27 +00004638 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4639
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004640 if (isObjCRuntimeLinked(Args) &&
4641 !Args.hasArg(options::OPT_nostdlib) &&
4642 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004643 // Avoid linking compatibility stubs on i386 mac.
4644 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004645 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004646 // If we don't have ARC or subscripting runtime support, link in the
4647 // runtime stubs. We have to do this *before* adding any of the normal
4648 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004649 ObjCRuntime runtime =
4650 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004651 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004652 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004653 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004654 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004655 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004656 CmdArgs.push_back("-framework");
4657 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004658 // Link libobj.
4659 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004660 }
John McCallf85e1932011-06-15 23:02:42 +00004661
Daniel Dunbar02633b52009-03-26 16:23:12 +00004662 if (LinkingOutput) {
4663 CmdArgs.push_back("-arch_multiple");
4664 CmdArgs.push_back("-final_output");
4665 CmdArgs.push_back(LinkingOutput);
4666 }
4667
Daniel Dunbar02633b52009-03-26 16:23:12 +00004668 if (Args.hasArg(options::OPT_fnested_functions))
4669 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004670
Daniel Dunbar02633b52009-03-26 16:23:12 +00004671 if (!Args.hasArg(options::OPT_nostdlib) &&
4672 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004673 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004674 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004675
Daniel Dunbar02633b52009-03-26 16:23:12 +00004676 // link_ssp spec is empty.
4677
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004678 // Let the tool chain choose which runtime library to link.
4679 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004680 }
4681
Chad Rosier18937312012-05-16 23:45:12 +00004682 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004683 !Args.hasArg(options::OPT_nostartfiles)) {
4684 // endfile_spec is empty.
4685 }
4686
4687 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4688 Args.AddAllArgs(CmdArgs, options::OPT_F);
4689
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004690 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004691 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004692 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004693}
4694
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004695void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004696 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004697 const InputInfoList &Inputs,
4698 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004699 const char *LinkingOutput) const {
4700 ArgStringList CmdArgs;
4701
4702 CmdArgs.push_back("-create");
4703 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004704
4705 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004706 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004707
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004708 for (InputInfoList::const_iterator
4709 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4710 const InputInfo &II = *it;
4711 assert(II.isFilename() && "Unexpected lipo input.");
4712 CmdArgs.push_back(II.getFilename());
4713 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004714 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004715 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004716 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004717}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004718
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004719void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004720 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004721 const InputInfoList &Inputs,
4722 const ArgList &Args,
4723 const char *LinkingOutput) const {
4724 ArgStringList CmdArgs;
4725
Daniel Dunbar03e92302011-05-09 17:23:16 +00004726 CmdArgs.push_back("-o");
4727 CmdArgs.push_back(Output.getFilename());
4728
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004729 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4730 const InputInfo &Input = Inputs[0];
4731 assert(Input.isFilename() && "Unexpected dsymutil input.");
4732 CmdArgs.push_back(Input.getFilename());
4733
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004734 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004735 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004736 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004737}
4738
Eric Christopherf8571862011-08-23 17:56:55 +00004739void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4740 const InputInfo &Output,
4741 const InputInfoList &Inputs,
4742 const ArgList &Args,
4743 const char *LinkingOutput) const {
4744 ArgStringList CmdArgs;
4745 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004746 CmdArgs.push_back("--debug-info");
4747 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004748 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004749
4750 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4751 const InputInfo &Input = Inputs[0];
4752 assert(Input.isFilename() && "Unexpected verify input");
4753
4754 // Grabbing the output of the earlier dsymutil run.
4755 CmdArgs.push_back(Input.getFilename());
4756
4757 const char *Exec =
4758 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4759 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4760}
4761
David Chisnall31c46902012-02-15 13:39:01 +00004762void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4763 const InputInfo &Output,
4764 const InputInfoList &Inputs,
4765 const ArgList &Args,
4766 const char *LinkingOutput) const {
4767 ArgStringList CmdArgs;
4768
4769 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4770 options::OPT_Xassembler);
4771
4772 CmdArgs.push_back("-o");
4773 CmdArgs.push_back(Output.getFilename());
4774
4775 for (InputInfoList::const_iterator
4776 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4777 const InputInfo &II = *it;
4778 CmdArgs.push_back(II.getFilename());
4779 }
4780
4781 const char *Exec =
4782 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4783 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4784}
4785
4786
4787void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4788 const InputInfo &Output,
4789 const InputInfoList &Inputs,
4790 const ArgList &Args,
4791 const char *LinkingOutput) const {
4792 // FIXME: Find a real GCC, don't hard-code versions here
4793 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4794 const llvm::Triple &T = getToolChain().getTriple();
4795 std::string LibPath = "/usr/lib/";
4796 llvm::Triple::ArchType Arch = T.getArch();
4797 switch (Arch) {
4798 case llvm::Triple::x86:
4799 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4800 T.getOSName()).str() + "/4.5.2/";
4801 break;
4802 case llvm::Triple::x86_64:
4803 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4804 T.getOSName()).str();
4805 GCCLibPath += "/4.5.2/amd64/";
4806 LibPath += "amd64/";
4807 break;
4808 default:
4809 assert(0 && "Unsupported architecture");
4810 }
4811
4812 ArgStringList CmdArgs;
4813
David Chisnall41d476d2012-02-29 15:06:12 +00004814 // Demangle C++ names in errors
4815 CmdArgs.push_back("-C");
4816
David Chisnall31c46902012-02-15 13:39:01 +00004817 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4818 (!Args.hasArg(options::OPT_shared))) {
4819 CmdArgs.push_back("-e");
4820 CmdArgs.push_back("_start");
4821 }
4822
4823 if (Args.hasArg(options::OPT_static)) {
4824 CmdArgs.push_back("-Bstatic");
4825 CmdArgs.push_back("-dn");
4826 } else {
4827 CmdArgs.push_back("-Bdynamic");
4828 if (Args.hasArg(options::OPT_shared)) {
4829 CmdArgs.push_back("-shared");
4830 } else {
4831 CmdArgs.push_back("--dynamic-linker");
4832 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4833 }
4834 }
4835
4836 if (Output.isFilename()) {
4837 CmdArgs.push_back("-o");
4838 CmdArgs.push_back(Output.getFilename());
4839 } else {
4840 assert(Output.isNothing() && "Invalid output.");
4841 }
4842
4843 if (!Args.hasArg(options::OPT_nostdlib) &&
4844 !Args.hasArg(options::OPT_nostartfiles)) {
4845 if (!Args.hasArg(options::OPT_shared)) {
4846 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4847 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004848 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004849 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4850 } else {
4851 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004852 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4853 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004854 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004855 if (getToolChain().getDriver().CCCIsCXX)
4856 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004857 }
4858
4859 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4860
4861 Args.AddAllArgs(CmdArgs, options::OPT_L);
4862 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4863 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00004864 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00004865
4866 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4867
4868 if (!Args.hasArg(options::OPT_nostdlib) &&
4869 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00004870 if (getToolChain().getDriver().CCCIsCXX)
4871 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00004872 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00004873 if (!Args.hasArg(options::OPT_shared)) {
4874 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00004875 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00004876 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00004877 }
David Chisnall31c46902012-02-15 13:39:01 +00004878 }
4879
4880 if (!Args.hasArg(options::OPT_nostdlib) &&
4881 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00004882 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004883 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00004884 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004885
4886 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4887
4888 const char *Exec =
4889 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4890 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4891}
4892
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004893void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004894 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004895 const InputInfoList &Inputs,
4896 const ArgList &Args,
4897 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004898 ArgStringList CmdArgs;
4899
4900 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4901 options::OPT_Xassembler);
4902
4903 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004904 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004905
4906 for (InputInfoList::const_iterator
4907 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4908 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004909 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004910 }
4911
4912 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004913 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004914 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004915}
4916
4917void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004918 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004919 const InputInfoList &Inputs,
4920 const ArgList &Args,
4921 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004922 ArgStringList CmdArgs;
4923
4924 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004925 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004926 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004927 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004928 }
4929
4930 if (Args.hasArg(options::OPT_static)) {
4931 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004932 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004933 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004934// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004935 CmdArgs.push_back("-Bdynamic");
4936 if (Args.hasArg(options::OPT_shared)) {
4937 CmdArgs.push_back("-shared");
4938 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00004939 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004940 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4941 }
4942 }
4943
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004944 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004945 CmdArgs.push_back("-o");
4946 CmdArgs.push_back(Output.getFilename());
4947 } else {
4948 assert(Output.isNothing() && "Invalid output.");
4949 }
4950
4951 if (!Args.hasArg(options::OPT_nostdlib) &&
4952 !Args.hasArg(options::OPT_nostartfiles)) {
4953 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00004954 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004955 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004956 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004957 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004958 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004959 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004960 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004961 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004962 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004963 }
Chris Lattner38e317d2010-07-07 16:01:42 +00004964 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004965 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004966 }
4967
Daniel Dunbar294691e2009-11-04 06:24:38 +00004968 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4969 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004970 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004971
4972 Args.AddAllArgs(CmdArgs, options::OPT_L);
4973 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4974 Args.AddAllArgs(CmdArgs, options::OPT_e);
4975
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004976 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004977
4978 if (!Args.hasArg(options::OPT_nostdlib) &&
4979 !Args.hasArg(options::OPT_nodefaultlibs)) {
4980 // FIXME: For some reason GCC passes -lgcc before adding
4981 // the default system libraries. Just mimic this for now.
4982 CmdArgs.push_back("-lgcc");
4983
4984 if (Args.hasArg(options::OPT_pthread))
4985 CmdArgs.push_back("-pthread");
4986 if (!Args.hasArg(options::OPT_shared))
4987 CmdArgs.push_back("-lc");
4988 CmdArgs.push_back("-lgcc");
4989 }
4990
4991 if (!Args.hasArg(options::OPT_nostdlib) &&
4992 !Args.hasArg(options::OPT_nostartfiles)) {
4993 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004994 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004995 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004996 }
4997
Bill Wendling3f4be6f2011-06-27 19:15:03 +00004998 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00004999
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005000 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005001 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005002 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005003}
5004
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005005void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005006 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005007 const InputInfoList &Inputs,
5008 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005009 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005010 ArgStringList CmdArgs;
5011
5012 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5013 options::OPT_Xassembler);
5014
5015 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005016 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005017
5018 for (InputInfoList::const_iterator
5019 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5020 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005021 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005022 }
5023
5024 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005025 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005026 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005027}
5028
5029void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005030 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005031 const InputInfoList &Inputs,
5032 const ArgList &Args,
5033 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005034 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005035 ArgStringList CmdArgs;
5036
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005037 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005038 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005039 CmdArgs.push_back("-e");
5040 CmdArgs.push_back("__start");
5041 }
5042
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005043 if (Args.hasArg(options::OPT_static)) {
5044 CmdArgs.push_back("-Bstatic");
5045 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005046 if (Args.hasArg(options::OPT_rdynamic))
5047 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005048 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005049 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005050 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005051 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005052 } else {
5053 CmdArgs.push_back("-dynamic-linker");
5054 CmdArgs.push_back("/usr/libexec/ld.so");
5055 }
5056 }
5057
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005058 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005059 CmdArgs.push_back("-o");
5060 CmdArgs.push_back(Output.getFilename());
5061 } else {
5062 assert(Output.isNothing() && "Invalid output.");
5063 }
5064
5065 if (!Args.hasArg(options::OPT_nostdlib) &&
5066 !Args.hasArg(options::OPT_nostartfiles)) {
5067 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005068 if (Args.hasArg(options::OPT_pg))
5069 CmdArgs.push_back(Args.MakeArgString(
5070 getToolChain().GetFilePath("gcrt0.o")));
5071 else
5072 CmdArgs.push_back(Args.MakeArgString(
5073 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005074 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005075 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005076 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005077 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005078 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005079 }
5080 }
5081
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005082 std::string Triple = getToolChain().getTripleString();
5083 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005084 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005085 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005086 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005087
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005088 Args.AddAllArgs(CmdArgs, options::OPT_L);
5089 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5090 Args.AddAllArgs(CmdArgs, options::OPT_e);
5091
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005092 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005093
5094 if (!Args.hasArg(options::OPT_nostdlib) &&
5095 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00005096 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005097 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005098 if (Args.hasArg(options::OPT_pg))
5099 CmdArgs.push_back("-lm_p");
5100 else
5101 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005102 }
5103
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005104 // FIXME: For some reason GCC passes -lgcc before adding
5105 // the default system libraries. Just mimic this for now.
5106 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005107
Eric Christopherdc6cc872012-09-13 06:32:34 +00005108 if (Args.hasArg(options::OPT_pthread)) {
5109 if (!Args.hasArg(options::OPT_shared) &&
5110 Args.hasArg(options::OPT_pg))
5111 CmdArgs.push_back("-lpthread_p");
5112 else
5113 CmdArgs.push_back("-lpthread");
5114 }
5115
Chandler Carruth657849c2011-12-17 22:32:42 +00005116 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005117 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005118 CmdArgs.push_back("-lc_p");
5119 else
5120 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005121 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005122
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005123 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005124 }
5125
5126 if (!Args.hasArg(options::OPT_nostdlib) &&
5127 !Args.hasArg(options::OPT_nostartfiles)) {
5128 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005129 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005130 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005131 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005132 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005133 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005134 }
5135
5136 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005137 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005138 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005139}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005140
Eli Friedman42f74f22012-08-08 23:57:20 +00005141void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5142 const InputInfo &Output,
5143 const InputInfoList &Inputs,
5144 const ArgList &Args,
5145 const char *LinkingOutput) const {
5146 ArgStringList CmdArgs;
5147
5148 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5149 options::OPT_Xassembler);
5150
5151 CmdArgs.push_back("-o");
5152 CmdArgs.push_back(Output.getFilename());
5153
5154 for (InputInfoList::const_iterator
5155 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5156 const InputInfo &II = *it;
5157 CmdArgs.push_back(II.getFilename());
5158 }
5159
5160 const char *Exec =
5161 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5162 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5163}
5164
5165void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5166 const InputInfo &Output,
5167 const InputInfoList &Inputs,
5168 const ArgList &Args,
5169 const char *LinkingOutput) const {
5170 const Driver &D = getToolChain().getDriver();
5171 ArgStringList CmdArgs;
5172
5173 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5174 (!Args.hasArg(options::OPT_shared))) {
5175 CmdArgs.push_back("-e");
5176 CmdArgs.push_back("__start");
5177 }
5178
5179 if (Args.hasArg(options::OPT_static)) {
5180 CmdArgs.push_back("-Bstatic");
5181 } else {
5182 if (Args.hasArg(options::OPT_rdynamic))
5183 CmdArgs.push_back("-export-dynamic");
5184 CmdArgs.push_back("--eh-frame-hdr");
5185 CmdArgs.push_back("-Bdynamic");
5186 if (Args.hasArg(options::OPT_shared)) {
5187 CmdArgs.push_back("-shared");
5188 } else {
5189 CmdArgs.push_back("-dynamic-linker");
5190 CmdArgs.push_back("/usr/libexec/ld.so");
5191 }
5192 }
5193
5194 if (Output.isFilename()) {
5195 CmdArgs.push_back("-o");
5196 CmdArgs.push_back(Output.getFilename());
5197 } else {
5198 assert(Output.isNothing() && "Invalid output.");
5199 }
5200
5201 if (!Args.hasArg(options::OPT_nostdlib) &&
5202 !Args.hasArg(options::OPT_nostartfiles)) {
5203 if (!Args.hasArg(options::OPT_shared)) {
5204 if (Args.hasArg(options::OPT_pg))
5205 CmdArgs.push_back(Args.MakeArgString(
5206 getToolChain().GetFilePath("gcrt0.o")));
5207 else
5208 CmdArgs.push_back(Args.MakeArgString(
5209 getToolChain().GetFilePath("crt0.o")));
5210 CmdArgs.push_back(Args.MakeArgString(
5211 getToolChain().GetFilePath("crtbegin.o")));
5212 } else {
5213 CmdArgs.push_back(Args.MakeArgString(
5214 getToolChain().GetFilePath("crtbeginS.o")));
5215 }
5216 }
5217
5218 Args.AddAllArgs(CmdArgs, options::OPT_L);
5219 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5220 Args.AddAllArgs(CmdArgs, options::OPT_e);
5221
5222 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5223
5224 if (!Args.hasArg(options::OPT_nostdlib) &&
5225 !Args.hasArg(options::OPT_nodefaultlibs)) {
5226 if (D.CCCIsCXX) {
5227 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5228 if (Args.hasArg(options::OPT_pg))
5229 CmdArgs.push_back("-lm_p");
5230 else
5231 CmdArgs.push_back("-lm");
5232 }
5233
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005234 if (Args.hasArg(options::OPT_pthread)) {
5235 if (!Args.hasArg(options::OPT_shared) &&
5236 Args.hasArg(options::OPT_pg))
5237 CmdArgs.push_back("-lpthread_p");
5238 else
5239 CmdArgs.push_back("-lpthread");
5240 }
5241
Eli Friedman42f74f22012-08-08 23:57:20 +00005242 if (!Args.hasArg(options::OPT_shared)) {
5243 if (Args.hasArg(options::OPT_pg))
5244 CmdArgs.push_back("-lc_p");
5245 else
5246 CmdArgs.push_back("-lc");
5247 }
5248
5249 std::string myarch = "-lclang_rt.";
5250 const llvm::Triple &T = getToolChain().getTriple();
5251 llvm::Triple::ArchType Arch = T.getArch();
5252 switch (Arch) {
5253 case llvm::Triple::arm:
5254 myarch += ("arm");
5255 break;
5256 case llvm::Triple::x86:
5257 myarch += ("i386");
5258 break;
5259 case llvm::Triple::x86_64:
5260 myarch += ("amd64");
5261 break;
5262 default:
5263 assert(0 && "Unsupported architecture");
5264 }
5265 CmdArgs.push_back(Args.MakeArgString(myarch));
5266 }
5267
5268 if (!Args.hasArg(options::OPT_nostdlib) &&
5269 !Args.hasArg(options::OPT_nostartfiles)) {
5270 if (!Args.hasArg(options::OPT_shared))
5271 CmdArgs.push_back(Args.MakeArgString(
5272 getToolChain().GetFilePath("crtend.o")));
5273 else
5274 CmdArgs.push_back(Args.MakeArgString(
5275 getToolChain().GetFilePath("crtendS.o")));
5276 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005277
5278 const char *Exec =
5279 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5280 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005281}
5282
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005283void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005284 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005285 const InputInfoList &Inputs,
5286 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005287 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005288 ArgStringList CmdArgs;
5289
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005290 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5291 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005292 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005293 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005294 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005295 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005296 else if (getToolChain().getArch() == llvm::Triple::mips ||
5297 getToolChain().getArch() == llvm::Triple::mipsel ||
5298 getToolChain().getArch() == llvm::Triple::mips64 ||
5299 getToolChain().getArch() == llvm::Triple::mips64el) {
5300 StringRef CPUName;
5301 StringRef ABIName;
5302 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005303
Eric Christopherc55da4b2012-09-05 21:32:44 +00005304 CmdArgs.push_back("-march");
5305 CmdArgs.push_back(CPUName.data());
5306
5307 // Convert ABI name to the GNU tools acceptable variant.
5308 if (ABIName == "o32")
5309 ABIName = "32";
5310 else if (ABIName == "n64")
5311 ABIName = "64";
5312
5313 CmdArgs.push_back("-mabi");
5314 CmdArgs.push_back(ABIName.data());
5315
5316 if (getToolChain().getArch() == llvm::Triple::mips ||
5317 getToolChain().getArch() == llvm::Triple::mips64)
5318 CmdArgs.push_back("-EB");
5319 else
5320 CmdArgs.push_back("-EL");
5321
5322 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5323 options::OPT_fpic, options::OPT_fno_pic,
5324 options::OPT_fPIE, options::OPT_fno_PIE,
5325 options::OPT_fpie, options::OPT_fno_pie);
5326 if (LastPICArg &&
5327 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5328 LastPICArg->getOption().matches(options::OPT_fpic) ||
5329 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5330 LastPICArg->getOption().matches(options::OPT_fpie))) {
5331 CmdArgs.push_back("-KPIC");
5332 }
5333 }
Eric Christophered734732010-03-02 02:41:08 +00005334
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005335 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5336 options::OPT_Xassembler);
5337
5338 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005339 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005340
5341 for (InputInfoList::const_iterator
5342 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5343 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005344 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005345 }
5346
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005347 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005348 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005349 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005350}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005351
5352void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005353 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005354 const InputInfoList &Inputs,
5355 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005356 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005357 const toolchains::FreeBSD& ToolChain =
5358 static_cast<const toolchains::FreeBSD&>(getToolChain());
5359 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005360 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005361
5362 // Silence warning for "clang -g foo.o -o foo"
5363 Args.ClaimAllArgs(options::OPT_g_Group);
5364 // and "clang -emit-llvm foo.o -o foo"
5365 Args.ClaimAllArgs(options::OPT_emit_llvm);
5366 // and for "clang -w foo.o -o foo". Other warning options are already
5367 // handled somewhere else.
5368 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005369
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005370 if (!D.SysRoot.empty())
5371 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5372
Roman Divacky94380162012-08-28 15:09:03 +00005373 if (Args.hasArg(options::OPT_pie))
5374 CmdArgs.push_back("-pie");
5375
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005376 if (Args.hasArg(options::OPT_static)) {
5377 CmdArgs.push_back("-Bstatic");
5378 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005379 if (Args.hasArg(options::OPT_rdynamic))
5380 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005381 CmdArgs.push_back("--eh-frame-hdr");
5382 if (Args.hasArg(options::OPT_shared)) {
5383 CmdArgs.push_back("-Bshareable");
5384 } else {
5385 CmdArgs.push_back("-dynamic-linker");
5386 CmdArgs.push_back("/libexec/ld-elf.so.1");
5387 }
Roman Divacky94380162012-08-28 15:09:03 +00005388 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5389 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005390 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5391 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5392 CmdArgs.push_back("--hash-style=both");
5393 }
5394 }
5395 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005396 }
5397
5398 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5399 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005400 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005401 CmdArgs.push_back("-m");
5402 CmdArgs.push_back("elf_i386_fbsd");
5403 }
5404
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005405 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005406 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005407 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005408 }
5409
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005410 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005411 CmdArgs.push_back("-o");
5412 CmdArgs.push_back(Output.getFilename());
5413 } else {
5414 assert(Output.isNothing() && "Invalid output.");
5415 }
5416
5417 if (!Args.hasArg(options::OPT_nostdlib) &&
5418 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005419 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005420 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005421 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005422 crt1 = "gcrt1.o";
5423 else if (Args.hasArg(options::OPT_pie))
5424 crt1 = "Scrt1.o";
5425 else
5426 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005427 }
Roman Divacky94380162012-08-28 15:09:03 +00005428 if (crt1)
5429 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5430
5431 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5432
5433 const char *crtbegin = NULL;
5434 if (Args.hasArg(options::OPT_static))
5435 crtbegin = "crtbeginT.o";
5436 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5437 crtbegin = "crtbeginS.o";
5438 else
5439 crtbegin = "crtbegin.o";
5440
5441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005442 }
5443
5444 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005445 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005446 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5447 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005448 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005449 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5450 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005451 Args.AddAllArgs(CmdArgs, options::OPT_s);
5452 Args.AddAllArgs(CmdArgs, options::OPT_t);
5453 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5454 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005455
Roman Divacky94380162012-08-28 15:09:03 +00005456 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005457
5458 if (!Args.hasArg(options::OPT_nostdlib) &&
5459 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005460 if (D.CCCIsCXX) {
Roman Divacky94380162012-08-28 15:09:03 +00005461 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005462 if (Args.hasArg(options::OPT_pg))
5463 CmdArgs.push_back("-lm_p");
5464 else
5465 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005466 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005467 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5468 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005469 if (Args.hasArg(options::OPT_pg))
5470 CmdArgs.push_back("-lgcc_p");
5471 else
5472 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005473 if (Args.hasArg(options::OPT_static)) {
5474 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005475 } else if (Args.hasArg(options::OPT_pg)) {
5476 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005477 } else {
5478 CmdArgs.push_back("--as-needed");
5479 CmdArgs.push_back("-lgcc_s");
5480 CmdArgs.push_back("--no-as-needed");
5481 }
5482
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005483 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005484 if (Args.hasArg(options::OPT_pg))
5485 CmdArgs.push_back("-lpthread_p");
5486 else
5487 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005488 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005489
Roman Divackyc16bb762011-02-10 16:59:40 +00005490 if (Args.hasArg(options::OPT_pg)) {
5491 if (Args.hasArg(options::OPT_shared))
5492 CmdArgs.push_back("-lc");
5493 else
5494 CmdArgs.push_back("-lc_p");
5495 CmdArgs.push_back("-lgcc_p");
5496 } else {
5497 CmdArgs.push_back("-lc");
5498 CmdArgs.push_back("-lgcc");
5499 }
5500
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005501 if (Args.hasArg(options::OPT_static)) {
5502 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005503 } else if (Args.hasArg(options::OPT_pg)) {
5504 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005505 } else {
5506 CmdArgs.push_back("--as-needed");
5507 CmdArgs.push_back("-lgcc_s");
5508 CmdArgs.push_back("--no-as-needed");
5509 }
5510 }
5511
5512 if (!Args.hasArg(options::OPT_nostdlib) &&
5513 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005514 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005515 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005516 else
5517 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005518 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005519 }
5520
Roman Divacky94380162012-08-28 15:09:03 +00005521 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005522
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005523 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005524 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005525 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005526}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005527
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005528void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5529 const InputInfo &Output,
5530 const InputInfoList &Inputs,
5531 const ArgList &Args,
5532 const char *LinkingOutput) const {
5533 ArgStringList CmdArgs;
5534
5535 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5536 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005537 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005538 CmdArgs.push_back("--32");
5539
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005540 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005541 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005542 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005543 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005544 CmdArgs.push_back("-EL");
5545
5546 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5547 options::OPT_Xassembler);
5548
5549 CmdArgs.push_back("-o");
5550 CmdArgs.push_back(Output.getFilename());
5551
5552 for (InputInfoList::const_iterator
5553 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5554 const InputInfo &II = *it;
5555 CmdArgs.push_back(II.getFilename());
5556 }
5557
David Chisnall5adcec12011-09-27 22:03:18 +00005558 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005559 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5560}
5561
5562void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5563 const InputInfo &Output,
5564 const InputInfoList &Inputs,
5565 const ArgList &Args,
5566 const char *LinkingOutput) const {
5567 const Driver &D = getToolChain().getDriver();
5568 ArgStringList CmdArgs;
5569
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005570 if (!D.SysRoot.empty())
5571 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5572
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005573 if (Args.hasArg(options::OPT_static)) {
5574 CmdArgs.push_back("-Bstatic");
5575 } else {
5576 if (Args.hasArg(options::OPT_rdynamic))
5577 CmdArgs.push_back("-export-dynamic");
5578 CmdArgs.push_back("--eh-frame-hdr");
5579 if (Args.hasArg(options::OPT_shared)) {
5580 CmdArgs.push_back("-Bshareable");
5581 } else {
5582 CmdArgs.push_back("-dynamic-linker");
5583 CmdArgs.push_back("/libexec/ld.elf_so");
5584 }
5585 }
5586
5587 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5588 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005589 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005590 CmdArgs.push_back("-m");
5591 CmdArgs.push_back("elf_i386");
5592 }
5593
5594 if (Output.isFilename()) {
5595 CmdArgs.push_back("-o");
5596 CmdArgs.push_back(Output.getFilename());
5597 } else {
5598 assert(Output.isNothing() && "Invalid output.");
5599 }
5600
5601 if (!Args.hasArg(options::OPT_nostdlib) &&
5602 !Args.hasArg(options::OPT_nostartfiles)) {
5603 if (!Args.hasArg(options::OPT_shared)) {
5604 CmdArgs.push_back(Args.MakeArgString(
5605 getToolChain().GetFilePath("crt0.o")));
5606 CmdArgs.push_back(Args.MakeArgString(
5607 getToolChain().GetFilePath("crti.o")));
5608 CmdArgs.push_back(Args.MakeArgString(
5609 getToolChain().GetFilePath("crtbegin.o")));
5610 } else {
5611 CmdArgs.push_back(Args.MakeArgString(
5612 getToolChain().GetFilePath("crti.o")));
5613 CmdArgs.push_back(Args.MakeArgString(
5614 getToolChain().GetFilePath("crtbeginS.o")));
5615 }
5616 }
5617
5618 Args.AddAllArgs(CmdArgs, options::OPT_L);
5619 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5620 Args.AddAllArgs(CmdArgs, options::OPT_e);
5621 Args.AddAllArgs(CmdArgs, options::OPT_s);
5622 Args.AddAllArgs(CmdArgs, options::OPT_t);
5623 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5624 Args.AddAllArgs(CmdArgs, options::OPT_r);
5625
5626 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5627
5628 if (!Args.hasArg(options::OPT_nostdlib) &&
5629 !Args.hasArg(options::OPT_nodefaultlibs)) {
5630 if (D.CCCIsCXX) {
5631 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5632 CmdArgs.push_back("-lm");
5633 }
5634 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5635 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005636 if (Args.hasArg(options::OPT_static)) {
5637 CmdArgs.push_back("-lgcc_eh");
5638 } else {
5639 CmdArgs.push_back("--as-needed");
5640 CmdArgs.push_back("-lgcc_s");
5641 CmdArgs.push_back("--no-as-needed");
5642 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005643 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005644
5645 if (Args.hasArg(options::OPT_pthread))
5646 CmdArgs.push_back("-lpthread");
5647 CmdArgs.push_back("-lc");
5648
5649 CmdArgs.push_back("-lgcc");
5650 if (Args.hasArg(options::OPT_static)) {
5651 CmdArgs.push_back("-lgcc_eh");
5652 } else {
5653 CmdArgs.push_back("--as-needed");
5654 CmdArgs.push_back("-lgcc_s");
5655 CmdArgs.push_back("--no-as-needed");
5656 }
5657 }
5658
5659 if (!Args.hasArg(options::OPT_nostdlib) &&
5660 !Args.hasArg(options::OPT_nostartfiles)) {
5661 if (!Args.hasArg(options::OPT_shared))
5662 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5663 "crtend.o")));
5664 else
5665 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5666 "crtendS.o")));
5667 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5668 "crtn.o")));
5669 }
5670
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005671 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005672
David Chisnall5adcec12011-09-27 22:03:18 +00005673 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005674 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5675}
5676
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005677void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5678 const InputInfo &Output,
5679 const InputInfoList &Inputs,
5680 const ArgList &Args,
5681 const char *LinkingOutput) const {
5682 ArgStringList CmdArgs;
5683
5684 // Add --32/--64 to make sure we get the format we want.
5685 // This is incomplete
5686 if (getToolChain().getArch() == llvm::Triple::x86) {
5687 CmdArgs.push_back("--32");
5688 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5689 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005690 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5691 CmdArgs.push_back("-a32");
5692 CmdArgs.push_back("-mppc");
5693 CmdArgs.push_back("-many");
5694 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5695 CmdArgs.push_back("-a64");
5696 CmdArgs.push_back("-mppc64");
5697 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005698 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005699 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005700 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5701 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005702
5703 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5704 getToolChain().getTriple());
5705 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005706
5707 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5708 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5709 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005710 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5711 getToolChain().getArch() == llvm::Triple::mipsel ||
5712 getToolChain().getArch() == llvm::Triple::mips64 ||
5713 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005714 StringRef CPUName;
5715 StringRef ABIName;
5716 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005717
Simon Atanasyan073a7802012-04-07 22:31:29 +00005718 CmdArgs.push_back("-march");
5719 CmdArgs.push_back(CPUName.data());
5720
5721 // Convert ABI name to the GNU tools acceptable variant.
5722 if (ABIName == "o32")
5723 ABIName = "32";
5724 else if (ABIName == "n64")
5725 ABIName = "64";
5726
5727 CmdArgs.push_back("-mabi");
5728 CmdArgs.push_back(ABIName.data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005729
5730 if (getToolChain().getArch() == llvm::Triple::mips ||
5731 getToolChain().getArch() == llvm::Triple::mips64)
5732 CmdArgs.push_back("-EB");
5733 else
5734 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005735
5736 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5737 options::OPT_fpic, options::OPT_fno_pic,
5738 options::OPT_fPIE, options::OPT_fno_PIE,
5739 options::OPT_fpie, options::OPT_fno_pie);
5740 if (LastPICArg &&
5741 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5742 LastPICArg->getOption().matches(options::OPT_fpic) ||
5743 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5744 LastPICArg->getOption().matches(options::OPT_fpie))) {
5745 CmdArgs.push_back("-KPIC");
5746 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005747 }
5748
5749 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5750 options::OPT_Xassembler);
5751
5752 CmdArgs.push_back("-o");
5753 CmdArgs.push_back(Output.getFilename());
5754
5755 for (InputInfoList::const_iterator
5756 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5757 const InputInfo &II = *it;
5758 CmdArgs.push_back(II.getFilename());
5759 }
5760
5761 const char *Exec =
5762 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5763 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5764}
5765
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005766static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5767 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005768 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005769 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005770 Args.hasArg(options::OPT_static_libgcc);
5771 if (!D.CCCIsCXX)
5772 CmdArgs.push_back("-lgcc");
5773
5774 if (StaticLibgcc) {
5775 if (D.CCCIsCXX)
5776 CmdArgs.push_back("-lgcc");
5777 } else {
5778 if (!D.CCCIsCXX)
5779 CmdArgs.push_back("--as-needed");
5780 CmdArgs.push_back("-lgcc_s");
5781 if (!D.CCCIsCXX)
5782 CmdArgs.push_back("--no-as-needed");
5783 }
5784
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005785 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005786 CmdArgs.push_back("-lgcc_eh");
5787 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5788 CmdArgs.push_back("-lgcc");
5789}
5790
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005791static bool hasMipsN32ABIArg(const ArgList &Args) {
5792 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00005793 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005794}
5795
Rafael Espindolac1da9812010-11-07 20:14:31 +00005796void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5797 const InputInfo &Output,
5798 const InputInfoList &Inputs,
5799 const ArgList &Args,
5800 const char *LinkingOutput) const {
5801 const toolchains::Linux& ToolChain =
5802 static_cast<const toolchains::Linux&>(getToolChain());
5803 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005804 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chien94a71422012-09-02 09:30:11 +00005805 llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005806
Rafael Espindolac1da9812010-11-07 20:14:31 +00005807 ArgStringList CmdArgs;
5808
Rafael Espindola26f14c32010-11-15 18:28:16 +00005809 // Silence warning for "clang -g foo.o -o foo"
5810 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005811 // and "clang -emit-llvm foo.o -o foo"
5812 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00005813 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00005814 // handled somewhere else.
5815 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00005816
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005817 if (!D.SysRoot.empty())
5818 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005819
Rafael Espindolafdda1712010-11-17 22:26:15 +00005820 if (Args.hasArg(options::OPT_pie))
5821 CmdArgs.push_back("-pie");
5822
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00005823 if (Args.hasArg(options::OPT_rdynamic))
5824 CmdArgs.push_back("-export-dynamic");
5825
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00005826 if (Args.hasArg(options::OPT_s))
5827 CmdArgs.push_back("-s");
5828
Rafael Espindolac1da9812010-11-07 20:14:31 +00005829 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5830 e = ToolChain.ExtraOpts.end();
5831 i != e; ++i)
5832 CmdArgs.push_back(i->c_str());
5833
5834 if (!Args.hasArg(options::OPT_static)) {
5835 CmdArgs.push_back("--eh-frame-hdr");
5836 }
5837
5838 CmdArgs.push_back("-m");
5839 if (ToolChain.getArch() == llvm::Triple::x86)
5840 CmdArgs.push_back("elf_i386");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005841 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00005842 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005843 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005844 else if (ToolChain.getArch() == llvm::Triple::ppc)
5845 CmdArgs.push_back("elf32ppclinux");
5846 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5847 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00005848 else if (ToolChain.getArch() == llvm::Triple::mips)
5849 CmdArgs.push_back("elf32btsmip");
5850 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5851 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005852 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5853 if (hasMipsN32ABIArg(Args))
5854 CmdArgs.push_back("elf32btsmipn32");
5855 else
5856 CmdArgs.push_back("elf64btsmip");
5857 }
5858 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5859 if (hasMipsN32ABIArg(Args))
5860 CmdArgs.push_back("elf32ltsmipn32");
5861 else
5862 CmdArgs.push_back("elf64ltsmip");
5863 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005864 else
5865 CmdArgs.push_back("elf_x86_64");
5866
5867 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00005868 if (ToolChain.getArch() == llvm::Triple::arm
5869 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005870 CmdArgs.push_back("-Bstatic");
5871 else
5872 CmdArgs.push_back("-static");
5873 } else if (Args.hasArg(options::OPT_shared)) {
5874 CmdArgs.push_back("-shared");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005875 if ((ToolChain.getArch() == llvm::Triple::arm
5876 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5877 CmdArgs.push_back("-Bsymbolic");
5878 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005879 }
5880
5881 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00005882 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00005883 (!Args.hasArg(options::OPT_static) &&
5884 !Args.hasArg(options::OPT_shared))) {
5885 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005886 if (isAndroid)
5887 CmdArgs.push_back("/system/bin/linker");
5888 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005889 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregorf0594d82011-03-06 19:11:49 +00005890 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liu6cc9dc82012-07-30 11:05:56 +00005891 ToolChain.getArch() == llvm::Triple::thumb) {
5892 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5893 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5894 else
5895 CmdArgs.push_back("/lib/ld-linux.so.3");
5896 }
Eli Friedman5bea4f62011-11-08 19:43:37 +00005897 else if (ToolChain.getArch() == llvm::Triple::mips ||
5898 ToolChain.getArch() == llvm::Triple::mipsel)
5899 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan8491cb22012-04-06 20:14:27 +00005900 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005901 ToolChain.getArch() == llvm::Triple::mips64el) {
5902 if (hasMipsN32ABIArg(Args))
5903 CmdArgs.push_back("/lib32/ld.so.1");
5904 else
5905 CmdArgs.push_back("/lib64/ld.so.1");
5906 }
Ted Kremenek43ac2972011-04-05 22:04:27 +00005907 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005908 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005909 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005910 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005911 else
5912 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5913 }
5914
5915 CmdArgs.push_back("-o");
5916 CmdArgs.push_back(Output.getFilename());
5917
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005918 if (!Args.hasArg(options::OPT_nostdlib) &&
5919 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005920 if (!isAndroid) {
5921 const char *crt1 = NULL;
5922 if (!Args.hasArg(options::OPT_shared)){
5923 if (Args.hasArg(options::OPT_pie))
5924 crt1 = "Scrt1.o";
5925 else
5926 crt1 = "crt1.o";
5927 }
5928 if (crt1)
5929 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005930
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005931 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5932 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005933
Rafael Espindola89414b32010-11-12 03:00:39 +00005934 const char *crtbegin;
5935 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005936 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005937 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005938 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005939 else if (Args.hasArg(options::OPT_pie))
5940 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005941 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005942 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005943 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00005944
5945 // Add crtfastmath.o if available and fast math is enabled.
5946 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00005947 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005948
5949 Args.AddAllArgs(CmdArgs, options::OPT_L);
5950
5951 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5952
Roman Divacky58e5ac92011-03-01 17:53:14 +00005953 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5954 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005955 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005956
Rafael Espindolac5151542012-04-09 23:53:34 +00005957 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5958 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5959 // forward.
5960 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5961 CmdArgs.push_back("-plugin");
5962 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5963 CmdArgs.push_back(Args.MakeArgString(Plugin));
5964 }
5965
Nick Lewyckye276cfc2012-08-17 03:39:16 +00005966 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5967 CmdArgs.push_back("--no-demangle");
5968
Rafael Espindolac1da9812010-11-07 20:14:31 +00005969 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5970
Richard Smith8e1cee62012-10-25 02:14:12 +00005971 // Call this before we add the C++ ABI library.
5972 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
5973
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005974 if (D.CCCIsCXX &&
5975 !Args.hasArg(options::OPT_nostdlib) &&
5976 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00005977 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5978 !Args.hasArg(options::OPT_static);
5979 if (OnlyLibstdcxxStatic)
5980 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005981 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00005982 if (OnlyLibstdcxxStatic)
5983 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005984 CmdArgs.push_back("-lm");
5985 }
5986
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005987 // Call this before we add the C run-time.
5988 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00005989 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryanydff466c2011-11-30 01:39:16 +00005990
Rafael Espindola89414b32010-11-12 03:00:39 +00005991 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005992 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5993 if (Args.hasArg(options::OPT_static))
5994 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00005995
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005996 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00005997
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005998 if (Args.hasArg(options::OPT_pthread) ||
5999 Args.hasArg(options::OPT_pthreads))
6000 CmdArgs.push_back("-lpthread");
6001
6002 CmdArgs.push_back("-lc");
6003
6004 if (Args.hasArg(options::OPT_static))
6005 CmdArgs.push_back("--end-group");
6006 else
6007 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6008 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006009
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006010 if (!Args.hasArg(options::OPT_nostartfiles)) {
6011 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006012 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006013 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006014 else if (Args.hasArg(options::OPT_pie))
6015 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006016 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006017 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006018
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006019 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006020 if (!isAndroid)
6021 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006022 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006023 }
6024
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006025 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006026
Rafael Espindolac1da9812010-11-07 20:14:31 +00006027 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6028}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006029
Chris Lattner38e317d2010-07-07 16:01:42 +00006030void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006031 const InputInfo &Output,
6032 const InputInfoList &Inputs,
6033 const ArgList &Args,
6034 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006035 ArgStringList CmdArgs;
6036
6037 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6038 options::OPT_Xassembler);
6039
6040 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006041 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006042
6043 for (InputInfoList::const_iterator
6044 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6045 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006046 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006047 }
6048
6049 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006050 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006051 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006052}
6053
6054void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006055 const InputInfo &Output,
6056 const InputInfoList &Inputs,
6057 const ArgList &Args,
6058 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006059 const Driver &D = getToolChain().getDriver();
6060 ArgStringList CmdArgs;
6061
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006062 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006063 CmdArgs.push_back("-o");
6064 CmdArgs.push_back(Output.getFilename());
6065 } else {
6066 assert(Output.isNothing() && "Invalid output.");
6067 }
6068
6069 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006070 !Args.hasArg(options::OPT_nostartfiles)) {
6071 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6072 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6073 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6074 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6075 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006076
6077 Args.AddAllArgs(CmdArgs, options::OPT_L);
6078 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6079 Args.AddAllArgs(CmdArgs, options::OPT_e);
6080
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006081 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006082
Eli Friedman6d402dc2011-12-08 23:54:21 +00006083 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6084
Chris Lattner38e317d2010-07-07 16:01:42 +00006085 if (!Args.hasArg(options::OPT_nostdlib) &&
6086 !Args.hasArg(options::OPT_nodefaultlibs)) {
6087 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006088 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006089 CmdArgs.push_back("-lm");
6090 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006091 }
6092
6093 if (!Args.hasArg(options::OPT_nostdlib) &&
6094 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006095 if (Args.hasArg(options::OPT_pthread))
6096 CmdArgs.push_back("-lpthread");
6097 CmdArgs.push_back("-lc");
6098 CmdArgs.push_back("-lCompilerRT-Generic");
6099 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6100 CmdArgs.push_back(
6101 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006102 }
6103
Eli Friedman6d402dc2011-12-08 23:54:21 +00006104 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006105 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006106}
6107
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006108/// DragonFly Tools
6109
6110// For now, DragonFly Assemble does just about the same as for
6111// FreeBSD, but this may change soon.
6112void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006113 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006114 const InputInfoList &Inputs,
6115 const ArgList &Args,
6116 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006117 ArgStringList CmdArgs;
6118
6119 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6120 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006121 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006122 CmdArgs.push_back("--32");
6123
6124 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6125 options::OPT_Xassembler);
6126
6127 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006128 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006129
6130 for (InputInfoList::const_iterator
6131 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6132 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006133 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006134 }
6135
6136 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006137 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006138 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006139}
6140
6141void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006142 const InputInfo &Output,
6143 const InputInfoList &Inputs,
6144 const ArgList &Args,
6145 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006146 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006147 ArgStringList CmdArgs;
6148
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006149 if (!D.SysRoot.empty())
6150 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6151
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006152 if (Args.hasArg(options::OPT_static)) {
6153 CmdArgs.push_back("-Bstatic");
6154 } else {
6155 if (Args.hasArg(options::OPT_shared))
6156 CmdArgs.push_back("-Bshareable");
6157 else {
6158 CmdArgs.push_back("-dynamic-linker");
6159 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6160 }
6161 }
6162
6163 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6164 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006165 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006166 CmdArgs.push_back("-m");
6167 CmdArgs.push_back("elf_i386");
6168 }
6169
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006170 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006171 CmdArgs.push_back("-o");
6172 CmdArgs.push_back(Output.getFilename());
6173 } else {
6174 assert(Output.isNothing() && "Invalid output.");
6175 }
6176
6177 if (!Args.hasArg(options::OPT_nostdlib) &&
6178 !Args.hasArg(options::OPT_nostartfiles)) {
6179 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006180 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006181 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006182 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006183 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006184 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006185 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006186 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00006187 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006188 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006189 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006190 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006191 }
6192 }
6193
6194 Args.AddAllArgs(CmdArgs, options::OPT_L);
6195 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6196 Args.AddAllArgs(CmdArgs, options::OPT_e);
6197
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006198 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006199
6200 if (!Args.hasArg(options::OPT_nostdlib) &&
6201 !Args.hasArg(options::OPT_nodefaultlibs)) {
6202 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6203 // rpaths
6204 CmdArgs.push_back("-L/usr/lib/gcc41");
6205
6206 if (!Args.hasArg(options::OPT_static)) {
6207 CmdArgs.push_back("-rpath");
6208 CmdArgs.push_back("/usr/lib/gcc41");
6209
6210 CmdArgs.push_back("-rpath-link");
6211 CmdArgs.push_back("/usr/lib/gcc41");
6212
6213 CmdArgs.push_back("-rpath");
6214 CmdArgs.push_back("/usr/lib");
6215
6216 CmdArgs.push_back("-rpath-link");
6217 CmdArgs.push_back("/usr/lib");
6218 }
6219
Rafael Espindola405861d2010-07-20 12:59:03 +00006220 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006221 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006222 CmdArgs.push_back("-lm");
6223 }
6224
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006225 if (Args.hasArg(options::OPT_shared)) {
6226 CmdArgs.push_back("-lgcc_pic");
6227 } else {
6228 CmdArgs.push_back("-lgcc");
6229 }
6230
6231
6232 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006233 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006234
6235 if (!Args.hasArg(options::OPT_nolibc)) {
6236 CmdArgs.push_back("-lc");
6237 }
6238
6239 if (Args.hasArg(options::OPT_shared)) {
6240 CmdArgs.push_back("-lgcc_pic");
6241 } else {
6242 CmdArgs.push_back("-lgcc");
6243 }
6244 }
6245
6246 if (!Args.hasArg(options::OPT_nostdlib) &&
6247 !Args.hasArg(options::OPT_nostartfiles)) {
6248 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006249 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006250 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006251 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006252 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006253 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006254 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006255 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006256 }
6257
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006258 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006259
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006260 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006261 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006262 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006263}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006264
6265void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6266 const InputInfo &Output,
6267 const InputInfoList &Inputs,
6268 const ArgList &Args,
6269 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006270 ArgStringList CmdArgs;
6271
6272 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006273 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6274 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006275 } else {
6276 assert(Output.isNothing() && "Invalid output.");
6277 }
6278
6279 if (!Args.hasArg(options::OPT_nostdlib) &&
6280 !Args.hasArg(options::OPT_nostartfiles)) {
6281 CmdArgs.push_back("-defaultlib:libcmt");
6282 }
6283
6284 CmdArgs.push_back("-nologo");
6285
Michael J. Spencera2284f52012-06-18 16:56:04 +00006286 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6287
6288 // Add filenames immediately.
6289 for (InputInfoList::const_iterator
6290 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6291 if (it->isFilename())
6292 CmdArgs.push_back(it->getFilename());
6293 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006294
6295 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006296 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006297 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6298}