blob: 119b7c76a4bda805ec981bd3e5953b72671a5e71 [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"
Chandler Carruth55fc8732012-12-04 09:13:33 +000011#include "InputInfo.h"
12#include "SanitizerArgs.h"
13#include "ToolChains.h"
14#include "clang/Basic/ObjCRuntime.h"
Kevin Enderby02341792013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbar1d460332009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000017#include "clang/Driver/Arg.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000018#include "clang/Driver/ArgList.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000023#include "clang/Driver/Option.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000024#include "clang/Driver/Options.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Daniel Dunbar88137642009-09-09 22:32:48 +000027#include "llvm/ADT/SmallString.h"
Douglas Gregor55d3f7a2009-10-29 00:41:01 +000028#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar5b750fe2009-09-09 22:32:34 +000029#include "llvm/ADT/Twine.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Daniel Dunbar02633b52009-03-26 16:23:12 +000032#include "llvm/Support/Format.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000033#include "llvm/Support/Host.h"
34#include "llvm/Support/Process.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000036
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000037using namespace clang::driver;
38using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000039using namespace clang;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000040
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000041/// CheckPreprocessingOptions - Perform some validation of preprocessing
42/// arguments that is shared with gcc.
43static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
44 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenberger9ade4ae2011-03-06 23:31:01 +000045 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner5f9e2722011-07-23 10:55:15 +000046 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000047 << A->getAsString(Args) << "-E";
48}
49
Daniel Dunbare2fd6642009-09-10 01:21:12 +000050/// CheckCodeGenerationOptions - Perform some validation of code generation
51/// arguments that is shared with gcc.
52static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
53 // In gcc, only ARM checks this, but it seems reasonable to check universally.
54 if (Args.hasArg(options::OPT_static))
55 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
56 options::OPT_mdynamic_no_pic))
Chris Lattner5f9e2722011-07-23 10:55:15 +000057 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbare2fd6642009-09-10 01:21:12 +000058 << A->getAsString(Args) << "-static";
59}
60
Chris Lattner3edbeb72010-03-29 17:55:58 +000061// Quote target names for inclusion in GNU Make dependency files.
62// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner5f9e2722011-07-23 10:55:15 +000063static void QuoteTarget(StringRef Target,
64 SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +000065 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
66 switch (Target[i]) {
67 case ' ':
68 case '\t':
69 // Escape the preceding backslashes
70 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
71 Res.push_back('\\');
72
73 // Escape the space/tab
74 Res.push_back('\\');
75 break;
76 case '$':
77 Res.push_back('$');
78 break;
79 case '#':
80 Res.push_back('\\');
81 break;
82 default:
83 break;
84 }
85
86 Res.push_back(Target[i]);
87 }
88}
89
Bill Wendling3d717152012-03-12 22:10:06 +000090static void addDirectoryList(const ArgList &Args,
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000091 ArgStringList &CmdArgs,
92 const char *ArgName,
Bill Wendling3d717152012-03-12 22:10:06 +000093 const char *EnvVar) {
94 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +000095 bool CombinedArg = false;
96
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000097 if (!DirList)
98 return; // Nothing to do.
99
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000100 StringRef Name(ArgName);
101 if (Name.equals("-I") || Name.equals("-L"))
102 CombinedArg = true;
103
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000104 StringRef Dirs(DirList);
105 if (Dirs.empty()) // Empty string should not add '.'.
106 return;
107
108 StringRef::size_type Delim;
109 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
110 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000111 if (CombinedArg) {
112 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
113 } else {
114 CmdArgs.push_back(ArgName);
115 CmdArgs.push_back(".");
116 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000117 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000118 if (CombinedArg) {
119 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
120 } else {
121 CmdArgs.push_back(ArgName);
122 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
123 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000124 }
Nico Weber09c5c392012-03-19 15:00:03 +0000125 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000126 }
127
128 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000129 if (CombinedArg) {
130 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
131 } else {
132 CmdArgs.push_back(ArgName);
133 CmdArgs.push_back(".");
134 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000135 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000136 if (CombinedArg) {
137 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
138 } else {
139 CmdArgs.push_back(ArgName);
140 CmdArgs.push_back(Args.MakeArgString(Dirs));
141 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000142 }
143}
144
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000145static void AddLinkerInputs(const ToolChain &TC,
146 const InputInfoList &Inputs, const ArgList &Args,
147 ArgStringList &CmdArgs) {
148 const Driver &D = TC.getDriver();
149
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000150 // Add extra linker input arguments which are not treated as inputs
151 // (constructed via -Xarch_).
152 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
153
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000154 for (InputInfoList::const_iterator
155 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
156 const InputInfo &II = *it;
157
158 if (!TC.HasNativeLLVMSupport()) {
159 // Don't try to pass LLVM inputs unless we have native support.
160 if (II.getType() == types::TY_LLVM_IR ||
161 II.getType() == types::TY_LTO_IR ||
162 II.getType() == types::TY_LLVM_BC ||
163 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000164 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000165 << TC.getTripleString();
166 }
167
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000168 // Add filenames immediately.
169 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000170 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000171 continue;
172 }
173
174 // Otherwise, this is a linker input argument.
175 const Arg &A = II.getInputArg();
176
177 // Handle reserved library options.
178 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000179 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Sen7433fed2010-09-17 18:39:08 +0000180 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
181 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000182 } else
183 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000184 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000185
186 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendling3d717152012-03-12 22:10:06 +0000187 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000188}
189
John McCallf85e1932011-06-15 23:02:42 +0000190/// \brief Determine whether Objective-C automated reference counting is
191/// enabled.
192static bool isObjCAutoRefCount(const ArgList &Args) {
193 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
194}
195
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000196/// \brief Determine whether we are linking the ObjC runtime.
197static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000198 if (isObjCAutoRefCount(Args)) {
199 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000200 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000201 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000202 return Args.hasArg(options::OPT_fobjc_link_runtime);
203}
204
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000205static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000206 ArgStringList &CmdArgs,
207 llvm::Triple Triple) {
208 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
209 Args.hasArg(options::OPT_fprofile_generate) ||
210 Args.hasArg(options::OPT_fcreate_profile) ||
211 Args.hasArg(options::OPT_coverage)))
212 return;
213
214 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
215 // the link line. We cannot do the same thing because unlike gcov there is a
216 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
217 // not supported by old linkers.
Benjamin Kramerf2db04c2011-11-07 16:02:25 +0000218 std::string ProfileRT =
219 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000220
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000221 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000222}
223
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000224static bool forwardToGCC(const Option &O) {
225 return !O.hasFlag(options::NoForward) &&
226 !O.hasFlag(options::DriverOption) &&
227 !O.hasFlag(options::LinkerInput);
228}
229
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000230void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier9d718632013-01-24 19:14:47 +0000231 const JobAction &JA,
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000232 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();
Chad Rosier9d718632013-01-24 19:14:47 +0000252 C.addFailureResultFile(DepFile, &JA);
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 {
Bob Wilson66b8a662012-11-23 06:14:39 +0000259 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000260 C.addFailureResultFile(DepFile, &JA);
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 Gregor2a060852013-02-07 00:21:12 +0000417
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000418 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000419 // FIXME: We should probably sink the logic for handling these from the
420 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000421 // CPATH - included following the user specified includes (but prior to
422 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000423 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000424 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000425 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000426 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000428 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000430 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000432
Chandler Carruth88491fc2011-11-04 07:12:53 +0000433 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000434 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000435 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000436
437 // Add system include arguments.
438 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000439}
440
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000441/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000442/// CPU.
443//
444// FIXME: This is redundant with -mcpu, why does LLVM use this.
445// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000446static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000447 return llvm::StringSwitch<const char *>(CPU)
448 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
449 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
450 .Cases("arm920", "arm920t", "arm922t", "v4t")
451 .Cases("arm940t", "ep9312","v4t")
452 .Cases("arm10tdmi", "arm1020t", "v5")
453 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
454 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
455 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
456 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
457 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
458 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonfc553452013-03-04 22:37:46 +0000459 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
460 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetab137512012-12-21 17:57:47 +0000461 .Case("cortex-r5", "v7r")
Bob Wilson57f6d192012-03-21 17:19:12 +0000462 .Case("cortex-m0", "v6m")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000463 .Case("cortex-m3", "v7m")
464 .Case("cortex-m4", "v7em")
Bob Wilson336bfa32012-09-29 23:52:50 +0000465 .Case("cortex-a9-mp", "v7f")
466 .Case("swift", "v7s")
Chad Rosierae1aee62011-10-07 17:48:56 +0000467 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000468}
469
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000470/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
471//
472// FIXME: tblgen this.
473static std::string getARMTargetCPU(const ArgList &Args,
474 const llvm::Triple &Triple) {
475 // FIXME: Warn on inconsistent use of -mcpu and -march.
476
477 // If we have -mcpu=, use that.
478 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000479 StringRef MCPU = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000480 // Handle -mcpu=native.
481 if (MCPU == "native")
482 return llvm::sys::getHostCPUName();
483 else
484 return MCPU;
485 }
486
487 StringRef MArch;
488 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
489 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smith1d489cf2012-11-01 04:30:05 +0000490 MArch = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000491 } else {
492 // Otherwise, use the Arch from the triple.
493 MArch = Triple.getArchName();
494 }
495
496 // Handle -march=native.
497 std::string NativeMArch;
498 if (MArch == "native") {
499 std::string CPU = llvm::sys::getHostCPUName();
500 if (CPU != "generic") {
501 // Translate the native cpu into the architecture. The switch below will
502 // then chose the minimum cpu for that arch.
503 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
504 MArch = NativeMArch;
505 }
506 }
507
508 return llvm::StringSwitch<const char *>(MArch)
509 .Cases("armv2", "armv2a","arm2")
510 .Case("armv3", "arm6")
511 .Case("armv3m", "arm7m")
512 .Cases("armv4", "armv4t", "arm7tdmi")
513 .Cases("armv5", "armv5t", "arm10tdmi")
514 .Cases("armv5e", "armv5te", "arm1022e")
515 .Case("armv5tej", "arm926ej-s")
516 .Cases("armv6", "armv6k", "arm1136jf-s")
517 .Case("armv6j", "arm1136j-s")
518 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
519 .Case("armv6t2", "arm1156t2-s")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000520 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000521 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000522 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilson336bfa32012-09-29 23:52:50 +0000523 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
524 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000525 .Cases("armv7r", "armv7-r", "cortex-r4")
526 .Cases("armv7m", "armv7-m", "cortex-m3")
527 .Case("ep9312", "ep9312")
528 .Case("iwmmxt", "iwmmxt")
529 .Case("xscale", "xscale")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000530 // If all else failed, return the most base CPU LLVM supports.
531 .Default("arm7tdmi");
532}
533
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000534// FIXME: Move to target hook.
535static bool isSignedCharDefault(const llvm::Triple &Triple) {
536 switch (Triple.getArch()) {
537 default:
538 return true;
539
Tim Northoverc264e162013-01-31 12:13:10 +0000540 case llvm::Triple::aarch64:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000541 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000542 case llvm::Triple::ppc:
543 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000544 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000545 return true;
546 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000547 }
548}
549
Chad Rosier99317272012-04-04 20:51:35 +0000550// Handle -mfpu=.
551//
552// FIXME: Centralize feature selection, defaulting shouldn't be also in the
553// frontend target.
554static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
555 ArgStringList &CmdArgs) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000556 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000557
558 // Set the target features based on the FPU.
559 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
560 // Disable any default FPU support.
561 CmdArgs.push_back("-target-feature");
562 CmdArgs.push_back("-vfp2");
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("-vfp3");
565 CmdArgs.push_back("-target-feature");
566 CmdArgs.push_back("-neon");
567 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
568 CmdArgs.push_back("-target-feature");
569 CmdArgs.push_back("+vfp3");
570 CmdArgs.push_back("-target-feature");
571 CmdArgs.push_back("+d16");
572 CmdArgs.push_back("-target-feature");
573 CmdArgs.push_back("-neon");
574 } else if (FPU == "vfp") {
575 CmdArgs.push_back("-target-feature");
576 CmdArgs.push_back("+vfp2");
577 CmdArgs.push_back("-target-feature");
578 CmdArgs.push_back("-neon");
579 } else if (FPU == "vfp3" || FPU == "vfpv3") {
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+vfp3");
582 CmdArgs.push_back("-target-feature");
583 CmdArgs.push_back("-neon");
584 } else if (FPU == "neon") {
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("+neon");
587 } else
588 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
589}
590
Chad Rosier7a938fa2012-04-04 20:39:32 +0000591// Handle -mfpmath=.
592static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000593 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000594 StringRef FPMath = A->getValue();
Chad Rosier7a938fa2012-04-04 20:39:32 +0000595
596 // Set the target features based on the FPMath.
597 if (FPMath == "neon") {
598 CmdArgs.push_back("-target-feature");
599 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000600
Bob Wilsonfc553452013-03-04 22:37:46 +0000601 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
602 CPU != "cortex-a8" && CPU != "cortex-a9" &&
603 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000604 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
605
Chad Rosier7a938fa2012-04-04 20:39:32 +0000606 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
607 FPMath == "vfp4") {
608 CmdArgs.push_back("-target-feature");
609 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000610
611 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000612 } else
613 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
614}
615
Anton Korobeynikove2571792012-04-09 13:38:30 +0000616// Select the float ABI as determined by -msoft-float, -mhard-float, and
617// -mfloat-abi=.
618static StringRef getARMFloatABI(const Driver &D,
619 const ArgList &Args,
620 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000621 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000622 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
623 options::OPT_mhard_float,
624 options::OPT_mfloat_abi_EQ)) {
625 if (A->getOption().matches(options::OPT_msoft_float))
626 FloatABI = "soft";
627 else if (A->getOption().matches(options::OPT_mhard_float))
628 FloatABI = "hard";
629 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000630 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000631 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000632 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000633 << A->getAsString(Args);
634 FloatABI = "soft";
635 }
636 }
637 }
638
639 // If unspecified, choose the default based on the platform.
640 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000641 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000642 case llvm::Triple::Darwin:
643 case llvm::Triple::MacOSX:
644 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000645 // Darwin defaults to "softfp" for v6 and v7.
646 //
647 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000648 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000649 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v6") ||
651 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000652 FloatABI = "softfp";
653 else
654 FloatABI = "soft";
655 break;
656 }
657
Rafael Espindola27fa2362012-12-13 04:17:14 +0000658 case llvm::Triple::FreeBSD:
659 // FreeBSD defaults to soft float
660 FloatABI = "soft";
661 break;
662
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000663 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000664 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000665 case llvm::Triple::GNUEABIHF:
666 FloatABI = "hard";
667 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000668 case llvm::Triple::GNUEABI:
669 FloatABI = "softfp";
670 break;
671 case llvm::Triple::EABI:
672 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
673 FloatABI = "softfp";
674 break;
Logan Chien94a71422012-09-02 09:30:11 +0000675 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000676 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000677 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000678 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000679 FloatABI = "softfp";
680 else
681 FloatABI = "soft";
682 break;
683 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000684 default:
685 // Assume "soft", but warn the user we are guessing.
686 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000687 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000688 break;
689 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000690 }
691 }
692
Anton Korobeynikove2571792012-04-09 13:38:30 +0000693 return FloatABI;
694}
695
696
697void Clang::AddARMTargetArgs(const ArgList &Args,
698 ArgStringList &CmdArgs,
699 bool KernelOrKext) const {
700 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000701 // Get the effective triple, which takes into account the deployment target.
702 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
703 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000704 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000705
706 // Select the ABI to use.
707 //
708 // FIXME: Support -meabi.
709 const char *ABIName = 0;
710 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000711 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000712 } else if (Triple.isOSDarwin()) {
713 // The backend is hardwired to assume AAPCS for M-class processors, ensure
714 // the frontend matches that.
715 if (StringRef(CPUName).startswith("cortex-m")) {
716 ABIName = "aapcs";
717 } else {
718 ABIName = "apcs-gnu";
719 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000720 } else {
721 // Select the default based on the platform.
722 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000723 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000724 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000725 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000726 ABIName = "aapcs-linux";
727 break;
728 case llvm::Triple::EABI:
729 ABIName = "aapcs";
730 break;
731 default:
732 ABIName = "apcs-gnu";
733 }
734 }
735 CmdArgs.push_back("-target-abi");
736 CmdArgs.push_back(ABIName);
737
738 // Set the CPU based on -march= and -mcpu=.
739 CmdArgs.push_back("-target-cpu");
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000740 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikove2571792012-04-09 13:38:30 +0000741
742 // Determine floating point ABI from the options & target defaults.
743 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000744 if (FloatABI == "soft") {
745 // Floating point operations and argument passing are soft.
746 //
747 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000748 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000749 CmdArgs.push_back("-mfloat-abi");
750 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000751 } else if (FloatABI == "softfp") {
752 // Floating point operations are hard, but argument passing is soft.
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 {
756 // Floating point operations and argument passing are hard.
757 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000758 CmdArgs.push_back("-mfloat-abi");
759 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000760 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000761
762 // Set appropriate target features for floating point mode.
763 //
764 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
765 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
766 // stripped out by the ARM target.
767
768 // Use software floating point operations?
769 if (FloatABI == "soft") {
770 CmdArgs.push_back("-target-feature");
771 CmdArgs.push_back("+soft-float");
772 }
773
774 // Use software floating point argument passing?
775 if (FloatABI != "hard") {
776 CmdArgs.push_back("-target-feature");
777 CmdArgs.push_back("+soft-float-abi");
778 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000779
780 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000781 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000782 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000783
Chad Rosier7a938fa2012-04-04 20:39:32 +0000784 // Honor -mfpmath=.
785 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000786 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000787
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000788 // Setting -msoft-float effectively disables NEON because of the GCC
789 // implementation, although the same isn't true of VFP or VFP3.
790 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000791 CmdArgs.push_back("-target-feature");
792 CmdArgs.push_back("-neon");
793 }
794
795 // Kernel code has more strict alignment requirements.
796 if (KernelOrKext) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000797 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
798 CmdArgs.push_back("-backend-option");
799 CmdArgs.push_back("-arm-long-calls");
800 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000801
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000802 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000803 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000804
805 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000806 CmdArgs.push_back("-backend-option");
807 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000808 }
Chad Rosier1b906052011-08-26 00:26:29 +0000809
810 // Setting -mno-global-merge disables the codegen global merge pass. Setting
811 // -mglobal-merge has no effect as the pass is enabled by default.
812 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
813 options::OPT_mno_global_merge)) {
814 if (A->getOption().matches(options::OPT_mno_global_merge))
815 CmdArgs.push_back("-mno-global-merge");
816 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000817
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000818 if (!Args.hasFlag(options::OPT_mimplicit_float,
819 options::OPT_mno_implicit_float,
820 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000821 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000822}
823
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000824// Translate MIPS CPU name alias option to CPU name.
825static StringRef getMipsCPUFromAlias(const Arg &A) {
826 if (A.getOption().matches(options::OPT_mips32))
827 return "mips32";
828 if (A.getOption().matches(options::OPT_mips32r2))
829 return "mips32r2";
830 if (A.getOption().matches(options::OPT_mips64))
831 return "mips64";
832 if (A.getOption().matches(options::OPT_mips64r2))
833 return "mips64r2";
834 llvm_unreachable("Unexpected option");
835 return "";
836}
837
Simon Atanasyana2768be2012-04-07 22:09:23 +0000838// Get CPU and ABI names. They are not independent
839// so we have to calculate them together.
840static void getMipsCPUAndABI(const ArgList &Args,
841 const ToolChain &TC,
842 StringRef &CPUName,
843 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000844 const char *DefMips32CPU = "mips32";
845 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000846
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000847 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000848 options::OPT_mcpu_EQ,
849 options::OPT_mips_CPUs_Group)) {
850 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
851 CPUName = getMipsCPUFromAlias(*A);
852 else
Richard Smith1d489cf2012-11-01 04:30:05 +0000853 CPUName = A->getValue();
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000854 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000855
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000856 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000857 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000858 // Convert a GNU style Mips ABI name to the name
859 // accepted by LLVM Mips backend.
860 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
861 .Case("32", "o32")
862 .Case("64", "n64")
863 .Default(ABIName);
864 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000865
866 // Setup default CPU and ABI names.
867 if (CPUName.empty() && ABIName.empty()) {
868 switch (TC.getTriple().getArch()) {
869 default:
870 llvm_unreachable("Unexpected triple arch name");
871 case llvm::Triple::mips:
872 case llvm::Triple::mipsel:
873 CPUName = DefMips32CPU;
874 break;
875 case llvm::Triple::mips64:
876 case llvm::Triple::mips64el:
877 CPUName = DefMips64CPU;
878 break;
879 }
880 }
881
882 if (!ABIName.empty()) {
883 // Deduce CPU name from ABI name.
884 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyane9616a42013-02-27 14:55:49 +0000885 .Cases("32", "o32", "eabi", DefMips32CPU)
886 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000887 .Default("");
888 }
889 else if (!CPUName.empty()) {
890 // Deduce ABI name from CPU name.
891 ABIName = llvm::StringSwitch<const char *>(CPUName)
892 .Cases("mips32", "mips32r2", "o32")
893 .Cases("mips64", "mips64r2", "n64")
894 .Default("");
895 }
896
897 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000898}
899
Simon Atanasyane9616a42013-02-27 14:55:49 +0000900// Convert ABI name to the GNU tools acceptable variant.
901static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
902 return llvm::StringSwitch<llvm::StringRef>(ABI)
903 .Case("o32", "32")
904 .Case("n64", "64")
905 .Default(ABI);
906}
907
Simon Atanasyan5e627792012-06-02 15:06:29 +0000908// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
909// and -mfloat-abi=.
910static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000911 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000912 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000913 options::OPT_mhard_float,
914 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000915 if (A->getOption().matches(options::OPT_msoft_float))
916 FloatABI = "soft";
917 else if (A->getOption().matches(options::OPT_mhard_float))
918 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000919 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000920 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +0000921 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000922 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000923 FloatABI = "hard";
924 }
925 }
Eric Christophered734732010-03-02 02:41:08 +0000926 }
927
928 // If unspecified, choose the default based on the platform.
929 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000930 // Assume "hard", because it's a default value used by gcc.
931 // When we start to recognize specific target MIPS processors,
932 // we will be able to select the default more correctly.
933 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000934 }
935
Simon Atanasyan5e627792012-06-02 15:06:29 +0000936 return FloatABI;
937}
938
Simon Atanasyandc536f52012-07-05 18:51:43 +0000939static void AddTargetFeature(const ArgList &Args,
940 ArgStringList &CmdArgs,
941 OptSpecifier OnOpt,
942 OptSpecifier OffOpt,
943 StringRef FeatureName) {
944 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
945 CmdArgs.push_back("-target-feature");
946 if (A->getOption().matches(OnOpt))
947 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
948 else
949 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
950 }
951}
952
Simon Atanasyan5e627792012-06-02 15:06:29 +0000953void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +0000954 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000955 const Driver &D = getToolChain().getDriver();
956 StringRef CPUName;
957 StringRef ABIName;
958 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
959
960 CmdArgs.push_back("-target-cpu");
961 CmdArgs.push_back(CPUName.data());
962
963 CmdArgs.push_back("-target-abi");
964 CmdArgs.push_back(ABIName.data());
965
966 StringRef FloatABI = getMipsFloatABI(D, Args);
967
Simon Atanasyane1d792f2013-01-10 12:36:19 +0000968 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
969
970 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +0000971 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000972 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000973 CmdArgs.push_back("-mfloat-abi");
974 CmdArgs.push_back("soft");
975
976 // FIXME: Note, this is a hack. We need to pass the selected float
977 // mode to the MipsTargetInfoBase to define appropriate macros there.
978 // Now it is the only method.
979 CmdArgs.push_back("-target-feature");
980 CmdArgs.push_back("+soft-float");
Simon Atanasyane1d792f2013-01-10 12:36:19 +0000981
982 if (FloatABI == "hard" && IsMips16) {
983 CmdArgs.push_back("-mllvm");
984 CmdArgs.push_back("-mips16-hard-float");
985 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000986 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000987 else {
988 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +0000989 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000990 CmdArgs.push_back("-mfloat-abi");
991 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +0000992 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +0000993
Simon Atanasyan7c06cba2013-04-14 14:07:36 +0000994 AddTargetFeature(Args, CmdArgs,
995 options::OPT_msingle_float, options::OPT_mdouble_float,
996 "single-float");
Simon Atanasyandc536f52012-07-05 18:51:43 +0000997 AddTargetFeature(Args, CmdArgs,
998 options::OPT_mips16, options::OPT_mno_mips16,
999 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +00001000 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan321ae792013-04-14 14:07:51 +00001001 options::OPT_mmicromips, options::OPT_mno_micromips,
1002 "micromips");
1003 AddTargetFeature(Args, CmdArgs,
Simon Atanasyand797a852012-07-05 19:23:00 +00001004 options::OPT_mdsp, options::OPT_mno_dsp,
1005 "dsp");
1006 AddTargetFeature(Args, CmdArgs,
1007 options::OPT_mdspr2, options::OPT_mno_dspr2,
1008 "dspr2");
Simon Atanasyan9804b762012-08-27 20:55:56 +00001009
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001010 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1011 if (A->getOption().matches(options::OPT_mxgot)) {
1012 CmdArgs.push_back("-mllvm");
1013 CmdArgs.push_back("-mxgot");
1014 }
1015 }
1016
Simon Atanasyan9804b762012-08-27 20:55:56 +00001017 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001018 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001019 CmdArgs.push_back("-mllvm");
1020 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1021 A->claim();
1022 }
Eric Christophered734732010-03-02 02:41:08 +00001023}
1024
Hal Finkel02a84272012-06-11 22:35:19 +00001025/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1026static std::string getPPCTargetCPU(const ArgList &Args) {
1027 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001028 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001029
1030 if (CPUName == "native") {
1031 std::string CPU = llvm::sys::getHostCPUName();
1032 if (!CPU.empty() && CPU != "generic")
1033 return CPU;
1034 else
1035 return "";
1036 }
1037
1038 return llvm::StringSwitch<const char *>(CPUName)
1039 .Case("common", "generic")
1040 .Case("440", "440")
1041 .Case("440fp", "440")
1042 .Case("450", "450")
1043 .Case("601", "601")
1044 .Case("602", "602")
1045 .Case("603", "603")
1046 .Case("603e", "603e")
1047 .Case("603ev", "603ev")
1048 .Case("604", "604")
1049 .Case("604e", "604e")
1050 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001051 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001052 .Case("G3", "g3")
1053 .Case("7400", "7400")
1054 .Case("G4", "g4")
1055 .Case("7450", "7450")
1056 .Case("G4+", "g4+")
1057 .Case("750", "750")
1058 .Case("970", "970")
1059 .Case("G5", "g5")
1060 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001061 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001062 .Case("e500mc", "e500mc")
1063 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001064 .Case("power3", "pwr3")
1065 .Case("power4", "pwr4")
1066 .Case("power5", "pwr5")
1067 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001068 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001069 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001070 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001071 .Case("pwr3", "pwr3")
1072 .Case("pwr4", "pwr4")
1073 .Case("pwr5", "pwr5")
1074 .Case("pwr5x", "pwr5x")
1075 .Case("pwr6", "pwr6")
1076 .Case("pwr6x", "pwr6x")
1077 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001078 .Case("powerpc", "ppc")
1079 .Case("powerpc64", "ppc64")
1080 .Default("");
1081 }
1082
1083 return "";
1084}
1085
1086void Clang::AddPPCTargetArgs(const ArgList &Args,
1087 ArgStringList &CmdArgs) const {
1088 std::string TargetCPUName = getPPCTargetCPU(Args);
1089
1090 // LLVM may default to generating code for the native CPU,
1091 // but, like gcc, we default to a more generic option for
1092 // each architecture. (except on Darwin)
1093 llvm::Triple Triple = getToolChain().getTriple();
1094 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1095 if (Triple.getArch() == llvm::Triple::ppc64)
1096 TargetCPUName = "ppc64";
1097 else
1098 TargetCPUName = "ppc";
1099 }
1100
1101 if (!TargetCPUName.empty()) {
1102 CmdArgs.push_back("-target-cpu");
1103 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1104 }
Bill Schmidt199402b2013-02-01 02:14:03 +00001105
1106 // Allow override of the Altivec feature.
Hal Finkelf4320ab2013-03-28 08:38:53 +00001107 AddTargetFeature(Args, CmdArgs,
1108 options::OPT_faltivec, options::OPT_fno_altivec,
1109 "altivec");
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001110
Hal Finkelfe6b2712013-03-30 13:47:44 +00001111 AddTargetFeature(Args, CmdArgs,
1112 options::OPT_mfprnd, options::OPT_mno_fprnd,
1113 "fprnd");
1114
Hal Finkelf4320ab2013-03-28 08:38:53 +00001115 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1116 AddTargetFeature(Args, CmdArgs,
1117 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1118 "mfocrf");
1119
Hal Finkel829d1872013-03-28 13:51:36 +00001120 AddTargetFeature(Args, CmdArgs,
1121 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1122 "popcntd");
1123
Hal Finkelf4320ab2013-03-28 08:38:53 +00001124 // It is really only possible to turn qpx off because turning qpx on is tied
1125 // to using the a2q CPU.
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001126 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1127 CmdArgs.push_back("-target-feature");
1128 CmdArgs.push_back("-qpx");
1129 }
Hal Finkel02a84272012-06-11 22:35:19 +00001130}
1131
Tom Stellarde25d2f62013-04-01 20:56:53 +00001132/// Get the (LLVM) name of the R600 gpu we are targeting.
1133static std::string getR600TargetGPU(const ArgList &Args) {
1134 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1135 std::string GPUName = A->getValue();
1136 return llvm::StringSwitch<const char *>(GPUName)
1137 .Cases("rv610", "rv620", "rv630", "r600")
1138 .Cases("rv635", "rs780", "rs880", "r600")
1139 .Case("rv740", "rv770")
1140 .Case("palm", "cedar")
1141 .Cases("sumo", "sumo2", "redwood")
1142 .Case("hemlock", "cypress")
1143 .Case("aruba", "cayman")
1144 .Default(GPUName.c_str());
1145 }
1146 return "";
1147}
1148
1149void Clang::AddR600TargetArgs(const ArgList &Args,
1150 ArgStringList &CmdArgs) const {
1151 std::string TargetGPUName = getR600TargetGPU(Args);
1152 CmdArgs.push_back("-target-cpu");
1153 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1154}
1155
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001156void Clang::AddSparcTargetArgs(const ArgList &Args,
1157 ArgStringList &CmdArgs) const {
1158 const Driver &D = getToolChain().getDriver();
1159
1160 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001161 CmdArgs.push_back("-target-cpu");
Richard Smith1d489cf2012-11-01 04:30:05 +00001162 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001163 }
1164
1165 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001166 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001167 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1168 options::OPT_mhard_float)) {
1169 if (A->getOption().matches(options::OPT_msoft_float))
1170 FloatABI = "soft";
1171 else if (A->getOption().matches(options::OPT_mhard_float))
1172 FloatABI = "hard";
1173 }
1174
1175 // If unspecified, choose the default based on the platform.
1176 if (FloatABI.empty()) {
1177 switch (getToolChain().getTriple().getOS()) {
1178 default:
1179 // Assume "soft", but warn the user we are guessing.
1180 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +00001181 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001182 break;
1183 }
1184 }
1185
1186 if (FloatABI == "soft") {
1187 // Floating point operations and argument passing are soft.
1188 //
1189 // FIXME: This changes CPP defines, we need -target-soft-float.
1190 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001191 CmdArgs.push_back("-target-feature");
1192 CmdArgs.push_back("+soft-float");
1193 } else {
1194 assert(FloatABI == "hard" && "Invalid float abi!");
1195 CmdArgs.push_back("-mhard-float");
1196 }
1197}
1198
Chandler Carruth700d4e42013-01-13 11:46:33 +00001199static const char *getX86TargetCPU(const ArgList &Args,
1200 const llvm::Triple &Triple) {
1201 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1202 if (StringRef(A->getValue()) != "native")
1203 return A->getValue();
1204
1205 // FIXME: Reject attempts to use -march=native unless the target matches
1206 // the host.
1207 //
1208 // FIXME: We should also incorporate the detected target features for use
1209 // with -native.
1210 std::string CPU = llvm::sys::getHostCPUName();
1211 if (!CPU.empty() && CPU != "generic")
1212 return Args.MakeArgString(CPU);
1213 }
1214
1215 // Select the default CPU if none was given (or detection failed).
1216
1217 if (Triple.getArch() != llvm::Triple::x86_64 &&
1218 Triple.getArch() != llvm::Triple::x86)
1219 return 0; // This routine is only handling x86 targets.
1220
1221 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1222
1223 // FIXME: Need target hooks.
1224 if (Triple.isOSDarwin())
1225 return Is64Bit ? "core2" : "yonah";
1226
1227 // Everything else goes to x86-64 in 64-bit mode.
1228 if (Is64Bit)
1229 return "x86-64";
1230
1231 if (Triple.getOSName().startswith("haiku"))
1232 return "i586";
1233 if (Triple.getOSName().startswith("openbsd"))
1234 return "i486";
1235 if (Triple.getOSName().startswith("bitrig"))
1236 return "i686";
1237 if (Triple.getOSName().startswith("freebsd"))
1238 return "i486";
1239 if (Triple.getOSName().startswith("netbsd"))
1240 return "i486";
1241 // All x86 devices running Android have core2 as their common
1242 // denominator. This makes a better choice than pentium4.
1243 if (Triple.getEnvironment() == llvm::Triple::Android)
1244 return "core2";
1245
1246 // Fallback to p4.
1247 return "pentium4";
1248}
1249
Daniel Dunbar6acda162009-09-09 22:33:08 +00001250void Clang::AddX86TargetArgs(const ArgList &Args,
1251 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001252 if (!Args.hasFlag(options::OPT_mred_zone,
1253 options::OPT_mno_red_zone,
1254 true) ||
1255 Args.hasArg(options::OPT_mkernel) ||
1256 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001257 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001258
Bob Wilsonf0c54562013-02-10 16:01:41 +00001259 // Default to avoid implicit floating-point for kernel/kext code, but allow
1260 // that to be overridden with -mno-soft-float.
1261 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1262 Args.hasArg(options::OPT_fapple_kext));
1263 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1264 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001265 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001266 options::OPT_mno_implicit_float)) {
1267 const Option &O = A->getOption();
1268 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1269 O.matches(options::OPT_msoft_float));
1270 }
1271 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001272 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001273
Chandler Carruth700d4e42013-01-13 11:46:33 +00001274 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbar38b48af2009-12-18 06:30:12 +00001275 CmdArgs.push_back("-target-cpu");
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001276 CmdArgs.push_back(CPUName);
1277 }
1278
Eli Friedmand18eeca2011-07-02 00:34:19 +00001279 // The required algorithm here is slightly strange: the options are applied
1280 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1281 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1282 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1283 // former correctly, but not the latter; handle directly-overridden
1284 // attributes here.
1285 llvm::StringMap<unsigned> PrevFeature;
1286 std::vector<const char*> Features;
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001287 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1288 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001289 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001290 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001291
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001292 // Skip over "-m".
Michael J. Spencerc6357102012-10-22 22:13:48 +00001293 assert(Name.startswith("m") && "Invalid feature name.");
1294 Name = Name.substr(1);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001295
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001296 bool IsNegative = Name.startswith("no-");
1297 if (IsNegative)
1298 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001299
Eli Friedmand18eeca2011-07-02 00:34:19 +00001300 unsigned& Prev = PrevFeature[Name];
1301 if (Prev)
1302 Features[Prev - 1] = 0;
1303 Prev = Features.size() + 1;
1304 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1305 }
1306 for (unsigned i = 0; i < Features.size(); i++) {
1307 if (Features[i]) {
1308 CmdArgs.push_back("-target-feature");
1309 CmdArgs.push_back(Features[i]);
1310 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001311 }
1312}
1313
Matthew Curtis33c95f12012-12-06 17:49:03 +00001314static inline bool HasPICArg(const ArgList &Args) {
1315 return Args.hasArg(options::OPT_fPIC)
1316 || Args.hasArg(options::OPT_fpic);
1317}
1318
1319static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1320 return Args.getLastArg(options::OPT_G,
1321 options::OPT_G_EQ,
1322 options::OPT_msmall_data_threshold_EQ);
1323}
1324
1325static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1326 std::string value;
1327 if (HasPICArg(Args))
1328 value = "0";
1329 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1330 value = A->getValue();
1331 A->claim();
1332 }
1333 return value;
1334}
1335
Tony Linthicum96319392011-12-12 21:14:55 +00001336void Clang::AddHexagonTargetArgs(const ArgList &Args,
1337 ArgStringList &CmdArgs) const {
1338 llvm::Triple Triple = getToolChain().getTriple();
1339
1340 CmdArgs.push_back("-target-cpu");
Matthew Curtis67814152012-12-06 14:16:43 +00001341 CmdArgs.push_back(Args.MakeArgString(
1342 "hexagon"
1343 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00001344 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001345 CmdArgs.push_back("-mqdsp6-compat");
1346 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001347
Matthew Curtis33c95f12012-12-06 17:49:03 +00001348 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1349 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001350 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001351 CmdArgs.push_back(Args.MakeArgString(
1352 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001353 }
1354
Sirish Pande5f9688b2012-05-10 20:19:54 +00001355 if (!Args.hasArg(options::OPT_fno_short_enums))
1356 CmdArgs.push_back("-fshort-enums");
1357 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1358 CmdArgs.push_back ("-mllvm");
1359 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1360 }
Tony Linthicum96319392011-12-12 21:14:55 +00001361 CmdArgs.push_back ("-mllvm");
1362 CmdArgs.push_back ("-machine-sink-split=0");
1363}
1364
Eric Christopher88b7cf02011-08-19 00:30:14 +00001365static bool
John McCall260611a2012-06-20 06:18:46 +00001366shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001367 const llvm::Triple &Triple) {
1368 // We use the zero-cost exception tables for Objective-C if the non-fragile
1369 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1370 // later.
John McCall260611a2012-06-20 06:18:46 +00001371 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001372 return true;
1373
Bob Wilson905c45f2011-10-14 05:03:44 +00001374 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001375 return false;
1376
Eric Christopheraa7333c2011-07-02 00:20:22 +00001377 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001378 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001379 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001380}
1381
Anders Carlsson15348ae2011-02-28 02:27:16 +00001382/// addExceptionArgs - Adds exception related arguments to the driver command
1383/// arguments. There's a master flag, -fexceptions and also language specific
1384/// flags to enable/disable C++ and Objective-C exceptions.
1385/// This makes it possible to for example disable C++ exceptions but enable
1386/// Objective-C exceptions.
1387static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1388 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001389 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001390 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001391 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001392 if (KernelOrKext) {
1393 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1394 // arguments now to avoid warnings about unused arguments.
1395 Args.ClaimAllArgs(options::OPT_fexceptions);
1396 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1397 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1398 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1399 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1400 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001401 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001402 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001403
1404 // Exceptions are enabled by default.
1405 bool ExceptionsEnabled = true;
1406
1407 // This keeps track of whether exceptions were explicitly turned on or off.
1408 bool DidHaveExplicitExceptionFlag = false;
1409
Rafael Espindolaf759df02009-10-01 13:33:33 +00001410 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1411 options::OPT_fno_exceptions)) {
1412 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001413 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001414 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001415 ExceptionsEnabled = false;
1416
1417 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001418 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001419
Anders Carlsson15348ae2011-02-28 02:27:16 +00001420 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001421
Anders Carlsson15348ae2011-02-28 02:27:16 +00001422 // Exception tables and cleanups can be enabled with -fexceptions even if the
1423 // language itself doesn't support exceptions.
1424 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1425 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001426
Daniel Dunbard47ea692011-03-17 23:28:31 +00001427 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1428 // is not necessarily sensible, but follows GCC.
1429 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001430 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001431 options::OPT_fno_objc_exceptions,
1432 true)) {
1433 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001434
Eric Christopher88b7cf02011-08-19 00:30:14 +00001435 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001436 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001437 }
1438
1439 if (types::isCXX(InputType)) {
1440 bool CXXExceptionsEnabled = ExceptionsEnabled;
1441
Eric Christopher88b7cf02011-08-19 00:30:14 +00001442 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1443 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001444 options::OPT_fexceptions,
1445 options::OPT_fno_exceptions)) {
1446 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1447 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001448 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001449 CXXExceptionsEnabled = false;
1450 }
1451
1452 if (CXXExceptionsEnabled) {
1453 CmdArgs.push_back("-fcxx-exceptions");
1454
1455 ShouldUseExceptionTables = true;
1456 }
1457 }
1458
1459 if (ShouldUseExceptionTables)
1460 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001461}
1462
Daniel Dunbarf4910132013-04-16 18:21:19 +00001463static bool ShouldDisableAutolink(const ArgList &Args,
1464 const ToolChain &TC) {
1465 bool Default = true;
1466 if (TC.getTriple().isOSDarwin()) {
1467 // The native darwin assembler doesn't support the linker_option directives,
1468 // so we disable them if we think the .s file will be passed to it.
1469 Default = TC.useIntegratedAs();
1470 }
1471 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1472 Default);
1473}
1474
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001475static bool ShouldDisableCFI(const ArgList &Args,
1476 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001477 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001478 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001479 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001480 // we disable them if we think the .s file will be passed to it.
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001481 Default = TC.useIntegratedAs();
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001482 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001483 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001484 options::OPT_fno_dwarf2_cfi_asm,
1485 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001486}
1487
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001488static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1489 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001490 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1491 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001492 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001493 return !UseDwarfDirectory;
1494}
1495
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001496/// \brief Check whether the given input tree contains any compilation actions.
1497static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001498 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001499 return true;
1500
1501 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1502 if (ContainsCompileAction(*it))
1503 return true;
1504
1505 return false;
1506}
1507
1508/// \brief Check if -relax-all should be passed to the internal assembler.
1509/// This is done by default when compiling non-assembler source with -O0.
1510static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1511 bool RelaxDefault = true;
1512
1513 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1514 RelaxDefault = A->getOption().matches(options::OPT_O0);
1515
1516 if (RelaxDefault) {
1517 RelaxDefault = false;
1518 for (ActionList::const_iterator it = C.getActions().begin(),
1519 ie = C.getActions().end(); it != ie; ++it) {
1520 if (ContainsCompileAction(*it)) {
1521 RelaxDefault = true;
1522 break;
1523 }
1524 }
1525 }
1526
1527 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1528 RelaxDefault);
1529}
1530
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00001531SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001532 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1533 AsanZeroBaseShadow(false) {
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001534 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1535 // at least once (possibly, disabled further).
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00001536 const Driver &D = TC.getDriver();
Richard Smithc4dabad2012-11-05 22:04:41 +00001537 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov3325b162012-11-28 17:34:24 +00001538 unsigned Add, Remove;
1539 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smithc4dabad2012-11-05 22:04:41 +00001540 continue;
Richard Smithc4dabad2012-11-05 22:04:41 +00001541 (*I)->claim();
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00001542 Kind |= Add;
1543 Kind &= ~Remove;
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001544 AllKinds |= Add;
Richard Smithc4dabad2012-11-05 22:04:41 +00001545 }
1546
Chad Rosier78d85b12013-01-29 23:31:22 +00001547 UbsanTrapOnError =
1548 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1549 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1550 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1551
1552 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1553 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1554 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1555 D.Diag(diag::err_drv_argument_not_allowed_with)
1556 << "-fcatch-undefined-behavior"
1557 << "-fno-sanitize-undefined-trap-on-error";
1558 }
1559
1560 // Warn about undefined sanitizer options that require runtime support.
1561 if (UbsanTrapOnError && notAllowedWithTrap()) {
1562 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1563 D.Diag(diag::err_drv_argument_not_allowed_with)
1564 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1565 << "-fcatch-undefined-behavior";
1566 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1567 options::OPT_fno_sanitize_undefined_trap_on_error,
1568 false))
1569 D.Diag(diag::err_drv_argument_not_allowed_with)
1570 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1571 << "-fsanitize-undefined-trap-on-error";
1572 }
1573
Richard Smithc4dabad2012-11-05 22:04:41 +00001574 // Only one runtime library can be used at once.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00001575 bool NeedsAsan = needsAsanRt();
1576 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001577 bool NeedsMsan = needsMsanRt();
Richard Smith05650372012-12-01 01:02:45 +00001578 if (NeedsAsan && NeedsTsan)
Richard Smithc4dabad2012-11-05 22:04:41 +00001579 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith05650372012-12-01 01:02:45 +00001580 << lastArgumentForKind(D, Args, NeedsAsanRt)
1581 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001582 if (NeedsAsan && NeedsMsan)
1583 D.Diag(diag::err_drv_argument_not_allowed_with)
1584 << lastArgumentForKind(D, Args, NeedsAsanRt)
1585 << lastArgumentForKind(D, Args, NeedsMsanRt);
1586 if (NeedsTsan && NeedsMsan)
1587 D.Diag(diag::err_drv_argument_not_allowed_with)
1588 << lastArgumentForKind(D, Args, NeedsTsanRt)
1589 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +00001590
1591 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001592 // explicitly contain -fsanitize=address (probably, turned off later in the
1593 // command line).
1594 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1595 D.Diag(diag::warn_drv_unused_sanitizer)
1596 << lastArgumentForKind(D, Args, AddressFull)
1597 << "-fsanitize=address";
Alexey Samsonov91ecfa62012-12-03 19:12:58 +00001598
1599 // Parse -f(no-)sanitize-blacklist options.
1600 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1601 options::OPT_fno_sanitize_blacklist)) {
1602 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1603 std::string BLPath = BLArg->getValue();
1604 bool BLExists = false;
1605 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1606 BlacklistFile = BLPath;
1607 else
1608 D.Diag(diag::err_drv_no_such_file) << BLPath;
1609 }
Alexey Samsonov24697b02013-02-19 11:25:29 +00001610 } else {
1611 // If no -fsanitize-blacklist option is specified, try to look up for
1612 // blacklist in the resource directory.
1613 std::string BLPath;
1614 bool BLExists = false;
1615 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1616 !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1617 BlacklistFile = BLPath;
Alexey Samsonov91ecfa62012-12-03 19:12:58 +00001618 }
Evgeniy Stepanov34ef11b2012-12-24 08:42:34 +00001619
1620 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001621 if (NeedsMsan)
Evgeniy Stepanov34ef11b2012-12-24 08:42:34 +00001622 MsanTrackOrigins =
1623 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1624 options::OPT_fno_sanitize_memory_track_origins,
1625 /* Default */false);
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001626
1627 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov4a1ea522013-04-09 07:27:44 +00001628 if (NeedsAsan) {
1629 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1630 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001631 AsanZeroBaseShadow =
Alexey Samsonov4a1ea522013-04-09 07:27:44 +00001632 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1633 options::OPT_fno_sanitize_address_zero_base_shadow,
1634 ZeroBaseShadowDefault);
1635 // Zero-base shadow is a requirement on Android.
1636 if (IsAndroid && !AsanZeroBaseShadow) {
1637 D.Diag(diag::err_drv_argument_not_allowed_with)
1638 << "-fno-sanitize-address-zero-base-shadow"
1639 << lastArgumentForKind(D, Args, Address);
1640 }
1641 }
Richard Smithc4dabad2012-11-05 22:04:41 +00001642}
1643
Alexey Samsonov86143042013-02-27 11:14:55 +00001644static void addSanitizerRTLinkFlagsLinux(
1645 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smith76e6e132013-03-23 00:30:08 +00001646 const StringRef Sanitizer, bool BeforeLibStdCXX,
1647 bool ExportSymbols = true) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001648 // Sanitizer runtime is located in the Linux library directory and
1649 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1650 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1651 llvm::sys::path::append(
1652 LibSanitizer, "lib", "linux",
1653 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smith61a574f2013-03-20 23:49:07 +00001654
Alexey Samsonov86143042013-02-27 11:14:55 +00001655 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1656 // etc.) so that the linker picks custom versions of the global 'operator
1657 // new' and 'operator delete' symbols. We take the extreme (but simple)
1658 // strategy of inserting it at the front of the link command. It also
1659 // needs to be forced to end up in the executable, so wrap it in
1660 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001661 SmallVector<const char *, 3> LibSanitizerArgs;
1662 LibSanitizerArgs.push_back("-whole-archive");
1663 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1664 LibSanitizerArgs.push_back("-no-whole-archive");
1665
1666 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1667 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1668
Alexey Samsonov86143042013-02-27 11:14:55 +00001669 CmdArgs.push_back("-lpthread");
1670 CmdArgs.push_back("-ldl");
Richard Smith76e6e132013-03-23 00:30:08 +00001671
1672 // If possible, use a dynamic symbols file to export the symbols from the
1673 // runtime library. If we can't do so, use -export-dynamic instead to export
1674 // all symbols from the binary.
1675 if (ExportSymbols) {
1676 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1677 CmdArgs.push_back(
1678 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1679 else
1680 CmdArgs.push_back("-export-dynamic");
1681 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001682}
1683
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001684/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1685/// This needs to be called before we add the C run-time (malloc, etc).
1686static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001687 ArgStringList &CmdArgs) {
Logan Chien94a71422012-09-02 09:30:11 +00001688 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001689 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1690 llvm::sys::path::append(LibAsan, "lib", "linux",
1691 (Twine("libclang_rt.asan-") +
1692 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001693 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001694 } else {
1695 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001696 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001697 }
1698 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001699}
1700
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001701/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1702/// This needs to be called before we add the C run-time (malloc, etc).
1703static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1704 ArgStringList &CmdArgs) {
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001705 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001706 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001707 }
1708}
1709
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001710/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1711/// This needs to be called before we add the C run-time (malloc, etc).
1712static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1713 ArgStringList &CmdArgs) {
1714 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001715 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001716 }
1717}
1718
Richard Smith4def70d2012-10-09 19:52:38 +00001719/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1720/// (Linux).
1721static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001722 ArgStringList &CmdArgs, bool IsCXX,
1723 bool HasOtherSanitizerRt) {
1724 if (Args.hasArg(options::OPT_shared))
1725 return;
1726
1727 // Need a copy of sanitizer_common. This could come from another sanitizer
1728 // runtime; if we're not including one, include our own copy.
1729 if (!HasOtherSanitizerRt)
Richard Smith76e6e132013-03-23 00:30:08 +00001730 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smith61a574f2013-03-20 23:49:07 +00001731
Alexey Samsonov86143042013-02-27 11:14:55 +00001732 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smith61a574f2013-03-20 23:49:07 +00001733
1734 // Only include the bits of the runtime which need a C++ ABI library if
1735 // we're linking in C++ mode.
1736 if (IsCXX)
1737 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001738}
1739
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001740static bool shouldUseFramePointer(const ArgList &Args,
1741 const llvm::Triple &Triple) {
1742 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1743 options::OPT_fomit_frame_pointer))
1744 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1745
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001746 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001747 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1748 Triple.getArch() == llvm::Triple::x86) &&
1749 Triple.getOS() == llvm::Triple::Linux) {
1750 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1751 if (!A->getOption().matches(options::OPT_O0))
1752 return false;
1753 }
1754
1755 return true;
1756}
1757
Eric Christopherd3e22df2013-04-03 01:58:53 +00001758static bool shouldUseLeafFramePointer(const ArgList &Args,
1759 const llvm::Triple &Triple) {
1760 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1761 options::OPT_momit_leaf_frame_pointer))
1762 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1763
1764 // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
1765 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1766 Triple.getArch() == llvm::Triple::x86) &&
1767 Triple.getOS() == llvm::Triple::Linux) {
1768 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1769 if (!A->getOption().matches(options::OPT_O0))
1770 return false;
1771 }
1772
1773 return true;
1774}
1775
Chandler Carruthd566df62012-12-17 21:40:04 +00001776/// If the PWD environment variable is set, add a CC1 option to specify the
1777/// debug compilation directory.
1778static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1779 if (const char *pwd = ::getenv("PWD")) {
1780 // GCC also verifies that stat(pwd) and stat(".") have the same inode
1781 // number. Not doing those because stats are slow, but we could.
1782 if (llvm::sys::path::is_absolute(pwd)) {
1783 std::string CompDir = pwd;
1784 CmdArgs.push_back("-fdebug-compilation-dir");
1785 CmdArgs.push_back(Args.MakeArgString(CompDir));
1786 }
1787 }
1788}
1789
Eric Christopher80190392013-02-22 20:12:52 +00001790static const char *SplitDebugName(const ArgList &Args,
1791 const InputInfoList &Inputs) {
1792 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1793 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1794 SmallString<128> T(FinalOutput->getValue());
1795 llvm::sys::path::replace_extension(T, "dwo");
1796 return Args.MakeArgString(T);
1797 } else {
1798 // Use the compilation dir.
1799 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1800 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1801 llvm::sys::path::replace_extension(F, "dwo");
1802 T += F;
1803 return Args.MakeArgString(F);
1804 }
1805}
1806
1807static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1808 const Tool &T, const JobAction &JA,
1809 const ArgList &Args, const InputInfo &Output,
1810 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001811 ArgStringList ExtractArgs;
1812 ExtractArgs.push_back("--extract-dwo");
1813
1814 ArgStringList StripArgs;
1815 StripArgs.push_back("--strip-dwo");
1816
1817 // Grabbing the output of the earlier compile step.
1818 StripArgs.push_back(Output.getFilename());
1819 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001820 ExtractArgs.push_back(OutFile);
1821
1822 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001823 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001824
1825 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001826 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001827
1828 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001829 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001830}
1831
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001832void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001833 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001834 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001835 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001836 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001837 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1838 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001839 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001840 ArgStringList CmdArgs;
1841
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001842 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1843
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001844 // Invoke ourselves in -cc1 mode.
1845 //
1846 // FIXME: Implement custom jobs for internal actions.
1847 CmdArgs.push_back("-cc1");
1848
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001849 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001850 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001851 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001852 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001853
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001854 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001855 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001856
Daniel Dunbar1d460332009-03-18 10:01:51 +00001857 if (isa<AnalyzeJobAction>(JA)) {
1858 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1859 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001860 } else if (isa<MigrateJobAction>(JA)) {
1861 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001862 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001863 if (Output.getType() == types::TY_Dependencies)
1864 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001865 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001866 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001867 if (Args.hasArg(options::OPT_rewrite_objc) &&
1868 !Args.hasArg(options::OPT_g_Group))
1869 CmdArgs.push_back("-P");
1870 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001871 } else if (isa<AssembleJobAction>(JA)) {
1872 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001873
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001874 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001875 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001876
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001877 // When using an integrated assembler, translate -Wa, and -Xassembler
1878 // options.
1879 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1880 options::OPT_Xassembler),
1881 ie = Args.filtered_end(); it != ie; ++it) {
1882 const Arg *A = *it;
1883 A->claim();
1884
1885 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001886 StringRef Value = A->getValue(i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001887
1888 if (Value == "-force_cpusubtype_ALL") {
1889 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001890 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001891 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001892 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001893 CmdArgs.push_back("-mllvm");
1894 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001895 } else if (Value == "--noexecstack") {
1896 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001897 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001898 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001899 << A->getOption().getName() << Value;
1900 }
1901 }
1902 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001903
1904 // Also ignore explicit -force_cpusubtype_ALL option.
1905 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001906 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001907 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001908 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001909
Aaron Ballman761322b2012-07-31 01:21:00 +00001910 if (JA.getType() == types::TY_Nothing)
1911 CmdArgs.push_back("-fsyntax-only");
1912 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001913 CmdArgs.push_back("-emit-pch");
1914 else
1915 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001916 } else {
1917 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001918
Daniel Dunbar1d460332009-03-18 10:01:51 +00001919 if (JA.getType() == types::TY_Nothing) {
1920 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001921 } else if (JA.getType() == types::TY_LLVM_IR ||
1922 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001923 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001924 } else if (JA.getType() == types::TY_LLVM_BC ||
1925 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001926 CmdArgs.push_back("-emit-llvm-bc");
1927 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001928 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001929 } else if (JA.getType() == types::TY_AST) {
1930 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00001931 } else if (JA.getType() == types::TY_ModuleFile) {
1932 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00001933 } else if (JA.getType() == types::TY_RewrittenObjC) {
1934 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001935 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001936 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1937 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001938 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001939 } else {
1940 assert(JA.getType() == types::TY_PP_Asm &&
1941 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001942 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001943 }
1944
Daniel Dunbar1d460332009-03-18 10:01:51 +00001945 // The make clang go fast button.
1946 CmdArgs.push_back("-disable-free");
1947
John McCallb689afb2010-02-13 03:50:24 +00001948 // Disable the verification pass in -asserts builds.
1949#ifdef NDEBUG
1950 CmdArgs.push_back("-disable-llvm-verifier");
1951#endif
1952
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001953 // Set the main file name, so that debug info works even with
1954 // -save-temps.
1955 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00001956 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001957
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001958 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00001959 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001960 if (Args.hasArg(options::OPT_static))
1961 CmdArgs.push_back("-static-define");
1962
Daniel Dunbar1d460332009-03-18 10:01:51 +00001963 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001964 // Enable region store model by default.
1965 CmdArgs.push_back("-analyzer-store=region");
1966
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001967 // Treat blocks as analysis entry points.
1968 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1969
Ted Kremenek51885072011-03-24 00:28:47 +00001970 CmdArgs.push_back("-analyzer-eagerly-assume");
1971
Daniel Dunbar1d460332009-03-18 10:01:51 +00001972 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001973 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001974 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001975
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001976 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1977 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001978
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001979 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001980 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001981
1982 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001983
Jordan Rosee449edc2013-04-05 17:55:07 +00001984 if (types::isCXX(Inputs[0].getType()))
1985 CmdArgs.push_back("-analyzer-checker=cplusplus");
1986
Ted Kremenek8dc05062012-01-26 02:27:38 +00001987 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00001988 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1989 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1990 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1991 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1992 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1993 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001994 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001995
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001996 // Set the output format. The default is plist, for (lame) historical
1997 // reasons.
1998 CmdArgs.push_back("-analyzer-output");
1999 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002000 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002001 else
2002 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002003
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002004 // Disable the presentation of standard compiler warnings when
2005 // using --analyze. We only want to show static analyzer diagnostics
2006 // or frontend errors.
2007 CmdArgs.push_back("-w");
2008
Daniel Dunbar1d460332009-03-18 10:01:51 +00002009 // Add -Xanalyzer arguments when running as analyzer.
2010 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002011 }
2012
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002013 CheckCodeGenerationOptions(D, Args);
2014
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002015 bool PIE = getToolChain().isPIEDefault();
2016 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002017 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002018
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002019 // For the PIC and PIE flag options, this logic is different from the
2020 // legacy logic in very old versions of GCC, as that logic was just
2021 // a bug no one had ever fixed. This logic is both more rational and
2022 // consistent with GCC's new logic now that the bugs are fixed. The last
2023 // argument relating to either PIC or PIE wins, and no other argument is
2024 // used. If the last argument is any flavor of the '-fno-...' arguments,
2025 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2026 // at the same level.
2027 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2028 options::OPT_fpic, options::OPT_fno_pic,
2029 options::OPT_fPIE, options::OPT_fno_PIE,
2030 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002031 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2032 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002033 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002034 if (LastPICArg) {
2035 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002036 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2037 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2038 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2039 PIC = PIE || O.matches(options::OPT_fPIC) ||
2040 O.matches(options::OPT_fpic);
2041 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2042 O.matches(options::OPT_fPIC);
2043 } else {
2044 PIE = PIC = false;
2045 }
2046 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002047 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002048
2049 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2050 // specified while enabling PIC enabled level 1 PIC, just force it back to
2051 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2052 // informal testing).
2053 if (PIC && getToolChain().getTriple().isOSDarwin())
2054 IsPICLevelTwo |= getToolChain().isPICDefault();
2055
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002056 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2057 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002058 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002059 if (KernelOrKext &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002060 (Triple.getOS() != llvm::Triple::IOS ||
2061 Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002062 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002063 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002064 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002065
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002066 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2067 // This is a very special mode. It trumps the other modes, almost no one
2068 // uses it, and it isn't even valid on any OS but Darwin.
2069 if (!getToolChain().getTriple().isOSDarwin())
2070 D.Diag(diag::err_drv_unsupported_opt_for_target)
2071 << A->getSpelling() << getToolChain().getTriple().str();
2072
2073 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2074
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002075 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002076 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002077
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002078 // Only a forced PIC mode can cause the actual compile to have PIC defines
2079 // etc., no flags are sufficient. This behavior was selected to closely
2080 // match that of llvm-gcc and Apple GCC before that.
2081 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2082 CmdArgs.push_back("-pic-level");
2083 CmdArgs.push_back("2");
2084 }
2085 } else {
2086 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2087 // handled in Clang's IRGen by the -pie-level flag.
2088 CmdArgs.push_back("-mrelocation-model");
2089 CmdArgs.push_back(PIC ? "pic" : "static");
2090
2091 if (PIC) {
2092 CmdArgs.push_back("-pic-level");
2093 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2094 if (PIE) {
2095 CmdArgs.push_back("-pie-level");
2096 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2097 }
2098 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002099 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002100
Tanya Lattner59876c22009-11-04 01:18:09 +00002101 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2102 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002103 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002104
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002105 // LLVM Code Generator Options.
2106
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002107 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2108 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002109 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002110 }
2111
Roman Divackycfe9af22011-03-01 17:40:53 +00002112 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2113 CmdArgs.push_back("-mrtd");
2114
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002115 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002116 CmdArgs.push_back("-mdisable-fp-elim");
2117 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2118 options::OPT_fno_zero_initialized_in_bss))
2119 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar398c6102011-02-04 02:20:39 +00002120 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
2121 options::OPT_fno_strict_aliasing,
2122 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002123 CmdArgs.push_back("-relaxed-aliasing");
Manman Renb37a73d2013-04-04 21:53:22 +00002124 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2125 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002126 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2127 false))
2128 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002129 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2130 options::OPT_fno_optimize_sibling_calls))
2131 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002132
Eric Christopher31056272013-04-04 06:29:47 +00002133 // Handle segmented stacks.
2134 if (Args.hasArg(options::OPT_fsplit_stack))
2135 CmdArgs.push_back("-split-stacks");
2136
Chandler Carruthabf07a72012-01-02 14:19:45 +00002137 // Handle various floating point optimization flags, mapping them to the
2138 // appropriate LLVM code generation flags. The pattern for all of these is to
2139 // default off the codegen optimizations, and if any flag enables them and no
2140 // flag disables them after the flag enabling them, enable the codegen
2141 // optimization. This is complicated by several "umbrella" flags.
2142 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002143 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002144 options::OPT_ffinite_math_only,
2145 options::OPT_fno_finite_math_only,
2146 options::OPT_fhonor_infinities,
2147 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002148 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2149 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002150 A->getOption().getID() != options::OPT_fhonor_infinities)
2151 CmdArgs.push_back("-menable-no-infs");
2152 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002153 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002154 options::OPT_ffinite_math_only,
2155 options::OPT_fno_finite_math_only,
2156 options::OPT_fhonor_nans,
2157 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002158 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2159 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002160 A->getOption().getID() != options::OPT_fhonor_nans)
2161 CmdArgs.push_back("-menable-no-nans");
2162
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002163 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2164 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruthabf07a72012-01-02 14:19:45 +00002165 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002166 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002167 options::OPT_fmath_errno,
Chandler Carruth4f50c502012-04-26 02:10:51 +00002168 options::OPT_fno_math_errno))
2169 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2170 if (MathErrno)
2171 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002172
2173 // There are several flags which require disabling very specific
2174 // optimizations. Any of these being disabled forces us to turn off the
2175 // entire set of LLVM optimizations, so collect them through all the flag
2176 // madness.
2177 bool AssociativeMath = false;
2178 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002179 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002180 options::OPT_funsafe_math_optimizations,
2181 options::OPT_fno_unsafe_math_optimizations,
2182 options::OPT_fassociative_math,
2183 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002184 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2185 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002186 A->getOption().getID() != options::OPT_fno_associative_math)
2187 AssociativeMath = true;
2188 bool ReciprocalMath = false;
2189 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002190 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002191 options::OPT_funsafe_math_optimizations,
2192 options::OPT_fno_unsafe_math_optimizations,
2193 options::OPT_freciprocal_math,
2194 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002195 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2196 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002197 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2198 ReciprocalMath = true;
2199 bool SignedZeros = true;
2200 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002201 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002202 options::OPT_funsafe_math_optimizations,
2203 options::OPT_fno_unsafe_math_optimizations,
2204 options::OPT_fsigned_zeros,
2205 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002206 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2207 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002208 A->getOption().getID() != options::OPT_fsigned_zeros)
2209 SignedZeros = false;
2210 bool TrappingMath = true;
2211 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002212 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002213 options::OPT_funsafe_math_optimizations,
2214 options::OPT_fno_unsafe_math_optimizations,
2215 options::OPT_ftrapping_math,
2216 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002217 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2218 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002219 A->getOption().getID() != options::OPT_ftrapping_math)
2220 TrappingMath = false;
2221 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2222 !TrappingMath)
2223 CmdArgs.push_back("-menable-unsafe-fp-math");
2224
Lang Hamesc9686712012-07-06 00:59:19 +00002225
2226 // Validate and pass through -fp-contract option.
2227 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002228 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002229 options::OPT_ffp_contract)) {
2230 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002231 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002232 if (Val == "fast" || Val == "on" || Val == "off") {
2233 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2234 } else {
2235 D.Diag(diag::err_drv_unsupported_option_argument)
2236 << A->getOption().getName() << Val;
2237 }
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002238 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesc9686712012-07-06 00:59:19 +00002239 // If fast-math is set then set the fp-contract mode to fast.
2240 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2241 }
2242 }
2243
Bob Wilson455e72e2012-07-19 03:52:53 +00002244 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2245 // and if we find them, tell the frontend to provide the appropriate
2246 // preprocessor macros. This is distinct from enabling any optimizations as
2247 // these options induce language changes which must survive serialization
2248 // and deserialization, etc.
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002249 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2250 if (A->getOption().matches(options::OPT_ffast_math))
2251 CmdArgs.push_back("-ffast-math");
2252 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2253 if (A->getOption().matches(options::OPT_ffinite_math_only))
2254 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002255
Daniel Dunbar1b718482010-05-14 22:00:22 +00002256 // Decide whether to use verbose asm. Verbose assembly is the default on
2257 // toolchains which have the integrated assembler on by default.
2258 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2259 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002260 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002261 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002262 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002263
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002264 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2265 CmdArgs.push_back("-mdebug-pass");
2266 CmdArgs.push_back("Structure");
2267 }
2268 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2269 CmdArgs.push_back("-mdebug-pass");
2270 CmdArgs.push_back("Arguments");
2271 }
2272
John McCalld0c2ec42010-02-19 02:45:38 +00002273 // Enable -mconstructor-aliases except on darwin, where we have to
2274 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002275 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002276 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002277
John McCall32096692011-03-18 02:56:14 +00002278 // Darwin's kernel doesn't support guard variables; just die if we
2279 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002280 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002281 CmdArgs.push_back("-fforbid-guard-variables");
2282
Douglas Gregor6f755502011-02-01 15:15:22 +00002283 if (Args.hasArg(options::OPT_mms_bitfields)) {
2284 CmdArgs.push_back("-mms-bitfields");
2285 }
John McCalld0c2ec42010-02-19 02:45:38 +00002286
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002287 // This is a coarse approximation of what llvm-gcc actually does, both
2288 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2289 // complicated ways.
2290 bool AsynchronousUnwindTables =
2291 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2292 options::OPT_fno_asynchronous_unwind_tables,
2293 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002294 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002295 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2296 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002297 CmdArgs.push_back("-munwind-tables");
2298
Chandler Carrutha6b25812012-11-21 23:40:23 +00002299 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002300
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002301 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2302 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002303 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002304 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002305
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002306 // FIXME: Handle -mtune=.
2307 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002308
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002309 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002310 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002311 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002312 }
2313
Daniel Dunbar6acda162009-09-09 22:33:08 +00002314 // Add target specific cpu and features flags.
2315 switch(getToolChain().getTriple().getArch()) {
2316 default:
2317 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002318
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002319 case llvm::Triple::arm:
2320 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002321 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002322 break;
2323
Eric Christophered734732010-03-02 02:41:08 +00002324 case llvm::Triple::mips:
2325 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002326 case llvm::Triple::mips64:
2327 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002328 AddMIPSTargetArgs(Args, CmdArgs);
2329 break;
2330
Hal Finkel02a84272012-06-11 22:35:19 +00002331 case llvm::Triple::ppc:
2332 case llvm::Triple::ppc64:
2333 AddPPCTargetArgs(Args, CmdArgs);
2334 break;
2335
Tom Stellarde25d2f62013-04-01 20:56:53 +00002336 case llvm::Triple::r600:
2337 AddR600TargetArgs(Args, CmdArgs);
2338 break;
2339
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002340 case llvm::Triple::sparc:
2341 AddSparcTargetArgs(Args, CmdArgs);
2342 break;
2343
Daniel Dunbar6acda162009-09-09 22:33:08 +00002344 case llvm::Triple::x86:
2345 case llvm::Triple::x86_64:
2346 AddX86TargetArgs(Args, CmdArgs);
2347 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002348
2349 case llvm::Triple::hexagon:
2350 AddHexagonTargetArgs(Args, CmdArgs);
2351 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002352 }
2353
Tony Linthicum96319392011-12-12 21:14:55 +00002354
2355
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002356 // Pass the linker version in use.
2357 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2358 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002359 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002360 }
2361
Eric Christopherd3e22df2013-04-03 01:58:53 +00002362 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002363 CmdArgs.push_back("-momit-leaf-frame-pointer");
2364
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002365 // Explicitly error on some things we know we don't support and can't just
2366 // ignore.
2367 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002368 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2369 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002370 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002371 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00002372 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002373 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2374 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002375 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002376 << Unsupported->getOption().getName();
2377 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002378 }
2379
Daniel Dunbar1d460332009-03-18 10:01:51 +00002380 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002381 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002382 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002383 CmdArgs.push_back("-header-include-file");
2384 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2385 D.CCPrintHeadersFilename : "-");
2386 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002387 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002388 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002389
Chad Rosier2b819102011-08-02 17:58:04 +00002390 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002391 CmdArgs.push_back("-diagnostic-log-file");
2392 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2393 D.CCLogDiagnosticsFilename : "-");
2394 }
2395
Eric Christopherc706c8e2013-02-05 07:29:57 +00002396 // Use the last option from "-g" group. "-gline-tables-only"
2397 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002398 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002399 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002400 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002401 CmdArgs.push_back("-gline-tables-only");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002402 else if (!A->getOption().matches(options::OPT_g0) &&
2403 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00002404 CmdArgs.push_back("-g");
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002405 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002406
Alexey Samsonov7f326072012-06-21 08:22:39 +00002407 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2408 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002409 if (Args.hasArg(options::OPT_gcolumn_info))
2410 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002411
Eric Christopherc706c8e2013-02-05 07:29:57 +00002412 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2413 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002414 // FIXME: Currently only works on Linux.
2415 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2416 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002417 CmdArgs.push_back("-g");
2418 CmdArgs.push_back("-backend-option");
2419 CmdArgs.push_back("-split-dwarf=Enable");
2420 }
2421
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002422 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2423 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2424
Chris Lattner7255a2d2010-06-22 00:03:40 +00002425 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2426
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002427 if (Args.hasArg(options::OPT_ftest_coverage) ||
2428 Args.hasArg(options::OPT_coverage))
2429 CmdArgs.push_back("-femit-coverage-notes");
2430 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2431 Args.hasArg(options::OPT_coverage))
2432 CmdArgs.push_back("-femit-coverage-data");
2433
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002434 if (C.getArgs().hasArg(options::OPT_c) ||
2435 C.getArgs().hasArg(options::OPT_S)) {
2436 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002437 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002438 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002439 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2440 if (const char *pwd = ::getenv("PWD")) {
2441 if (llvm::sys::path::is_absolute(pwd)) {
2442 SmallString<128> Pwd(pwd);
2443 llvm::sys::path::append(Pwd, CoverageFilename.str());
2444 CoverageFilename.swap(Pwd);
2445 }
2446 }
2447 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002448 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002449 }
2450 }
2451
Daniel Dunbara268fc02011-10-11 18:20:10 +00002452 // Pass options for controlling the default header search paths.
2453 if (Args.hasArg(options::OPT_nostdinc)) {
2454 CmdArgs.push_back("-nostdsysteminc");
2455 CmdArgs.push_back("-nobuiltininc");
2456 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002457 if (Args.hasArg(options::OPT_nostdlibinc))
2458 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002459 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2460 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2461 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002462
Daniel Dunbar5f122322009-12-15 01:02:52 +00002463 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002464 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002465 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002466
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002467 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2468
Ted Kremenek30660a82012-03-06 20:06:33 +00002469 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002470 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002471 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002472 options::OPT_ccc_arcmt_modify,
2473 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002474 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002475 switch (A->getOption().getID()) {
2476 default:
2477 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002478 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002479 CmdArgs.push_back("-arcmt-check");
2480 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002481 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002482 CmdArgs.push_back("-arcmt-modify");
2483 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002484 case options::OPT_ccc_arcmt_migrate:
2485 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002486 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002487 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002488
2489 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2490 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002491 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002492 }
2493 }
2494 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002495
Ted Kremenek30660a82012-03-06 20:06:33 +00002496 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2497 if (ARCMTEnabled) {
2498 D.Diag(diag::err_drv_argument_not_allowed_with)
2499 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2500 }
2501 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002502 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002503
2504 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2505 options::OPT_objcmt_migrate_subscripting)) {
2506 // None specified, means enable them all.
2507 CmdArgs.push_back("-objcmt-migrate-literals");
2508 CmdArgs.push_back("-objcmt-migrate-subscripting");
2509 } else {
2510 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2511 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2512 }
2513 }
2514
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002515 // Add preprocessing options like -I, -D, etc. if we are using the
2516 // preprocessor.
2517 //
2518 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002519 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002520 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002521
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002522 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2523 // that "The compiler can only warn and ignore the option if not recognized".
2524 // When building with ccache, it will pass -D options to clang even on
2525 // preprocessed inputs and configure concludes that -fPIC is not supported.
2526 Args.ClaimAllArgs(options::OPT_D);
2527
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002528 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002529 // others.
2530 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002531 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002532 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002533 else if (A->getOption().matches(options::OPT_O) &&
Richard Smith1d489cf2012-11-01 04:30:05 +00002534 A->getValue()[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002535 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002536 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002537 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002538 }
2539
Chad Rosierb2c08872012-12-12 20:06:31 +00002540 // Don't warn about unused -flto. This can happen when we're preprocessing or
2541 // precompiling.
2542 Args.ClaimAllArgs(options::OPT_flto);
2543
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002544 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002545 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2546 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002547 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002548 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002549
2550 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2551 // (-ansi is equivalent to -std=c89).
2552 //
2553 // If a std is supplied, only add -trigraphs if it follows the
2554 // option.
2555 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2556 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002557 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002558 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002559 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002560 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002561 else
2562 Std->render(Args, CmdArgs);
2563
Daniel Dunbar0e100312010-06-14 21:23:08 +00002564 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2565 options::OPT_trigraphs))
2566 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002567 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002568 } else {
2569 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002570 //
2571 // FIXME: Clang doesn't correctly handle -std= when the input language
2572 // doesn't match. For the time being just ignore this for C++ inputs;
2573 // eventually we want to do all the standard defaulting here instead of
2574 // splitting it between the driver and clang -cc1.
2575 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002576 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2577 "-std=", /*Joined=*/true);
2578 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2579 CmdArgs.push_back("-std=c++11");
2580
Daniel Dunbard573d262009-04-07 22:13:21 +00002581 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002582 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002583
Chandler Carruth50465d12011-04-23 06:30:43 +00002584 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2585 // '-fconst-strings'; this better indicates its actual behavior.
2586 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2587 false)) {
2588 // For perfect compatibility with GCC, we do this even in the presence of
2589 // '-w'. This flag names something other than a warning for GCC.
2590 CmdArgs.push_back("-fconst-strings");
2591 }
2592
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002593 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002594 // during C++ compilation, which it is by default. GCC keeps this define even
2595 // in the presence of '-w', match this behavior bug-for-bug.
2596 if (types::isCXX(InputType) &&
2597 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2598 true)) {
2599 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002600 }
2601
Chandler Carruthc304ba32010-05-22 02:21:53 +00002602 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2603 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2604 if (Asm->getOption().matches(options::OPT_fasm))
2605 CmdArgs.push_back("-fgnu-keywords");
2606 else
2607 CmdArgs.push_back("-fno-gnu-keywords");
2608 }
2609
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002610 if (ShouldDisableCFI(Args, getToolChain()))
2611 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002612
Nick Lewyckyea523d72011-10-17 23:05:52 +00002613 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2614 CmdArgs.push_back("-fno-dwarf-directory-asm");
2615
Daniel Dunbarf4910132013-04-16 18:21:19 +00002616 if (ShouldDisableAutolink(Args, getToolChain()))
2617 CmdArgs.push_back("-fno-autolink");
2618
Chandler Carruthd566df62012-12-17 21:40:04 +00002619 // Add in -fdebug-compilation-dir if necessary.
2620 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002621
Richard Smithc18c4232011-11-21 19:36:32 +00002622 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2623 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002624 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002625 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002626 }
2627
Richard Smithc18c4232011-11-21 19:36:32 +00002628 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2629 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002630 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002631 }
2632
Richard Smith9e738cc2013-02-22 01:59:51 +00002633 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2634 CmdArgs.push_back("-fbracket-depth");
2635 CmdArgs.push_back(A->getValue());
2636 }
2637
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002638 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2639 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002640 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002641 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002642 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2643 } else
2644 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002645 }
2646
Nuno Lopesb3198a82012-05-08 22:10:46 +00002647
Michael J. Spencerc6357102012-10-22 22:13:48 +00002648 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002649 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002650
Daniel Dunbar294691e2009-11-04 06:24:38 +00002651 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2652 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002653 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002654 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002655
Chris Lattner124fca52010-01-09 21:54:33 +00002656 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2657 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002658 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002659 }
2660
Chris Lattner0f0c9632010-04-07 20:49:23 +00002661 CmdArgs.push_back("-ferror-limit");
2662 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002663 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002664 else
2665 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002666
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002667 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2668 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002669 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002670 }
2671
2672 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2673 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002674 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002675 }
2676
Richard Smith08d6e032011-12-16 19:06:07 +00002677 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2678 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002679 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002680 }
2681
Daniel Dunbar55efe142009-11-04 06:24:47 +00002682 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002683 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002684 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002685 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002686 } else {
2687 // If -fmessage-length=N was not specified, determine whether this is a
2688 // terminal and, if so, implicitly define -fmessage-length appropriately.
2689 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002690 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002691 }
2692
John McCalla880b192013-02-19 01:57:35 +00002693 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2694 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2695 options::OPT_fvisibility_ms_compat)) {
2696 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2697 CmdArgs.push_back("-fvisibility");
2698 CmdArgs.push_back(A->getValue());
2699 } else {
2700 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2701 CmdArgs.push_back("-fvisibility");
2702 CmdArgs.push_back("hidden");
2703 CmdArgs.push_back("-ftype-visibility");
2704 CmdArgs.push_back("default");
2705 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002706 }
2707
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002708 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002709
Hans Wennborgde981f32012-06-28 08:01:44 +00002710 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2711
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002712 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002713 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2714 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002715 CmdArgs.push_back("-ffreestanding");
2716
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002717 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002718 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002719 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002720 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002721 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002722 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002723 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002724 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2725 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002726
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002727 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00002728 Sanitize.addArgs(Args, CmdArgs);
2729
Will Dietz2d382d12012-12-30 20:53:28 +00002730 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2731 options::OPT_fno_sanitize_recover,
2732 true))
2733 CmdArgs.push_back("-fno-sanitize-recover");
2734
Chad Rosier78d85b12013-01-29 23:31:22 +00002735 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2736 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2737 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2738 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2739
Eric Christopher98654c92013-02-19 06:16:53 +00002740 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002741 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2742 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2743 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2744 D.Diag(diag::err_drv_argument_only_allowed_with)
2745 << A->getAsString(Args) << "ppc/ppc64";
2746
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002747 if (getToolChain().SupportsProfiling())
2748 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002749
2750 // -flax-vector-conversions is default.
2751 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2752 options::OPT_fno_lax_vector_conversions))
2753 CmdArgs.push_back("-fno-lax-vector-conversions");
2754
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002755 if (Args.getLastArg(options::OPT_fapple_kext))
2756 CmdArgs.push_back("-fapple-kext");
2757
David Blaikie940152f2012-06-14 18:55:27 +00002758 if (Args.hasFlag(options::OPT_frewrite_includes,
2759 options::OPT_fno_rewrite_includes, false))
2760 CmdArgs.push_back("-frewrite-includes");
2761
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002762 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002763 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002764 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002765 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2766 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002767
2768 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2769 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002770 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002771 }
2772
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002773 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002774
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002775 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2776 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2777 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2778 options::OPT_fno_wrapv)) {
2779 if (A->getOption().matches(options::OPT_fwrapv))
2780 CmdArgs.push_back("-fwrapv");
2781 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2782 options::OPT_fno_strict_overflow)) {
2783 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2784 CmdArgs.push_back("-fwrapv");
2785 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002786 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002787 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002788
Daniel Dunbar5345c392009-09-03 04:54:28 +00002789 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2790
Mahesha Sf3b52312012-10-27 07:47:56 +00002791
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002792 // -stack-protector=0 is default.
2793 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002794 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2795 options::OPT_fstack_protector_all,
2796 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002797 if (A->getOption().matches(options::OPT_fstack_protector))
2798 StackProtectorLevel = 1;
2799 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2800 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002801 } else {
2802 StackProtectorLevel =
2803 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2804 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002805 if (StackProtectorLevel) {
2806 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002807 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002808 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002809
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002810 // --param ssp-buffer-size=
2811 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2812 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002813 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002814 if (Str.startswith("ssp-buffer-size=")) {
2815 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002816 CmdArgs.push_back("-stack-protector-buffer-size");
2817 // FIXME: Verify the argument is a valid integer.
2818 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002819 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002820 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002821 }
Bill Wendling45483f72009-06-28 07:36:13 +00002822 }
2823
Nick Lewycky4e785c92011-12-06 03:33:03 +00002824 // Translate -mstackrealign
2825 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2826 false)) {
2827 CmdArgs.push_back("-backend-option");
2828 CmdArgs.push_back("-force-align-stack");
2829 }
2830 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2831 false)) {
2832 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2833 }
2834
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002835 if (Args.hasArg(options::OPT_mstack_alignment)) {
2836 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2837 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002838 }
Chad Rosier586a0612012-11-29 00:42:06 +00002839 // -mkernel implies -mstrict-align; don't add the redundant option.
2840 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosier485577d2012-11-09 18:27:01 +00002841 CmdArgs.push_back("-backend-option");
2842 CmdArgs.push_back("-arm-strict-align");
Chad Rosier7e293272012-11-09 17:29:19 +00002843 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002844
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002845 // Forward -f options with positive and negative forms; we translate
2846 // these by hand.
2847
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002848 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002849 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002850 CmdArgs.push_back("-fapple-kext");
2851 if (!Args.hasArg(options::OPT_fbuiltin))
2852 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002853 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002854 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002855 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002856 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002857 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002858
Nuno Lopesfc284482009-12-16 16:59:22 +00002859 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2860 options::OPT_fno_assume_sane_operator_new))
2861 CmdArgs.push_back("-fno-assume-sane-operator-new");
2862
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002863 // -fblocks=0 is default.
2864 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002865 getToolChain().IsBlocksDefault()) ||
2866 (Args.hasArg(options::OPT_fgnu_runtime) &&
2867 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2868 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002869 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002870
2871 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2872 !getToolChain().hasBlocksRuntime())
2873 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002874 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002875
Douglas Gregor64554ba2012-01-18 15:19:58 +00002876 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2877 // users must also pass -fcxx-modules. The latter flag will disappear once the
2878 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00002879 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00002880 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2881 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2882 options::OPT_fno_cxx_modules,
2883 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00002884 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00002885 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00002886 HaveModules = true;
2887 }
2888 }
2889
Douglas Gregor953a61f2013-02-07 19:01:24 +00002890 // If a module path was provided, pass it along. Otherwise, use a temporary
2891 // directory.
2892 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2893 A->claim();
2894 if (HaveModules) {
2895 A->render(Args, CmdArgs);
2896 }
2897 } else if (HaveModules) {
2898 SmallString<128> DefaultModuleCache;
2899 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2900 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00002901 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
2902 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00002903 const char Arg[] = "-fmodules-cache-path=";
2904 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2905 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00002906 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2907 }
2908
2909 // Pass through all -fmodules-ignore-macro arguments.
2910 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00002911 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
2912 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00002913
John McCall32579cf2010-04-09 19:12:06 +00002914 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00002915 if (Args.hasFlag(options::OPT_fno_access_control,
2916 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00002917 false))
John McCall7002f4c2010-04-09 19:03:51 +00002918 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00002919
Anders Carlssona4c24752010-11-21 00:09:52 +00002920 // -felide-constructors is the default.
2921 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2922 options::OPT_felide_constructors,
2923 false))
2924 CmdArgs.push_back("-fno-elide-constructors");
2925
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002926 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002927 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00002928 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00002929 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00002930
Richard Smithc4dabad2012-11-05 22:04:41 +00002931 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00002932 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00002933 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00002934 Args.getLastArg(options::OPT_mkernel,
2935 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00002936 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00002937 D.Diag(diag::err_drv_argument_not_allowed_with)
2938 << "-fsanitize=vptr" << NoRttiArg;
2939 }
2940 }
2941
Tony Linthicum96319392011-12-12 21:14:55 +00002942 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002943 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00002944 options::OPT_fno_short_enums,
2945 getToolChain().getTriple().getArch() ==
2946 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002947 CmdArgs.push_back("-fshort-enums");
2948
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002949 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002950 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002951 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00002952 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00002953
Anders Carlssona508b7d2010-02-06 23:23:06 +00002954 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00002955 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00002956 options::OPT_fno_threadsafe_statics))
2957 CmdArgs.push_back("-fno-threadsafe-statics");
2958
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002959 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002960 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2961 options::OPT_fno_use_cxa_atexit,
2962 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00002963 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00002964 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2965 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002966 CmdArgs.push_back("-fno-use-cxa-atexit");
2967
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002968 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002969 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002970 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2971 CmdArgs.push_back("-fms-extensions");
2972
Francois Pichetae556082011-09-17 04:32:15 +00002973 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00002974 if (Args.hasFlag(options::OPT_fms_compatibility,
2975 options::OPT_fno_ms_compatibility,
2976 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2977 Args.hasFlag(options::OPT_fms_extensions,
2978 options::OPT_fno_ms_extensions,
2979 true))))
Francois Pichetae556082011-09-17 04:32:15 +00002980 CmdArgs.push_back("-fms-compatibility");
2981
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002982 // -fmsc-version=1300 is default.
2983 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2984 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2985 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002986 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002987 if (msc_ver.empty())
2988 CmdArgs.push_back("-fmsc-version=1300");
2989 else
2990 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2991 }
2992
2993
Eric Christophercfc01e42013-02-18 00:38:31 +00002994 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00002995 if (Args.hasFlag(options::OPT_fborland_extensions,
2996 options::OPT_fno_borland_extensions, false))
2997 CmdArgs.push_back("-fborland-extensions");
2998
Francois Pichet8efcc012011-09-01 16:38:08 +00002999 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3000 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003001 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3002 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003003 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003004 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003005
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003006 // -fgnu-keywords default varies depending on language; only pass if
3007 // specified.
3008 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003009 options::OPT_fno_gnu_keywords))
3010 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003011
Rafael Espindola01ba8542011-06-02 17:30:53 +00003012 if (Args.hasFlag(options::OPT_fgnu89_inline,
3013 options::OPT_fno_gnu89_inline,
3014 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003015 CmdArgs.push_back("-fgnu89-inline");
3016
Chad Rosierfc055f92012-03-15 22:31:42 +00003017 if (Args.hasArg(options::OPT_fno_inline))
3018 CmdArgs.push_back("-fno-inline");
3019
Chad Rosier634a4b12012-03-06 21:17:19 +00003020 if (Args.hasArg(options::OPT_fno_inline_functions))
3021 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003022
John McCall260611a2012-06-20 06:18:46 +00003023 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003024
John McCall260611a2012-06-20 06:18:46 +00003025 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3026 // legacy is the default.
3027 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003028 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3029 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003030 objcRuntime.isLegacyDispatchDefaultForArch(
3031 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003032 if (getToolChain().UseObjCMixedDispatch())
3033 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3034 else
3035 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3036 }
3037 }
3038
Nico Weberdf423542012-03-09 21:19:44 +00003039 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3040 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00003041 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003042 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3043 }
3044
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003045 // -fencode-extended-block-signature=1 is default.
3046 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3047 CmdArgs.push_back("-fencode-extended-block-signature");
3048 }
3049
John McCall9f084a32011-07-06 00:26:06 +00003050 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3051 // NOTE: This logic is duplicated in ToolChains.cpp.
3052 bool ARC = isObjCAutoRefCount(Args);
3053 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003054 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003055
John McCall9f084a32011-07-06 00:26:06 +00003056 CmdArgs.push_back("-fobjc-arc");
3057
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003058 // FIXME: It seems like this entire block, and several around it should be
3059 // wrapped in isObjC, but for now we just use it here as this is where it
3060 // was being used previously.
3061 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3062 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3063 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3064 else
3065 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3066 }
3067
John McCall9f084a32011-07-06 00:26:06 +00003068 // Allow the user to enable full exceptions code emission.
3069 // We define off for Objective-CC, on for Objective-C++.
3070 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3071 options::OPT_fno_objc_arc_exceptions,
3072 /*default*/ types::isCXX(InputType)))
3073 CmdArgs.push_back("-fobjc-arc-exceptions");
3074 }
3075
3076 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3077 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003078 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003079 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003080
John McCall9f084a32011-07-06 00:26:06 +00003081 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3082 // takes precedence.
3083 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3084 if (!GCArg)
3085 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3086 if (GCArg) {
3087 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003088 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003089 << GCArg->getAsString(Args);
3090 } else if (getToolChain().SupportsObjCGC()) {
3091 GCArg->render(Args, CmdArgs);
3092 } else {
3093 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003094 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003095 << GCArg->getAsString(Args);
3096 }
3097 }
3098
John McCalld71315c2011-06-22 00:53:57 +00003099 // Add exception args.
3100 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003101 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003102
3103 if (getToolChain().UseSjLjExceptions())
3104 CmdArgs.push_back("-fsjlj-exceptions");
3105
3106 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003107 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3108 options::OPT_fno_assume_sane_operator_new))
3109 CmdArgs.push_back("-fno-assume-sane-operator-new");
3110
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003111 // -fconstant-cfstrings is default, and may be subject to argument translation
3112 // on Darwin.
3113 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3114 options::OPT_fno_constant_cfstrings) ||
3115 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3116 options::OPT_mno_constant_cfstrings))
3117 CmdArgs.push_back("-fno-constant-cfstrings");
3118
John Thompsona6fda122009-11-05 20:14:16 +00003119 // -fshort-wchar default varies depending on platform; only
3120 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003121 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3122 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003123
Daniel Dunbaree848a72009-10-29 02:39:57 +00003124 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3125 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00003126 //
3127 // FIXME: This is gross; that translation should be pulled from the
3128 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003129 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003130 options::OPT_fno_pascal_strings,
3131 false) ||
3132 Args.hasFlag(options::OPT_mpascal_strings,
3133 options::OPT_mno_pascal_strings,
3134 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003135 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003136
Daniel Dunbar88934e82011-10-05 21:04:55 +00003137 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3138 // -fno-pack-struct doesn't apply to -fpack-struct=.
3139 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003140 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003141 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003142 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003143 } else if (Args.hasFlag(options::OPT_fpack_struct,
3144 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003145 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003146 }
3147
Eric Christopher6c7db892013-02-18 01:16:37 +00003148 if (KernelOrKext) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003149 if (!Args.hasArg(options::OPT_fcommon))
3150 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003151 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003152 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003153
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003154 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003155 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003156 CmdArgs.push_back("-fno-common");
3157
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003158 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003159 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003160 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003161 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003162 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003163 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3164
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003165 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3166 if (!Args.hasFlag(options::OPT_ffor_scope,
3167 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003168 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003169 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3170
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003171 // -fcaret-diagnostics is default.
3172 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3173 options::OPT_fno_caret_diagnostics, true))
3174 CmdArgs.push_back("-fno-caret-diagnostics");
3175
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003176 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003177 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003178 options::OPT_fno_diagnostics_fixit_info))
3179 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003180
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003181 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003182 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003183 options::OPT_fno_diagnostics_show_option))
3184 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003185
Chris Lattner6fbe8392010-05-04 21:55:25 +00003186 if (const Arg *A =
3187 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3188 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003189 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003190 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003191
Douglas Gregorc9471b02011-05-21 17:07:29 +00003192 if (const Arg *A =
3193 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3194 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003195 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003196 }
3197
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003198 if (Arg *A = Args.getLastArg(
3199 options::OPT_fdiagnostics_show_note_include_stack,
3200 options::OPT_fno_diagnostics_show_note_include_stack)) {
3201 if (A->getOption().matches(
3202 options::OPT_fdiagnostics_show_note_include_stack))
3203 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3204 else
3205 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3206 }
3207
Daniel Dunbar838be482009-11-04 06:24:57 +00003208 // Color diagnostics are the default, unless the terminal doesn't support
3209 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003210 // Support both clang's -f[no-]color-diagnostics and gcc's
3211 // -f[no-]diagnostics-colors[=never|always|auto].
3212 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3213 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3214 it != ie; ++it) {
3215 const Option &O = (*it)->getOption();
3216 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3217 !O.matches(options::OPT_fdiagnostics_color) &&
3218 !O.matches(options::OPT_fno_color_diagnostics) &&
3219 !O.matches(options::OPT_fno_diagnostics_color) &&
3220 !O.matches(options::OPT_fdiagnostics_color_EQ))
3221 continue;
3222
3223 (*it)->claim();
3224 if (O.matches(options::OPT_fcolor_diagnostics) ||
3225 O.matches(options::OPT_fdiagnostics_color)) {
3226 ShowColors = Colors_On;
3227 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3228 O.matches(options::OPT_fno_diagnostics_color)) {
3229 ShowColors = Colors_Off;
3230 } else {
3231 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3232 StringRef value((*it)->getValue());
3233 if (value == "always")
3234 ShowColors = Colors_On;
3235 else if (value == "never")
3236 ShowColors = Colors_Off;
3237 else if (value == "auto")
3238 ShowColors = Colors_Auto;
3239 else
3240 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3241 << ("-fdiagnostics-color=" + value).str();
3242 }
3243 }
3244 if (ShowColors == Colors_On ||
3245 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003246 CmdArgs.push_back("-fcolor-diagnostics");
3247
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003248 if (!Args.hasFlag(options::OPT_fshow_source_location,
3249 options::OPT_fno_show_source_location))
3250 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003251
Douglas Gregorc9471b02011-05-21 17:07:29 +00003252 if (!Args.hasFlag(options::OPT_fshow_column,
3253 options::OPT_fno_show_column,
3254 true))
3255 CmdArgs.push_back("-fno-show-column");
3256
Douglas Gregora0068fc2010-07-09 17:35:33 +00003257 if (!Args.hasFlag(options::OPT_fspell_checking,
3258 options::OPT_fno_spell_checking))
3259 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003260
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003261
Chad Rosier15490fd2012-12-05 21:08:21 +00003262 // -fno-asm-blocks is default.
3263 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3264 false))
3265 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003266
Nadav Rotem0f6ef282012-12-18 23:10:16 +00003267 // -fvectorize is default.
Chad Rosierc04d0932012-12-11 17:12:28 +00003268 if (Args.hasFlag(options::OPT_fvectorize,
Nadav Rotem0f6ef282012-12-18 23:10:16 +00003269 options::OPT_fno_vectorize, true)) {
Chad Rosierc04d0932012-12-11 17:12:28 +00003270 CmdArgs.push_back("-backend-option");
3271 CmdArgs.push_back("-vectorize-loops");
3272 }
3273
Hal Finkel443c9992012-12-11 19:59:32 +00003274 // -fno-slp-vectorize is default.
3275 if (Args.hasFlag(options::OPT_fslp_vectorize,
3276 options::OPT_fno_slp_vectorize, false)) {
3277 CmdArgs.push_back("-backend-option");
Nadav Rotem50ea9632013-04-15 04:57:18 +00003278 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003279 }
3280
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003281 // -fno-slp-vectorize-aggressive is default.
3282 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3283 options::OPT_fno_slp_vectorize_aggressive, false)) {
3284 CmdArgs.push_back("-backend-option");
3285 CmdArgs.push_back("-vectorize-slp-aggressive");
3286 }
3287
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003288 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3289 A->render(Args, CmdArgs);
3290
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003291 // -fdollars-in-identifiers default varies depending on platform and
3292 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003293 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003294 options::OPT_fno_dollars_in_identifiers)) {
3295 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003296 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003297 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003298 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003299 }
3300
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003301 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3302 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003303 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003304 options::OPT_fno_unit_at_a_time)) {
3305 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003306 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003307 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003308
Eli Friedman19bda3a2011-11-02 01:53:16 +00003309 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3310 options::OPT_fno_apple_pragma_pack, false))
3311 CmdArgs.push_back("-fapple-pragma-pack");
3312
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003313 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003314 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003315 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003316#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003317 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003318 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3319 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3320 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3321 CmdArgs.push_back("-fno-builtin-strcat");
3322 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3323 CmdArgs.push_back("-fno-builtin-strcpy");
3324 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003325#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003326
Daniel Dunbard98750f2011-03-18 21:23:40 +00003327 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003328 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003329 options::OPT_traditional_cpp)) {
3330 if (isa<PreprocessJobAction>(JA))
3331 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003332 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003333 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003334 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003335
Daniel Dunbar1d460332009-03-18 10:01:51 +00003336 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003337 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003338
3339 // Handle serialized diagnostics.
3340 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3341 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003342 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003343 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003344
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003345 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3346 CmdArgs.push_back("-fretain-comments-from-system-headers");
3347
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003348 // Forward -fcomment-block-commands to -cc1.
3349 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003350 // Forward -fparse-all-comments to -cc1.
3351 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003352
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003353 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3354 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003355 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003356 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3357 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003358 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003359
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003360 // We translate this by hand to the -cc1 argument, since nightly test uses
3361 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003362 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003363 CmdArgs.push_back("-disable-llvm-optzns");
3364 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003365 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003366 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003367
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003368 if (Output.getType() == types::TY_Dependencies) {
3369 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003370 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003371 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003372 CmdArgs.push_back(Output.getFilename());
3373 } else {
3374 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003375 }
3376
Daniel Dunbar1d460332009-03-18 10:01:51 +00003377 for (InputInfoList::const_iterator
3378 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3379 const InputInfo &II = *it;
3380 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003381 if (Args.hasArg(options::OPT_rewrite_objc))
3382 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3383 else
3384 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003385 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003386 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003387 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003388 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003389 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003390
Chris Lattnere6113de2009-11-03 19:50:27 +00003391 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3392
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003393 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003394
3395 // Optionally embed the -cc1 level arguments into the debug info, for build
3396 // analysis.
3397 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003398 ArgStringList OriginalArgs;
3399 for (ArgList::const_iterator it = Args.begin(),
3400 ie = Args.end(); it != ie; ++it)
3401 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003402
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003403 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003404 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003405 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003406 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003407 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003408 }
3409 CmdArgs.push_back("-dwarf-debug-flags");
3410 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3411 }
3412
Eric Christopher80190392013-02-22 20:12:52 +00003413 // Add the split debug info name to the command lines here so we
3414 // can propagate it to the backend.
3415 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3416 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherff971d72013-02-22 23:50:16 +00003417 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003418 const char *SplitDwarfOut;
3419 if (SplitDwarf) {
3420 CmdArgs.push_back("-split-dwarf-file");
3421 SplitDwarfOut = SplitDebugName(Args, Inputs);
3422 CmdArgs.push_back(SplitDwarfOut);
3423 }
3424
3425 // Finally add the compile command to the compilation.
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003426 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00003427
Eric Christopherff971d72013-02-22 23:50:16 +00003428 // Handle the debug info splitting at object creation time if we're
3429 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003430 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003431 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003432 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003433
Roman Divackybe4c8702011-02-10 16:52:03 +00003434 if (Arg *A = Args.getLastArg(options::OPT_pg))
3435 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003436 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003437 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003438
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003439 // Claim some arguments which clang supports automatically.
3440
Daniel Dunbarf4046862010-04-15 06:18:42 +00003441 // -fpch-preprocess is used with gcc to add a special marker in the output to
3442 // include the PCH file. Clang's PTH solution is completely transparent, so we
3443 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003444 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003445
Daniel Dunbara880db02009-03-23 19:03:36 +00003446 // Claim some arguments which clang doesn't support, but we don't
3447 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003448 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3449 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003450
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003451 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003452 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003453 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003454}
3455
Jim Grosbachfc308292012-02-10 20:37:10 +00003456void ClangAs::AddARMTargetArgs(const ArgList &Args,
3457 ArgStringList &CmdArgs) const {
3458 const Driver &D = getToolChain().getDriver();
3459 llvm::Triple Triple = getToolChain().getTriple();
3460
3461 // Set the CPU based on -march= and -mcpu=.
3462 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00003463 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00003464
3465 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00003466 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00003467 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00003468
3469 // Honor -mfpmath=.
3470 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00003471 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00003472}
3473
Benjamin Kramerefc5b672013-02-22 20:55:17 +00003474void ClangAs::AddX86TargetArgs(const ArgList &Args,
3475 ArgStringList &CmdArgs) const {
3476 // Set the CPU based on -march=.
3477 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3478 CmdArgs.push_back("-target-cpu");
3479 CmdArgs.push_back(CPUName);
3480 }
3481}
3482
John McCall260611a2012-06-20 06:18:46 +00003483/// Add options related to the Objective-C runtime/ABI.
3484///
3485/// Returns true if the runtime is non-fragile.
3486ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3487 ArgStringList &cmdArgs,
3488 RewriteKind rewriteKind) const {
3489 // Look for the controlling runtime option.
3490 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3491 options::OPT_fgnu_runtime,
3492 options::OPT_fobjc_runtime_EQ);
3493
3494 // Just forward -fobjc-runtime= to the frontend. This supercedes
3495 // options about fragility.
3496 if (runtimeArg &&
3497 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3498 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003499 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003500 if (runtime.tryParse(value)) {
3501 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3502 << value;
3503 }
3504
3505 runtimeArg->render(args, cmdArgs);
3506 return runtime;
3507 }
3508
3509 // Otherwise, we'll need the ABI "version". Version numbers are
3510 // slightly confusing for historical reasons:
3511 // 1 - Traditional "fragile" ABI
3512 // 2 - Non-fragile ABI, version 1
3513 // 3 - Non-fragile ABI, version 2
3514 unsigned objcABIVersion = 1;
3515 // If -fobjc-abi-version= is present, use that to set the version.
3516 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003517 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003518 if (value == "1")
3519 objcABIVersion = 1;
3520 else if (value == "2")
3521 objcABIVersion = 2;
3522 else if (value == "3")
3523 objcABIVersion = 3;
3524 else
3525 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3526 << value;
3527 } else {
3528 // Otherwise, determine if we are using the non-fragile ABI.
3529 bool nonFragileABIIsDefault =
3530 (rewriteKind == RK_NonFragile ||
3531 (rewriteKind == RK_None &&
3532 getToolChain().IsObjCNonFragileABIDefault()));
3533 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3534 options::OPT_fno_objc_nonfragile_abi,
3535 nonFragileABIIsDefault)) {
3536 // Determine the non-fragile ABI version to use.
3537#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3538 unsigned nonFragileABIVersion = 1;
3539#else
3540 unsigned nonFragileABIVersion = 2;
3541#endif
3542
3543 if (Arg *abiArg = args.getLastArg(
3544 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003545 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003546 if (value == "1")
3547 nonFragileABIVersion = 1;
3548 else if (value == "2")
3549 nonFragileABIVersion = 2;
3550 else
3551 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3552 << value;
3553 }
3554
3555 objcABIVersion = 1 + nonFragileABIVersion;
3556 } else {
3557 objcABIVersion = 1;
3558 }
3559 }
3560
3561 // We don't actually care about the ABI version other than whether
3562 // it's non-fragile.
3563 bool isNonFragile = objcABIVersion != 1;
3564
3565 // If we have no runtime argument, ask the toolchain for its default runtime.
3566 // However, the rewriter only really supports the Mac runtime, so assume that.
3567 ObjCRuntime runtime;
3568 if (!runtimeArg) {
3569 switch (rewriteKind) {
3570 case RK_None:
3571 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3572 break;
3573 case RK_Fragile:
3574 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3575 break;
3576 case RK_NonFragile:
3577 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3578 break;
3579 }
3580
3581 // -fnext-runtime
3582 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3583 // On Darwin, make this use the default behavior for the toolchain.
3584 if (getToolChain().getTriple().isOSDarwin()) {
3585 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3586
3587 // Otherwise, build for a generic macosx port.
3588 } else {
3589 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3590 }
3591
3592 // -fgnu-runtime
3593 } else {
3594 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003595 // Legacy behaviour is to target the gnustep runtime if we are i
3596 // non-fragile mode or the GCC runtime in fragile mode.
3597 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003598 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003599 else
3600 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003601 }
3602
3603 cmdArgs.push_back(args.MakeArgString(
3604 "-fobjc-runtime=" + runtime.getAsString()));
3605 return runtime;
3606}
3607
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003608void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003609 const InputInfo &Output,
3610 const InputInfoList &Inputs,
3611 const ArgList &Args,
3612 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003613 ArgStringList CmdArgs;
3614
3615 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3616 const InputInfo &Input = Inputs[0];
3617
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003618 // Don't warn about "clang -w -c foo.s"
3619 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003620 // and "clang -emit-llvm -c foo.s"
3621 Args.ClaimAllArgs(options::OPT_emit_llvm);
3622 // and "clang -use-gold-plugin -c foo.s"
3623 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003624
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003625 // Invoke ourselves in -cc1as mode.
3626 //
3627 // FIXME: Implement custom jobs for internal actions.
3628 CmdArgs.push_back("-cc1as");
3629
3630 // Add the "effective" target triple.
3631 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003632 std::string TripleStr =
3633 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003634 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3635
3636 // Set the output mode, we currently only expect to be used as a real
3637 // assembler.
3638 CmdArgs.push_back("-filetype");
3639 CmdArgs.push_back("obj");
3640
Eric Christopher27e2b982012-12-18 00:31:10 +00003641 // Set the main file name, so that debug info works even with
3642 // -save-temps or preprocessed assembly.
3643 CmdArgs.push_back("-main-file-name");
3644 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3645
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003646 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003647 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003648
Jim Grosbachfc308292012-02-10 20:37:10 +00003649 // Add target specific cpu and features flags.
3650 switch(getToolChain().getTriple().getArch()) {
3651 default:
3652 break;
3653
3654 case llvm::Triple::arm:
3655 case llvm::Triple::thumb:
3656 AddARMTargetArgs(Args, CmdArgs);
3657 break;
Benjamin Kramerefc5b672013-02-22 20:55:17 +00003658
3659 case llvm::Triple::x86:
3660 case llvm::Triple::x86_64:
3661 AddX86TargetArgs(Args, CmdArgs);
3662 break;
Jim Grosbachfc308292012-02-10 20:37:10 +00003663 }
3664
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003665 // Ignore explicit -force_cpusubtype_ALL option.
3666 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003667
Eric Christopher8f0a4032012-01-10 00:38:01 +00003668 // Determine the original source input.
3669 const Action *SourceAction = &JA;
3670 while (SourceAction->getKind() != Action::InputClass) {
3671 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3672 SourceAction = SourceAction->getInputs()[0];
3673 }
3674
Chandler Carruthd566df62012-12-17 21:40:04 +00003675 // Forward -g and handle debug info related flags, assuming we are dealing
3676 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003677 if (SourceAction->getType() == types::TY_Asm ||
3678 SourceAction->getType() == types::TY_PP_Asm) {
3679 Args.ClaimAllArgs(options::OPT_g_Group);
3680 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3681 if (!A->getOption().matches(options::OPT_g0))
3682 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003683
3684 // Add the -fdebug-compilation-dir flag if needed.
3685 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003686
3687 // Set the AT_producer to the clang version when using the integrated
3688 // assembler on assembly source files.
3689 CmdArgs.push_back("-dwarf-debug-producer");
3690 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003691 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003692
3693 // Optionally embed the -cc1as level arguments into the debug info, for build
3694 // analysis.
3695 if (getToolChain().UseDwarfDebugFlags()) {
3696 ArgStringList OriginalArgs;
3697 for (ArgList::const_iterator it = Args.begin(),
3698 ie = Args.end(); it != ie; ++it)
3699 (*it)->render(Args, OriginalArgs);
3700
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003701 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003702 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3703 Flags += Exec;
3704 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3705 Flags += " ";
3706 Flags += OriginalArgs[i];
3707 }
3708 CmdArgs.push_back("-dwarf-debug-flags");
3709 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3710 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003711
3712 // FIXME: Add -static support, once we have it.
3713
3714 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3715 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003716 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003717
3718 assert(Output.isFilename() && "Unexpected lipo output.");
3719 CmdArgs.push_back("-o");
3720 CmdArgs.push_back(Output.getFilename());
3721
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003722 assert(Input.isFilename() && "Invalid input.");
3723 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003724
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003725 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003726 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00003727
3728 // Handle the debug info splitting at object creation time if we're
3729 // creating an object.
3730 // TODO: Currently only works on linux with newer objcopy.
3731 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3732 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3733 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3734 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003735}
3736
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003737void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003738 const InputInfo &Output,
3739 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003740 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003741 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003742 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003743 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003744
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003745 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003746 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003747 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00003748 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003749 // Don't forward any -g arguments to assembly steps.
3750 if (isa<AssembleJobAction>(JA) &&
3751 A->getOption().matches(options::OPT_g_Group))
3752 continue;
3753
Daniel Dunbar75877192009-03-19 07:55:12 +00003754 // It is unfortunate that we have to claim here, as this means
3755 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003756 // platforms using a generic gcc, even if we are just using gcc
3757 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003758 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003759 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003760 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003761 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003762
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003763 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003764
3765 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003766 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00003767 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003768 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003769
3770 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003771 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003772 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003773 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003774 CmdArgs.push_back("ppc64");
3775 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003776 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003777 }
3778
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003779 // Try to force gcc to match the tool chain we want, if we recognize
3780 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003781 //
3782 // FIXME: The triple class should directly provide the information we want
3783 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003784 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003785 CmdArgs.push_back("-m32");
Hans Wennborg33092292013-03-20 07:34:27 +00003786 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003787 CmdArgs.push_back("-m64");
3788
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003789 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003790 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003791 CmdArgs.push_back(Output.getFilename());
3792 } else {
3793 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003794 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003795 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003796
Tony Linthicum96319392011-12-12 21:14:55 +00003797 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3798 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003799
3800 // Only pass -x if gcc will understand it; otherwise hope gcc
3801 // understands the suffix correctly. The main use case this would go
3802 // wrong in is for linker inputs if they happened to have an odd
3803 // suffix; really the only way to get this to happen is a command
3804 // like '-x foobar a.c' which will treat a.c like a linker input.
3805 //
3806 // FIXME: For the linker case specifically, can we safely convert
3807 // inputs into '-Wl,' options?
3808 for (InputInfoList::const_iterator
3809 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3810 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003811
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003812 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003813 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3814 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003815 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003816 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003817 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003818 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003819 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00003820 else if (II.getType() == types::TY_ModuleFile)
3821 D.Diag(diag::err_drv_no_module_support)
3822 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003823
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003824 if (types::canTypeBeUserSpecified(II.getType())) {
3825 CmdArgs.push_back("-x");
3826 CmdArgs.push_back(types::getTypeName(II.getType()));
3827 }
3828
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003829 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003830 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003831 else {
3832 const Arg &A = II.getInputArg();
3833
3834 // Reverse translate some rewritten options.
3835 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3836 CmdArgs.push_back("-lstdc++");
3837 continue;
3838 }
3839
Daniel Dunbar115a7922009-03-19 07:29:38 +00003840 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003841 A.render(Args, CmdArgs);
3842 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003843 }
3844
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003845 const std::string customGCCName = D.getCCCGenericGCCName();
3846 const char *GCCName;
3847 if (!customGCCName.empty())
3848 GCCName = customGCCName.c_str();
3849 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003850 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003851 } else
3852 GCCName = "gcc";
3853
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003854 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003855 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003856 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003857}
3858
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003859void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3860 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003861 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003862}
3863
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003864void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3865 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003866 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003867}
3868
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003869void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3870 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003871 const Driver &D = getToolChain().getDriver();
3872
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003873 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003874 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3875 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003876 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00003877 else {
3878 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003879 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003880 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00003881
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003882 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00003883 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003884}
3885
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003886void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3887 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003888 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003889}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003890
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003891void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3892 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003893 // The types are (hopefully) good enough.
3894}
3895
Tony Linthicum96319392011-12-12 21:14:55 +00003896// Hexagon tools start.
3897void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3898 ArgStringList &CmdArgs) const {
3899
3900}
3901void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3902 const InputInfo &Output,
3903 const InputInfoList &Inputs,
3904 const ArgList &Args,
3905 const char *LinkingOutput) const {
3906
3907 const Driver &D = getToolChain().getDriver();
3908 ArgStringList CmdArgs;
3909
3910 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00003911 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00003912 CmdArgs.push_back(Args.MakeArgString(MarchString));
3913
3914 RenderExtraToolArgs(JA, CmdArgs);
3915
3916 if (Output.isFilename()) {
3917 CmdArgs.push_back("-o");
3918 CmdArgs.push_back(Output.getFilename());
3919 } else {
3920 assert(Output.isNothing() && "Unexpected output");
3921 CmdArgs.push_back("-fsyntax-only");
3922 }
3923
Matthew Curtis33c95f12012-12-06 17:49:03 +00003924 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3925 if (!SmallDataThreshold.empty())
3926 CmdArgs.push_back(
3927 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00003928
Matthew Curtis3d8d4222012-12-07 17:23:04 +00003929 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3930 options::OPT_Xassembler);
3931
Tony Linthicum96319392011-12-12 21:14:55 +00003932 // Only pass -x if gcc will understand it; otherwise hope gcc
3933 // understands the suffix correctly. The main use case this would go
3934 // wrong in is for linker inputs if they happened to have an odd
3935 // suffix; really the only way to get this to happen is a command
3936 // like '-x foobar a.c' which will treat a.c like a linker input.
3937 //
3938 // FIXME: For the linker case specifically, can we safely convert
3939 // inputs into '-Wl,' options?
3940 for (InputInfoList::const_iterator
3941 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3942 const InputInfo &II = *it;
3943
3944 // Don't try to pass LLVM or AST inputs to a generic gcc.
3945 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3946 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3947 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3948 << getToolChain().getTripleString();
3949 else if (II.getType() == types::TY_AST)
3950 D.Diag(clang::diag::err_drv_no_ast_support)
3951 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00003952 else if (II.getType() == types::TY_ModuleFile)
3953 D.Diag(diag::err_drv_no_module_support)
3954 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00003955
3956 if (II.isFilename())
3957 CmdArgs.push_back(II.getFilename());
3958 else
3959 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3960 II.getInputArg().render(Args, CmdArgs);
3961 }
3962
3963 const char *GCCName = "hexagon-as";
3964 const char *Exec =
3965 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3966 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3967
3968}
3969void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3970 ArgStringList &CmdArgs) const {
3971 // The types are (hopefully) good enough.
3972}
3973
3974void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3975 const InputInfo &Output,
3976 const InputInfoList &Inputs,
3977 const ArgList &Args,
3978 const char *LinkingOutput) const {
3979
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003980 const toolchains::Hexagon_TC& ToolChain =
3981 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
3982 const Driver &D = ToolChain.getDriver();
3983
Tony Linthicum96319392011-12-12 21:14:55 +00003984 ArgStringList CmdArgs;
3985
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003986 //----------------------------------------------------------------------------
3987 //
3988 //----------------------------------------------------------------------------
3989 bool hasStaticArg = Args.hasArg(options::OPT_static);
3990 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00003991 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003992 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
3993 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
3994 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
3995 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00003996
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003997 //----------------------------------------------------------------------------
3998 // Silence warnings for various options
3999 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004000
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004001 Args.ClaimAllArgs(options::OPT_g_Group);
4002 Args.ClaimAllArgs(options::OPT_emit_llvm);
4003 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4004 // handled somewhere else.
4005 Args.ClaimAllArgs(options::OPT_static_libgcc);
4006
4007 //----------------------------------------------------------------------------
4008 //
4009 //----------------------------------------------------------------------------
4010 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4011 e = ToolChain.ExtraOpts.end();
4012 i != e; ++i)
4013 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004014
Matthew Curtis67814152012-12-06 14:16:43 +00004015 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4016 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004017
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004018 if (buildingLib) {
4019 CmdArgs.push_back("-shared");
4020 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4021 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004022 }
4023
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004024 if (hasStaticArg)
4025 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004026
Matthew Curtis33c95f12012-12-06 17:49:03 +00004027 if (buildPIE && !buildingLib)
4028 CmdArgs.push_back("-pie");
4029
4030 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4031 if (!SmallDataThreshold.empty()) {
4032 CmdArgs.push_back(
4033 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4034 }
4035
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004036 //----------------------------------------------------------------------------
4037 //
4038 //----------------------------------------------------------------------------
4039 CmdArgs.push_back("-o");
4040 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004041
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004042 const std::string MarchSuffix = "/" + MarchString;
4043 const std::string G0Suffix = "/G0";
4044 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4045 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4046 + "/";
4047 const std::string StartFilesDir = RootDir
4048 + "hexagon/lib"
4049 + (buildingLib
4050 ? MarchG0Suffix : MarchSuffix);
4051
4052 //----------------------------------------------------------------------------
4053 // moslib
4054 //----------------------------------------------------------------------------
4055 std::vector<std::string> oslibs;
4056 bool hasStandalone= false;
4057
4058 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4059 ie = Args.filtered_end(); it != ie; ++it) {
4060 (*it)->claim();
4061 oslibs.push_back((*it)->getValue());
4062 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004063 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004064 if (oslibs.empty()) {
4065 oslibs.push_back("standalone");
4066 hasStandalone = true;
4067 }
Tony Linthicum96319392011-12-12 21:14:55 +00004068
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004069 //----------------------------------------------------------------------------
4070 // Start Files
4071 //----------------------------------------------------------------------------
4072 if (incStdLib && incStartFiles) {
4073
4074 if (!buildingLib) {
4075 if (hasStandalone) {
4076 CmdArgs.push_back(
4077 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4078 }
4079 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4080 }
4081 std::string initObj = useShared ? "/initS.o" : "/init.o";
4082 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4083 }
4084
4085 //----------------------------------------------------------------------------
4086 // Library Search Paths
4087 //----------------------------------------------------------------------------
4088 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4089 for (ToolChain::path_list::const_iterator
4090 i = LibPaths.begin(),
4091 e = LibPaths.end();
4092 i != e;
4093 ++i)
4094 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4095
4096 //----------------------------------------------------------------------------
4097 //
4098 //----------------------------------------------------------------------------
4099 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4100 Args.AddAllArgs(CmdArgs, options::OPT_e);
4101 Args.AddAllArgs(CmdArgs, options::OPT_s);
4102 Args.AddAllArgs(CmdArgs, options::OPT_t);
4103 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4104
4105 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4106
4107 //----------------------------------------------------------------------------
4108 // Libraries
4109 //----------------------------------------------------------------------------
4110 if (incStdLib && incDefLibs) {
4111 if (D.CCCIsCXX) {
4112 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4113 CmdArgs.push_back("-lm");
4114 }
4115
4116 CmdArgs.push_back("--start-group");
4117
4118 if (!buildingLib) {
4119 for(std::vector<std::string>::iterator i = oslibs.begin(),
4120 e = oslibs.end(); i != e; ++i)
4121 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4122 CmdArgs.push_back("-lc");
4123 }
4124 CmdArgs.push_back("-lgcc");
4125
4126 CmdArgs.push_back("--end-group");
4127 }
4128
4129 //----------------------------------------------------------------------------
4130 // End files
4131 //----------------------------------------------------------------------------
4132 if (incStdLib && incStartFiles) {
4133 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4134 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4135 }
4136
4137 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4138 C.addCommand(
4139 new Command(
4140 JA, *this,
4141 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004142}
4143// Hexagon tools end.
4144
Rafael Espindolacfed8282012-10-31 18:51:07 +00004145llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4146 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4147 // archs which Darwin doesn't use.
4148
4149 // The matching this routine does is fairly pointless, since it is neither the
4150 // complete architecture list, nor a reasonable subset. The problem is that
4151 // historically the driver driver accepts this and also ties its -march=
4152 // handling to the architecture name, so we need to be careful before removing
4153 // support for it.
4154
4155 // This code must be kept in sync with Clang's Darwin specific argument
4156 // translation.
4157
4158 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4159 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4160 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4161 .Case("ppc64", llvm::Triple::ppc64)
4162 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4163 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4164 llvm::Triple::x86)
4165 .Case("x86_64", llvm::Triple::x86_64)
4166 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004167 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4168 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4169 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004170 .Case("r600", llvm::Triple::r600)
4171 .Case("nvptx", llvm::Triple::nvptx)
4172 .Case("nvptx64", llvm::Triple::nvptx64)
4173 .Case("amdil", llvm::Triple::amdil)
4174 .Case("spir", llvm::Triple::spir)
4175 .Default(llvm::Triple::UnknownArch);
4176}
Tony Linthicum96319392011-12-12 21:14:55 +00004177
Bob Wilson66b8a662012-11-23 06:14:39 +00004178const char *Clang::getBaseInputName(const ArgList &Args,
4179 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004180 return Args.MakeArgString(
4181 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004182}
4183
Bob Wilson66b8a662012-11-23 06:14:39 +00004184const char *Clang::getBaseInputStem(const ArgList &Args,
4185 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004186 const char *Str = getBaseInputName(Args, Inputs);
4187
Chris Lattner657ca662011-01-16 08:14:11 +00004188 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004189 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004190
4191 return Str;
4192}
4193
Bob Wilson66b8a662012-11-23 06:14:39 +00004194const char *Clang::getDependencyFileName(const ArgList &Args,
4195 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004196 // FIXME: Think about this more.
4197 std::string Res;
4198
4199 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004200 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004201 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004202 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004203 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004204 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004205 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004206}
4207
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004208void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004209 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004210 const InputInfoList &Inputs,
4211 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004212 const char *LinkingOutput) const {
4213 ArgStringList CmdArgs;
4214
4215 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4216 const InputInfo &Input = Inputs[0];
4217
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004218 // Determine the original source input.
4219 const Action *SourceAction = &JA;
4220 while (SourceAction->getKind() != Action::InputClass) {
4221 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4222 SourceAction = SourceAction->getInputs()[0];
4223 }
4224
4225 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004226 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004227 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004228 if (Args.hasArg(options::OPT_gstabs))
4229 CmdArgs.push_back("--gstabs");
4230 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004231 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004232 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004233
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004234 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004235 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004236
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004237 // Use -force_cpusubtype_ALL on x86 by default.
4238 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4239 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004240 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4241 CmdArgs.push_back("-force_cpusubtype_ALL");
4242
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00004243 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004244 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004245 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004246 (!getDarwinToolChain().isTargetIPhoneOS() ||
4247 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4248 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004249 CmdArgs.push_back("-static");
4250
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004251 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4252 options::OPT_Xassembler);
4253
4254 assert(Output.isFilename() && "Unexpected lipo output.");
4255 CmdArgs.push_back("-o");
4256 CmdArgs.push_back(Output.getFilename());
4257
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004258 assert(Input.isFilename() && "Invalid input.");
4259 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004260
4261 // asm_final spec is empty.
4262
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004263 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004264 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004265 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004266}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004267
David Blaikie99ba9e32011-12-20 02:48:34 +00004268void darwin::DarwinTool::anchor() {}
4269
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004270void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4271 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004272 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004273
Daniel Dunbar02633b52009-03-26 16:23:12 +00004274 // Derived from darwin_arch spec.
4275 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004276 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004277
Daniel Dunbareeff4062010-01-22 02:04:58 +00004278 // FIXME: Is this needed anymore?
4279 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004280 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004281}
4282
Bill Wendling6acf8b42012-10-02 18:02:50 +00004283bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4284 // We only need to generate a temp path for LTO if we aren't compiling object
4285 // files. When compiling source files, we run 'dsymutil' after linking. We
4286 // don't run 'dsymutil' when compiling object files.
4287 for (InputInfoList::const_iterator
4288 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4289 if (it->getType() != types::TY_Object)
4290 return true;
4291
4292 return false;
4293}
4294
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004295void darwin::Link::AddLinkArgs(Compilation &C,
4296 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004297 ArgStringList &CmdArgs,
4298 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004299 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004300 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004301
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004302 unsigned Version[3] = { 0, 0, 0 };
4303 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4304 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004305 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004306 Version[1], Version[2], HadExtra) ||
4307 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004308 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004309 << A->getAsString(Args);
4310 }
4311
4312 // Newer linkers support -demangle, pass it if supported and not disabled by
4313 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004314 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004315 // Don't pass -demangle to ld_classic.
4316 //
4317 // FIXME: This is a temporary workaround, ld should be handling this.
4318 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4319 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004320 if (getToolChain().getArch() == llvm::Triple::x86) {
4321 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4322 options::OPT_Wl_COMMA),
4323 ie = Args.filtered_end(); it != ie; ++it) {
4324 const Arg *A = *it;
4325 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004326 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004327 UsesLdClassic = true;
4328 }
4329 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004330 if (!UsesLdClassic)
4331 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004332 }
4333
Bill Wendlingc35f9082012-11-16 23:03:00 +00004334 // If we are using LTO, then automatically create a temporary file path for
4335 // the linker to use, so that it's lifetime will extend past a possible
4336 // dsymutil step.
4337 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4338 const char *TmpPath = C.getArgs().MakeArgString(
4339 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4340 C.addTempFile(TmpPath);
4341 CmdArgs.push_back("-object_path_lto");
4342 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004343 }
4344
Daniel Dunbar02633b52009-03-26 16:23:12 +00004345 // Derived from the "link" spec.
4346 Args.AddAllArgs(CmdArgs, options::OPT_static);
4347 if (!Args.hasArg(options::OPT_static))
4348 CmdArgs.push_back("-dynamic");
4349 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4350 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4351 // here. How do we wish to handle such things?
4352 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004353
Daniel Dunbar02633b52009-03-26 16:23:12 +00004354 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004355 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004356 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004357 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004358
4359 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4360 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4361 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4362
4363 Arg *A;
4364 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4365 (A = Args.getLastArg(options::OPT_current__version)) ||
4366 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004367 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004368 << A->getAsString(Args) << "-dynamiclib";
4369
4370 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4371 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4372 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4373 } else {
4374 CmdArgs.push_back("-dylib");
4375
4376 Arg *A;
4377 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4378 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4379 (A = Args.getLastArg(options::OPT_client__name)) ||
4380 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4381 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4382 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004383 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004384 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004385
Daniel Dunbar02633b52009-03-26 16:23:12 +00004386 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4387 "-dylib_compatibility_version");
4388 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4389 "-dylib_current_version");
4390
Daniel Dunbara6d38492010-01-22 02:04:52 +00004391 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004392
4393 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4394 "-dylib_install_name");
4395 }
4396
4397 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4398 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4399 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004400 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004401 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004402 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4403 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4404 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4405 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4406 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4407 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004408 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004409 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4410 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4411 Args.AddAllArgs(CmdArgs, options::OPT_init);
4412
Daniel Dunbarce911f52011-04-28 21:23:41 +00004413 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004414 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004415
4416 // If we had an explicit -mios-simulator-version-min argument, honor that,
4417 // otherwise use the traditional deployment targets. We can't just check the
4418 // is-sim attribute because existing code follows this path, and the linker
4419 // may not handle the argument.
4420 //
4421 // FIXME: We may be able to remove this, once we can verify no one depends on
4422 // it.
4423 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4424 CmdArgs.push_back("-ios_simulator_version_min");
4425 else if (DarwinTC.isTargetIPhoneOS())
4426 CmdArgs.push_back("-iphoneos_version_min");
4427 else
4428 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004429 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004430
Daniel Dunbar02633b52009-03-26 16:23:12 +00004431 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4432 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4433 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4434 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4435 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004436
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004437 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4438 options::OPT_fno_pie,
4439 options::OPT_fno_PIE)) {
4440 if (A->getOption().matches(options::OPT_fpie) ||
4441 A->getOption().matches(options::OPT_fPIE))
4442 CmdArgs.push_back("-pie");
4443 else
4444 CmdArgs.push_back("-no_pie");
4445 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004446
4447 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4448 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4449 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4450 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4451 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4452 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4453 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4454 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4455 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4456 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4457 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4458 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4459 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4460 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4461 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4462 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004463
Daniel Dunbarcc957192011-05-02 21:03:47 +00004464 // Give --sysroot= preference, over the Apple specific behavior to also use
4465 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004466 StringRef sysroot = C.getSysRoot();
4467 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004468 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004470 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4471 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004472 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004473 }
4474
Daniel Dunbar02633b52009-03-26 16:23:12 +00004475 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4476 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4477 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4478 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4479 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004480 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004481 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4482 Args.AddAllArgs(CmdArgs, options::OPT_y);
4483 Args.AddLastArg(CmdArgs, options::OPT_w);
4484 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4485 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4486 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4487 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4488 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4489 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4490 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4491 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4492 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4493 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4494 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4495 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4496}
4497
4498void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004499 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004500 const InputInfoList &Inputs,
4501 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004502 const char *LinkingOutput) const {
4503 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004504
Daniel Dunbar02633b52009-03-26 16:23:12 +00004505 // The logic here is derived from gcc's behavior; most of which
4506 // comes from specs (starting with link_command). Consult gcc for
4507 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004508 ArgStringList CmdArgs;
4509
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004510 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4511 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4512 options::OPT_ccc_arcmt_migrate)) {
4513 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4514 (*I)->claim();
4515 const char *Exec =
4516 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4517 CmdArgs.push_back(Output.getFilename());
4518 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4519 return;
4520 }
4521
Daniel Dunbar02633b52009-03-26 16:23:12 +00004522 // I'm not sure why this particular decomposition exists in gcc, but
4523 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004524 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004525
Daniel Dunbar02633b52009-03-26 16:23:12 +00004526 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4527 Args.AddAllArgs(CmdArgs, options::OPT_s);
4528 Args.AddAllArgs(CmdArgs, options::OPT_t);
4529 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4530 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004531 Args.AddLastArg(CmdArgs, options::OPT_e);
4532 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4533 Args.AddAllArgs(CmdArgs, options::OPT_r);
4534
Daniel Dunbar270073c2010-10-18 22:08:36 +00004535 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4536 // members of static archive libraries which implement Objective-C classes or
4537 // categories.
4538 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4539 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004540
Bill Wendlingd56f4032012-12-10 21:48:41 +00004541 if (Args.hasArg(options::OPT_rdynamic))
4542 CmdArgs.push_back("-export_dynamic");
4543
Daniel Dunbar02633b52009-03-26 16:23:12 +00004544 CmdArgs.push_back("-o");
4545 CmdArgs.push_back(Output.getFilename());
4546
Chad Rosier18937312012-05-16 23:45:12 +00004547 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004548 !Args.hasArg(options::OPT_nostartfiles)) {
4549 // Derived from startfile spec.
4550 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004551 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004552 if (getDarwinToolChain().isTargetIOSSimulator()) {
4553 // The simulator doesn't have a versioned crt1 file.
4554 CmdArgs.push_back("-ldylib1.o");
4555 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004556 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4557 CmdArgs.push_back("-ldylib1.o");
4558 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004559 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004560 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004561 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004562 CmdArgs.push_back("-ldylib1.10.5.o");
4563 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004564 } else {
4565 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004566 if (!Args.hasArg(options::OPT_static)) {
4567 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004568 if (getDarwinToolChain().isTargetIOSSimulator()) {
4569 // The simulator doesn't have a versioned crt1 file.
4570 CmdArgs.push_back("-lbundle1.o");
4571 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004572 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4573 CmdArgs.push_back("-lbundle1.o");
4574 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004575 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004576 CmdArgs.push_back("-lbundle1.o");
4577 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004578 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004579 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004580 if (Args.hasArg(options::OPT_pg) &&
4581 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004582 if (Args.hasArg(options::OPT_static) ||
4583 Args.hasArg(options::OPT_object) ||
4584 Args.hasArg(options::OPT_preload)) {
4585 CmdArgs.push_back("-lgcrt0.o");
4586 } else {
4587 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004588
Daniel Dunbar02633b52009-03-26 16:23:12 +00004589 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004590 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004591 // By default on OS X 10.8 and later, we don't link with a crt1.o
4592 // file and the linker knows to use _main as the entry point. But,
4593 // when compiling with -pg, we need to link with the gcrt1.o file,
4594 // so pass the -no_new_main option to tell the linker to use the
4595 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004596 if (getDarwinToolChain().isTargetMacOS() &&
4597 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4598 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004599 } else {
4600 if (Args.hasArg(options::OPT_static) ||
4601 Args.hasArg(options::OPT_object) ||
4602 Args.hasArg(options::OPT_preload)) {
4603 CmdArgs.push_back("-lcrt0.o");
4604 } else {
4605 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004606 if (getDarwinToolChain().isTargetIOSSimulator()) {
4607 // The simulator doesn't have a versioned crt1 file.
4608 CmdArgs.push_back("-lcrt1.o");
4609 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004610 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4611 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004612 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004613 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004614 } else {
4615 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4616 CmdArgs.push_back("-lcrt1.o");
4617 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4618 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004619 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004620 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004621
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004622 // darwin_crt2 spec is empty.
4623 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004624 }
4625 }
4626 }
4627 }
4628
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004629 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4630 Args.hasArg(options::OPT_shared_libgcc) &&
4631 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004632 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004633 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004634 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004635 }
4636 }
4637
4638 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004639
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00004640 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004641 // If we're building a dynamic lib with -fsanitize=address,
4642 // unresolved symbols may appear. Mark all
Alexey Samsonov75fcb192012-11-16 12:53:14 +00004643 // of them as dynamic_lookup. Linking executables is handled in
4644 // lib/Driver/ToolChains.cpp.
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004645 if (Sanitize.needsAsanRt()) {
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004646 if (Args.hasArg(options::OPT_dynamiclib) ||
4647 Args.hasArg(options::OPT_bundle)) {
4648 CmdArgs.push_back("-undefined");
4649 CmdArgs.push_back("dynamic_lookup");
4650 }
4651 }
4652
Daniel Dunbar02633b52009-03-26 16:23:12 +00004653 if (Args.hasArg(options::OPT_fopenmp))
4654 // This is more complicated in gcc...
4655 CmdArgs.push_back("-lgomp");
4656
Douglas Gregor04e326b2012-05-15 21:00:27 +00004657 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4658
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004659 if (isObjCRuntimeLinked(Args) &&
4660 !Args.hasArg(options::OPT_nostdlib) &&
4661 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004662 // Avoid linking compatibility stubs on i386 mac.
4663 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004664 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004665 // If we don't have ARC or subscripting runtime support, link in the
4666 // runtime stubs. We have to do this *before* adding any of the normal
4667 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004668 ObjCRuntime runtime =
4669 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004670 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004671 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004672 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004673 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004674 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004675 CmdArgs.push_back("-framework");
4676 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004677 // Link libobj.
4678 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004679 }
John McCallf85e1932011-06-15 23:02:42 +00004680
Daniel Dunbar02633b52009-03-26 16:23:12 +00004681 if (LinkingOutput) {
4682 CmdArgs.push_back("-arch_multiple");
4683 CmdArgs.push_back("-final_output");
4684 CmdArgs.push_back(LinkingOutput);
4685 }
4686
Daniel Dunbar02633b52009-03-26 16:23:12 +00004687 if (Args.hasArg(options::OPT_fnested_functions))
4688 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004689
Daniel Dunbar02633b52009-03-26 16:23:12 +00004690 if (!Args.hasArg(options::OPT_nostdlib) &&
4691 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004692 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004693 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004694
Daniel Dunbar02633b52009-03-26 16:23:12 +00004695 // link_ssp spec is empty.
4696
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004697 // Let the tool chain choose which runtime library to link.
4698 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004699 }
4700
Chad Rosier18937312012-05-16 23:45:12 +00004701 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004702 !Args.hasArg(options::OPT_nostartfiles)) {
4703 // endfile_spec is empty.
4704 }
4705
4706 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4707 Args.AddAllArgs(CmdArgs, options::OPT_F);
4708
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004709 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004710 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004711 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004712}
4713
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004714void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004715 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004716 const InputInfoList &Inputs,
4717 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004718 const char *LinkingOutput) const {
4719 ArgStringList CmdArgs;
4720
4721 CmdArgs.push_back("-create");
4722 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004723
4724 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004725 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004726
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004727 for (InputInfoList::const_iterator
4728 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4729 const InputInfo &II = *it;
4730 assert(II.isFilename() && "Unexpected lipo input.");
4731 CmdArgs.push_back(II.getFilename());
4732 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004733 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004734 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004735 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004736}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004737
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004738void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004739 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004740 const InputInfoList &Inputs,
4741 const ArgList &Args,
4742 const char *LinkingOutput) const {
4743 ArgStringList CmdArgs;
4744
Daniel Dunbar03e92302011-05-09 17:23:16 +00004745 CmdArgs.push_back("-o");
4746 CmdArgs.push_back(Output.getFilename());
4747
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004748 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4749 const InputInfo &Input = Inputs[0];
4750 assert(Input.isFilename() && "Unexpected dsymutil input.");
4751 CmdArgs.push_back(Input.getFilename());
4752
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004753 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004754 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004755 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004756}
4757
Eric Christopherf8571862011-08-23 17:56:55 +00004758void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00004759 const InputInfo &Output,
4760 const InputInfoList &Inputs,
4761 const ArgList &Args,
4762 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00004763 ArgStringList CmdArgs;
4764 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004765 CmdArgs.push_back("--debug-info");
4766 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004767 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004768
4769 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4770 const InputInfo &Input = Inputs[0];
4771 assert(Input.isFilename() && "Unexpected verify input");
4772
4773 // Grabbing the output of the earlier dsymutil run.
4774 CmdArgs.push_back(Input.getFilename());
4775
4776 const char *Exec =
4777 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4778 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4779}
4780
David Chisnall31c46902012-02-15 13:39:01 +00004781void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4782 const InputInfo &Output,
4783 const InputInfoList &Inputs,
4784 const ArgList &Args,
4785 const char *LinkingOutput) const {
4786 ArgStringList CmdArgs;
4787
4788 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4789 options::OPT_Xassembler);
4790
4791 CmdArgs.push_back("-o");
4792 CmdArgs.push_back(Output.getFilename());
4793
4794 for (InputInfoList::const_iterator
4795 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4796 const InputInfo &II = *it;
4797 CmdArgs.push_back(II.getFilename());
4798 }
4799
4800 const char *Exec =
4801 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4802 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4803}
4804
4805
4806void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4807 const InputInfo &Output,
4808 const InputInfoList &Inputs,
4809 const ArgList &Args,
4810 const char *LinkingOutput) const {
4811 // FIXME: Find a real GCC, don't hard-code versions here
4812 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4813 const llvm::Triple &T = getToolChain().getTriple();
4814 std::string LibPath = "/usr/lib/";
4815 llvm::Triple::ArchType Arch = T.getArch();
4816 switch (Arch) {
4817 case llvm::Triple::x86:
4818 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4819 T.getOSName()).str() + "/4.5.2/";
4820 break;
4821 case llvm::Triple::x86_64:
4822 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4823 T.getOSName()).str();
4824 GCCLibPath += "/4.5.2/amd64/";
4825 LibPath += "amd64/";
4826 break;
4827 default:
4828 assert(0 && "Unsupported architecture");
4829 }
4830
4831 ArgStringList CmdArgs;
4832
David Chisnall41d476d2012-02-29 15:06:12 +00004833 // Demangle C++ names in errors
4834 CmdArgs.push_back("-C");
4835
David Chisnall31c46902012-02-15 13:39:01 +00004836 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4837 (!Args.hasArg(options::OPT_shared))) {
4838 CmdArgs.push_back("-e");
4839 CmdArgs.push_back("_start");
4840 }
4841
4842 if (Args.hasArg(options::OPT_static)) {
4843 CmdArgs.push_back("-Bstatic");
4844 CmdArgs.push_back("-dn");
4845 } else {
4846 CmdArgs.push_back("-Bdynamic");
4847 if (Args.hasArg(options::OPT_shared)) {
4848 CmdArgs.push_back("-shared");
4849 } else {
4850 CmdArgs.push_back("--dynamic-linker");
4851 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4852 }
4853 }
4854
4855 if (Output.isFilename()) {
4856 CmdArgs.push_back("-o");
4857 CmdArgs.push_back(Output.getFilename());
4858 } else {
4859 assert(Output.isNothing() && "Invalid output.");
4860 }
4861
4862 if (!Args.hasArg(options::OPT_nostdlib) &&
4863 !Args.hasArg(options::OPT_nostartfiles)) {
4864 if (!Args.hasArg(options::OPT_shared)) {
4865 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4866 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004867 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004868 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4869 } else {
4870 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004871 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4872 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004873 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004874 if (getToolChain().getDriver().CCCIsCXX)
4875 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004876 }
4877
4878 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4879
4880 Args.AddAllArgs(CmdArgs, options::OPT_L);
4881 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4882 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00004883 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00004884
4885 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4886
4887 if (!Args.hasArg(options::OPT_nostdlib) &&
4888 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00004889 if (getToolChain().getDriver().CCCIsCXX)
4890 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00004891 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00004892 if (!Args.hasArg(options::OPT_shared)) {
4893 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00004894 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00004895 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00004896 }
David Chisnall31c46902012-02-15 13:39:01 +00004897 }
4898
4899 if (!Args.hasArg(options::OPT_nostdlib) &&
4900 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00004901 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004902 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00004903 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004904
4905 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4906
4907 const char *Exec =
4908 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4909 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4910}
4911
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004912void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004913 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004914 const InputInfoList &Inputs,
4915 const ArgList &Args,
4916 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004917 ArgStringList CmdArgs;
4918
4919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4920 options::OPT_Xassembler);
4921
4922 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004923 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004924
4925 for (InputInfoList::const_iterator
4926 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4927 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004928 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004929 }
4930
4931 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004932 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004933 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004934}
4935
4936void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004937 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004938 const InputInfoList &Inputs,
4939 const ArgList &Args,
4940 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004941 ArgStringList CmdArgs;
4942
4943 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004944 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004945 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004946 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004947 }
4948
4949 if (Args.hasArg(options::OPT_static)) {
4950 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004951 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004952 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004953// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004954 CmdArgs.push_back("-Bdynamic");
4955 if (Args.hasArg(options::OPT_shared)) {
4956 CmdArgs.push_back("-shared");
4957 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00004958 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004959 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4960 }
4961 }
4962
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004963 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004964 CmdArgs.push_back("-o");
4965 CmdArgs.push_back(Output.getFilename());
4966 } else {
4967 assert(Output.isNothing() && "Invalid output.");
4968 }
4969
4970 if (!Args.hasArg(options::OPT_nostdlib) &&
4971 !Args.hasArg(options::OPT_nostartfiles)) {
4972 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00004973 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004974 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004975 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004976 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004977 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004978 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004979 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004980 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004981 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004982 }
Chris Lattner38e317d2010-07-07 16:01:42 +00004983 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004984 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004985 }
4986
Daniel Dunbar294691e2009-11-04 06:24:38 +00004987 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4988 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004989 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004990
4991 Args.AddAllArgs(CmdArgs, options::OPT_L);
4992 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4993 Args.AddAllArgs(CmdArgs, options::OPT_e);
4994
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004995 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004996
4997 if (!Args.hasArg(options::OPT_nostdlib) &&
4998 !Args.hasArg(options::OPT_nodefaultlibs)) {
4999 // FIXME: For some reason GCC passes -lgcc before adding
5000 // the default system libraries. Just mimic this for now.
5001 CmdArgs.push_back("-lgcc");
5002
5003 if (Args.hasArg(options::OPT_pthread))
5004 CmdArgs.push_back("-pthread");
5005 if (!Args.hasArg(options::OPT_shared))
5006 CmdArgs.push_back("-lc");
5007 CmdArgs.push_back("-lgcc");
5008 }
5009
5010 if (!Args.hasArg(options::OPT_nostdlib) &&
5011 !Args.hasArg(options::OPT_nostartfiles)) {
5012 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005013 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005014 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005015 }
5016
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005017 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005018
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005019 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005020 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005021 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005022}
5023
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005024void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005025 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005026 const InputInfoList &Inputs,
5027 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005028 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005029 ArgStringList CmdArgs;
5030
5031 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5032 options::OPT_Xassembler);
5033
5034 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005035 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005036
5037 for (InputInfoList::const_iterator
5038 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5039 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005040 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005041 }
5042
5043 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005044 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005045 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005046}
5047
5048void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005049 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005050 const InputInfoList &Inputs,
5051 const ArgList &Args,
5052 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005053 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005054 ArgStringList CmdArgs;
5055
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005056 // Silence warning for "clang -g foo.o -o foo"
5057 Args.ClaimAllArgs(options::OPT_g_Group);
5058 // and "clang -emit-llvm foo.o -o foo"
5059 Args.ClaimAllArgs(options::OPT_emit_llvm);
5060 // and for "clang -w foo.o -o foo". Other warning options are already
5061 // handled somewhere else.
5062 Args.ClaimAllArgs(options::OPT_w);
5063
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005064 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005065 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005066 CmdArgs.push_back("-e");
5067 CmdArgs.push_back("__start");
5068 }
5069
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005070 if (Args.hasArg(options::OPT_static)) {
5071 CmdArgs.push_back("-Bstatic");
5072 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005073 if (Args.hasArg(options::OPT_rdynamic))
5074 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005075 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005076 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005077 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005078 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005079 } else {
5080 CmdArgs.push_back("-dynamic-linker");
5081 CmdArgs.push_back("/usr/libexec/ld.so");
5082 }
5083 }
5084
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005085 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005086 CmdArgs.push_back("-o");
5087 CmdArgs.push_back(Output.getFilename());
5088 } else {
5089 assert(Output.isNothing() && "Invalid output.");
5090 }
5091
5092 if (!Args.hasArg(options::OPT_nostdlib) &&
5093 !Args.hasArg(options::OPT_nostartfiles)) {
5094 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005095 if (Args.hasArg(options::OPT_pg))
5096 CmdArgs.push_back(Args.MakeArgString(
5097 getToolChain().GetFilePath("gcrt0.o")));
5098 else
5099 CmdArgs.push_back(Args.MakeArgString(
5100 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005101 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005102 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005103 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005104 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005105 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005106 }
5107 }
5108
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005109 std::string Triple = getToolChain().getTripleString();
5110 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005111 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005112 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005113 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005114
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005115 Args.AddAllArgs(CmdArgs, options::OPT_L);
5116 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5117 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005118 Args.AddAllArgs(CmdArgs, options::OPT_s);
5119 Args.AddAllArgs(CmdArgs, options::OPT_t);
5120 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5121 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005122
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005123 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005124
5125 if (!Args.hasArg(options::OPT_nostdlib) &&
5126 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00005127 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005128 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005129 if (Args.hasArg(options::OPT_pg))
5130 CmdArgs.push_back("-lm_p");
5131 else
5132 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005133 }
5134
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005135 // FIXME: For some reason GCC passes -lgcc before adding
5136 // the default system libraries. Just mimic this for now.
5137 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005138
Eric Christopherdc6cc872012-09-13 06:32:34 +00005139 if (Args.hasArg(options::OPT_pthread)) {
5140 if (!Args.hasArg(options::OPT_shared) &&
5141 Args.hasArg(options::OPT_pg))
5142 CmdArgs.push_back("-lpthread_p");
5143 else
5144 CmdArgs.push_back("-lpthread");
5145 }
5146
Chandler Carruth657849c2011-12-17 22:32:42 +00005147 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005148 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005149 CmdArgs.push_back("-lc_p");
5150 else
5151 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005152 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005153
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005154 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005155 }
5156
5157 if (!Args.hasArg(options::OPT_nostdlib) &&
5158 !Args.hasArg(options::OPT_nostartfiles)) {
5159 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005160 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005161 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005162 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005163 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005164 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005165 }
5166
5167 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005168 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005169 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005170}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005171
Eli Friedman42f74f22012-08-08 23:57:20 +00005172void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5173 const InputInfo &Output,
5174 const InputInfoList &Inputs,
5175 const ArgList &Args,
5176 const char *LinkingOutput) const {
5177 ArgStringList CmdArgs;
5178
5179 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5180 options::OPT_Xassembler);
5181
5182 CmdArgs.push_back("-o");
5183 CmdArgs.push_back(Output.getFilename());
5184
5185 for (InputInfoList::const_iterator
5186 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5187 const InputInfo &II = *it;
5188 CmdArgs.push_back(II.getFilename());
5189 }
5190
5191 const char *Exec =
5192 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5193 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5194}
5195
5196void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5197 const InputInfo &Output,
5198 const InputInfoList &Inputs,
5199 const ArgList &Args,
5200 const char *LinkingOutput) const {
5201 const Driver &D = getToolChain().getDriver();
5202 ArgStringList CmdArgs;
5203
5204 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5205 (!Args.hasArg(options::OPT_shared))) {
5206 CmdArgs.push_back("-e");
5207 CmdArgs.push_back("__start");
5208 }
5209
5210 if (Args.hasArg(options::OPT_static)) {
5211 CmdArgs.push_back("-Bstatic");
5212 } else {
5213 if (Args.hasArg(options::OPT_rdynamic))
5214 CmdArgs.push_back("-export-dynamic");
5215 CmdArgs.push_back("--eh-frame-hdr");
5216 CmdArgs.push_back("-Bdynamic");
5217 if (Args.hasArg(options::OPT_shared)) {
5218 CmdArgs.push_back("-shared");
5219 } else {
5220 CmdArgs.push_back("-dynamic-linker");
5221 CmdArgs.push_back("/usr/libexec/ld.so");
5222 }
5223 }
5224
5225 if (Output.isFilename()) {
5226 CmdArgs.push_back("-o");
5227 CmdArgs.push_back(Output.getFilename());
5228 } else {
5229 assert(Output.isNothing() && "Invalid output.");
5230 }
5231
5232 if (!Args.hasArg(options::OPT_nostdlib) &&
5233 !Args.hasArg(options::OPT_nostartfiles)) {
5234 if (!Args.hasArg(options::OPT_shared)) {
5235 if (Args.hasArg(options::OPT_pg))
5236 CmdArgs.push_back(Args.MakeArgString(
5237 getToolChain().GetFilePath("gcrt0.o")));
5238 else
5239 CmdArgs.push_back(Args.MakeArgString(
5240 getToolChain().GetFilePath("crt0.o")));
5241 CmdArgs.push_back(Args.MakeArgString(
5242 getToolChain().GetFilePath("crtbegin.o")));
5243 } else {
5244 CmdArgs.push_back(Args.MakeArgString(
5245 getToolChain().GetFilePath("crtbeginS.o")));
5246 }
5247 }
5248
5249 Args.AddAllArgs(CmdArgs, options::OPT_L);
5250 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5251 Args.AddAllArgs(CmdArgs, options::OPT_e);
5252
5253 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5254
5255 if (!Args.hasArg(options::OPT_nostdlib) &&
5256 !Args.hasArg(options::OPT_nodefaultlibs)) {
5257 if (D.CCCIsCXX) {
5258 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5259 if (Args.hasArg(options::OPT_pg))
5260 CmdArgs.push_back("-lm_p");
5261 else
5262 CmdArgs.push_back("-lm");
5263 }
5264
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005265 if (Args.hasArg(options::OPT_pthread)) {
5266 if (!Args.hasArg(options::OPT_shared) &&
5267 Args.hasArg(options::OPT_pg))
5268 CmdArgs.push_back("-lpthread_p");
5269 else
5270 CmdArgs.push_back("-lpthread");
5271 }
5272
Eli Friedman42f74f22012-08-08 23:57:20 +00005273 if (!Args.hasArg(options::OPT_shared)) {
5274 if (Args.hasArg(options::OPT_pg))
5275 CmdArgs.push_back("-lc_p");
5276 else
5277 CmdArgs.push_back("-lc");
5278 }
5279
5280 std::string myarch = "-lclang_rt.";
5281 const llvm::Triple &T = getToolChain().getTriple();
5282 llvm::Triple::ArchType Arch = T.getArch();
5283 switch (Arch) {
5284 case llvm::Triple::arm:
5285 myarch += ("arm");
5286 break;
5287 case llvm::Triple::x86:
5288 myarch += ("i386");
5289 break;
5290 case llvm::Triple::x86_64:
5291 myarch += ("amd64");
5292 break;
5293 default:
5294 assert(0 && "Unsupported architecture");
5295 }
5296 CmdArgs.push_back(Args.MakeArgString(myarch));
5297 }
5298
5299 if (!Args.hasArg(options::OPT_nostdlib) &&
5300 !Args.hasArg(options::OPT_nostartfiles)) {
5301 if (!Args.hasArg(options::OPT_shared))
5302 CmdArgs.push_back(Args.MakeArgString(
5303 getToolChain().GetFilePath("crtend.o")));
5304 else
5305 CmdArgs.push_back(Args.MakeArgString(
5306 getToolChain().GetFilePath("crtendS.o")));
5307 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005308
5309 const char *Exec =
5310 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5311 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005312}
5313
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005314void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005315 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005316 const InputInfoList &Inputs,
5317 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005318 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005319 ArgStringList CmdArgs;
5320
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005321 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5322 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005323 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005324 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005325 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005326 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005327 else if (getToolChain().getArch() == llvm::Triple::mips ||
5328 getToolChain().getArch() == llvm::Triple::mipsel ||
5329 getToolChain().getArch() == llvm::Triple::mips64 ||
5330 getToolChain().getArch() == llvm::Triple::mips64el) {
5331 StringRef CPUName;
5332 StringRef ABIName;
5333 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005334
Eric Christopherc55da4b2012-09-05 21:32:44 +00005335 CmdArgs.push_back("-march");
5336 CmdArgs.push_back(CPUName.data());
5337
Eric Christopherc55da4b2012-09-05 21:32:44 +00005338 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005339 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005340
5341 if (getToolChain().getArch() == llvm::Triple::mips ||
5342 getToolChain().getArch() == llvm::Triple::mips64)
5343 CmdArgs.push_back("-EB");
5344 else
5345 CmdArgs.push_back("-EL");
5346
5347 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5348 options::OPT_fpic, options::OPT_fno_pic,
5349 options::OPT_fPIE, options::OPT_fno_PIE,
5350 options::OPT_fpie, options::OPT_fno_pie);
5351 if (LastPICArg &&
5352 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5353 LastPICArg->getOption().matches(options::OPT_fpic) ||
5354 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5355 LastPICArg->getOption().matches(options::OPT_fpie))) {
5356 CmdArgs.push_back("-KPIC");
5357 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005358 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5359 getToolChain().getArch() == llvm::Triple::thumb) {
5360 CmdArgs.push_back("-mfpu=softvfp");
5361 switch(getToolChain().getTriple().getEnvironment()) {
5362 case llvm::Triple::GNUEABI:
5363 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005364 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005365 break;
5366
5367 default:
5368 CmdArgs.push_back("-matpcs");
5369 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005370 }
Eric Christophered734732010-03-02 02:41:08 +00005371
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005372 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5373 options::OPT_Xassembler);
5374
5375 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005376 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005377
5378 for (InputInfoList::const_iterator
5379 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5380 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005381 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005382 }
5383
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005384 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005385 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005386 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005387}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005388
5389void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005390 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005391 const InputInfoList &Inputs,
5392 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005393 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005394 const toolchains::FreeBSD& ToolChain =
5395 static_cast<const toolchains::FreeBSD&>(getToolChain());
5396 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005397 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005398
5399 // Silence warning for "clang -g foo.o -o foo"
5400 Args.ClaimAllArgs(options::OPT_g_Group);
5401 // and "clang -emit-llvm foo.o -o foo"
5402 Args.ClaimAllArgs(options::OPT_emit_llvm);
5403 // and for "clang -w foo.o -o foo". Other warning options are already
5404 // handled somewhere else.
5405 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005406
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005407 if (!D.SysRoot.empty())
5408 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5409
Roman Divacky94380162012-08-28 15:09:03 +00005410 if (Args.hasArg(options::OPT_pie))
5411 CmdArgs.push_back("-pie");
5412
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005413 if (Args.hasArg(options::OPT_static)) {
5414 CmdArgs.push_back("-Bstatic");
5415 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005416 if (Args.hasArg(options::OPT_rdynamic))
5417 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005418 CmdArgs.push_back("--eh-frame-hdr");
5419 if (Args.hasArg(options::OPT_shared)) {
5420 CmdArgs.push_back("-Bshareable");
5421 } else {
5422 CmdArgs.push_back("-dynamic-linker");
5423 CmdArgs.push_back("/libexec/ld-elf.so.1");
5424 }
Roman Divacky94380162012-08-28 15:09:03 +00005425 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5426 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005427 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5428 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5429 CmdArgs.push_back("--hash-style=both");
5430 }
5431 }
5432 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005433 }
5434
5435 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5436 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005437 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005438 CmdArgs.push_back("-m");
5439 CmdArgs.push_back("elf_i386_fbsd");
5440 }
5441
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005442 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005443 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005444 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005445 }
5446
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005447 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005448 CmdArgs.push_back("-o");
5449 CmdArgs.push_back(Output.getFilename());
5450 } else {
5451 assert(Output.isNothing() && "Invalid output.");
5452 }
5453
5454 if (!Args.hasArg(options::OPT_nostdlib) &&
5455 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005456 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005457 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005458 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005459 crt1 = "gcrt1.o";
5460 else if (Args.hasArg(options::OPT_pie))
5461 crt1 = "Scrt1.o";
5462 else
5463 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005464 }
Roman Divacky94380162012-08-28 15:09:03 +00005465 if (crt1)
5466 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5467
5468 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5469
5470 const char *crtbegin = NULL;
5471 if (Args.hasArg(options::OPT_static))
5472 crtbegin = "crtbeginT.o";
5473 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5474 crtbegin = "crtbeginS.o";
5475 else
5476 crtbegin = "crtbegin.o";
5477
5478 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005479 }
5480
5481 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005482 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005483 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5484 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005485 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005486 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5487 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005488 Args.AddAllArgs(CmdArgs, options::OPT_s);
5489 Args.AddAllArgs(CmdArgs, options::OPT_t);
5490 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5491 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005492
Roman Divacky94380162012-08-28 15:09:03 +00005493 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005494
5495 if (!Args.hasArg(options::OPT_nostdlib) &&
5496 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005497 if (D.CCCIsCXX) {
Roman Divacky94380162012-08-28 15:09:03 +00005498 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005499 if (Args.hasArg(options::OPT_pg))
5500 CmdArgs.push_back("-lm_p");
5501 else
5502 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005503 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005504 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5505 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005506 if (Args.hasArg(options::OPT_pg))
5507 CmdArgs.push_back("-lgcc_p");
5508 else
5509 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005510 if (Args.hasArg(options::OPT_static)) {
5511 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005512 } else if (Args.hasArg(options::OPT_pg)) {
5513 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005514 } else {
5515 CmdArgs.push_back("--as-needed");
5516 CmdArgs.push_back("-lgcc_s");
5517 CmdArgs.push_back("--no-as-needed");
5518 }
5519
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005520 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005521 if (Args.hasArg(options::OPT_pg))
5522 CmdArgs.push_back("-lpthread_p");
5523 else
5524 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005525 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005526
Roman Divackyc16bb762011-02-10 16:59:40 +00005527 if (Args.hasArg(options::OPT_pg)) {
5528 if (Args.hasArg(options::OPT_shared))
5529 CmdArgs.push_back("-lc");
5530 else
5531 CmdArgs.push_back("-lc_p");
5532 CmdArgs.push_back("-lgcc_p");
5533 } else {
5534 CmdArgs.push_back("-lc");
5535 CmdArgs.push_back("-lgcc");
5536 }
5537
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005538 if (Args.hasArg(options::OPT_static)) {
5539 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005540 } else if (Args.hasArg(options::OPT_pg)) {
5541 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005542 } else {
5543 CmdArgs.push_back("--as-needed");
5544 CmdArgs.push_back("-lgcc_s");
5545 CmdArgs.push_back("--no-as-needed");
5546 }
5547 }
5548
5549 if (!Args.hasArg(options::OPT_nostdlib) &&
5550 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005551 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005552 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005553 else
5554 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005555 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005556 }
5557
Roman Divacky94380162012-08-28 15:09:03 +00005558 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005559
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005560 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005561 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005562 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005563}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005564
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005565void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5566 const InputInfo &Output,
5567 const InputInfoList &Inputs,
5568 const ArgList &Args,
5569 const char *LinkingOutput) const {
5570 ArgStringList CmdArgs;
5571
5572 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5573 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005574 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005575 CmdArgs.push_back("--32");
5576
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005577 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005578 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005579 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005580 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005581 CmdArgs.push_back("-EL");
5582
5583 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5584 options::OPT_Xassembler);
5585
5586 CmdArgs.push_back("-o");
5587 CmdArgs.push_back(Output.getFilename());
5588
5589 for (InputInfoList::const_iterator
5590 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5591 const InputInfo &II = *it;
5592 CmdArgs.push_back(II.getFilename());
5593 }
5594
David Chisnall5adcec12011-09-27 22:03:18 +00005595 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005596 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5597}
5598
5599void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5600 const InputInfo &Output,
5601 const InputInfoList &Inputs,
5602 const ArgList &Args,
5603 const char *LinkingOutput) const {
5604 const Driver &D = getToolChain().getDriver();
5605 ArgStringList CmdArgs;
5606
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005607 if (!D.SysRoot.empty())
5608 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5609
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005610 if (Args.hasArg(options::OPT_static)) {
5611 CmdArgs.push_back("-Bstatic");
5612 } else {
5613 if (Args.hasArg(options::OPT_rdynamic))
5614 CmdArgs.push_back("-export-dynamic");
5615 CmdArgs.push_back("--eh-frame-hdr");
5616 if (Args.hasArg(options::OPT_shared)) {
5617 CmdArgs.push_back("-Bshareable");
5618 } else {
5619 CmdArgs.push_back("-dynamic-linker");
5620 CmdArgs.push_back("/libexec/ld.elf_so");
5621 }
5622 }
5623
5624 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5625 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005626 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005627 CmdArgs.push_back("-m");
5628 CmdArgs.push_back("elf_i386");
5629 }
5630
5631 if (Output.isFilename()) {
5632 CmdArgs.push_back("-o");
5633 CmdArgs.push_back(Output.getFilename());
5634 } else {
5635 assert(Output.isNothing() && "Invalid output.");
5636 }
5637
5638 if (!Args.hasArg(options::OPT_nostdlib) &&
5639 !Args.hasArg(options::OPT_nostartfiles)) {
5640 if (!Args.hasArg(options::OPT_shared)) {
5641 CmdArgs.push_back(Args.MakeArgString(
5642 getToolChain().GetFilePath("crt0.o")));
5643 CmdArgs.push_back(Args.MakeArgString(
5644 getToolChain().GetFilePath("crti.o")));
5645 CmdArgs.push_back(Args.MakeArgString(
5646 getToolChain().GetFilePath("crtbegin.o")));
5647 } else {
5648 CmdArgs.push_back(Args.MakeArgString(
5649 getToolChain().GetFilePath("crti.o")));
5650 CmdArgs.push_back(Args.MakeArgString(
5651 getToolChain().GetFilePath("crtbeginS.o")));
5652 }
5653 }
5654
5655 Args.AddAllArgs(CmdArgs, options::OPT_L);
5656 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5657 Args.AddAllArgs(CmdArgs, options::OPT_e);
5658 Args.AddAllArgs(CmdArgs, options::OPT_s);
5659 Args.AddAllArgs(CmdArgs, options::OPT_t);
5660 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5661 Args.AddAllArgs(CmdArgs, options::OPT_r);
5662
5663 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5664
5665 if (!Args.hasArg(options::OPT_nostdlib) &&
5666 !Args.hasArg(options::OPT_nodefaultlibs)) {
5667 if (D.CCCIsCXX) {
5668 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5669 CmdArgs.push_back("-lm");
5670 }
5671 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5672 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005673 if (Args.hasArg(options::OPT_static)) {
5674 CmdArgs.push_back("-lgcc_eh");
5675 } else {
5676 CmdArgs.push_back("--as-needed");
5677 CmdArgs.push_back("-lgcc_s");
5678 CmdArgs.push_back("--no-as-needed");
5679 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005680 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005681
5682 if (Args.hasArg(options::OPT_pthread))
5683 CmdArgs.push_back("-lpthread");
5684 CmdArgs.push_back("-lc");
5685
5686 CmdArgs.push_back("-lgcc");
5687 if (Args.hasArg(options::OPT_static)) {
5688 CmdArgs.push_back("-lgcc_eh");
5689 } else {
5690 CmdArgs.push_back("--as-needed");
5691 CmdArgs.push_back("-lgcc_s");
5692 CmdArgs.push_back("--no-as-needed");
5693 }
5694 }
5695
5696 if (!Args.hasArg(options::OPT_nostdlib) &&
5697 !Args.hasArg(options::OPT_nostartfiles)) {
5698 if (!Args.hasArg(options::OPT_shared))
5699 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5700 "crtend.o")));
5701 else
5702 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5703 "crtendS.o")));
5704 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5705 "crtn.o")));
5706 }
5707
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005708 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005709
David Chisnall5adcec12011-09-27 22:03:18 +00005710 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005711 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5712}
5713
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005714void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5715 const InputInfo &Output,
5716 const InputInfoList &Inputs,
5717 const ArgList &Args,
5718 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005719 ArgStringList CmdArgs;
5720
5721 // Add --32/--64 to make sure we get the format we want.
5722 // This is incomplete
5723 if (getToolChain().getArch() == llvm::Triple::x86) {
5724 CmdArgs.push_back("--32");
5725 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5726 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005727 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5728 CmdArgs.push_back("-a32");
5729 CmdArgs.push_back("-mppc");
5730 CmdArgs.push_back("-many");
5731 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5732 CmdArgs.push_back("-a64");
5733 CmdArgs.push_back("-mppc64");
5734 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005735 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005736 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005737 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5738 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005739
5740 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5741 getToolChain().getTriple());
5742 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005743
5744 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5745 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5746 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005747 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5748 getToolChain().getArch() == llvm::Triple::mipsel ||
5749 getToolChain().getArch() == llvm::Triple::mips64 ||
5750 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005751 StringRef CPUName;
5752 StringRef ABIName;
5753 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005754
Simon Atanasyan073a7802012-04-07 22:31:29 +00005755 CmdArgs.push_back("-march");
5756 CmdArgs.push_back(CPUName.data());
5757
Simon Atanasyan073a7802012-04-07 22:31:29 +00005758 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005759 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005760
5761 if (getToolChain().getArch() == llvm::Triple::mips ||
5762 getToolChain().getArch() == llvm::Triple::mips64)
5763 CmdArgs.push_back("-EB");
5764 else
5765 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005766
5767 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5768 options::OPT_fpic, options::OPT_fno_pic,
5769 options::OPT_fPIE, options::OPT_fno_PIE,
5770 options::OPT_fpie, options::OPT_fno_pie);
5771 if (LastPICArg &&
5772 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5773 LastPICArg->getOption().matches(options::OPT_fpic) ||
5774 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5775 LastPICArg->getOption().matches(options::OPT_fpie))) {
5776 CmdArgs.push_back("-KPIC");
5777 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005778 }
5779
5780 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5781 options::OPT_Xassembler);
5782
5783 CmdArgs.push_back("-o");
5784 CmdArgs.push_back(Output.getFilename());
5785
5786 for (InputInfoList::const_iterator
5787 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5788 const InputInfo &II = *it;
5789 CmdArgs.push_back(II.getFilename());
5790 }
5791
5792 const char *Exec =
5793 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5794 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5795}
5796
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005797static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5798 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005799 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00005800 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5801 Args.hasArg(options::OPT_static);
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005802 if (!D.CCCIsCXX)
5803 CmdArgs.push_back("-lgcc");
5804
Logan Chien529a73d2012-11-19 12:04:11 +00005805 if (StaticLibgcc || isAndroid) {
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005806 if (D.CCCIsCXX)
5807 CmdArgs.push_back("-lgcc");
5808 } else {
5809 if (!D.CCCIsCXX)
5810 CmdArgs.push_back("--as-needed");
5811 CmdArgs.push_back("-lgcc_s");
5812 if (!D.CCCIsCXX)
5813 CmdArgs.push_back("--no-as-needed");
5814 }
5815
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005816 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005817 CmdArgs.push_back("-lgcc_eh");
5818 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5819 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00005820
5821 // According to Android ABI, we have to link with libdl if we are
5822 // linking with non-static libgcc.
5823 //
5824 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5825 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5826 if (isAndroid && !StaticLibgcc)
5827 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005828}
5829
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005830static bool hasMipsN32ABIArg(const ArgList &Args) {
5831 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00005832 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005833}
5834
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005835void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5836 const InputInfo &Output,
5837 const InputInfoList &Inputs,
5838 const ArgList &Args,
5839 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00005840 const toolchains::Linux& ToolChain =
5841 static_cast<const toolchains::Linux&>(getToolChain());
5842 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00005843 const bool isAndroid =
5844 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00005845 SanitizerArgs Sanitize(getToolChain(), Args);
5846 const bool IsPIE =
5847 !Args.hasArg(options::OPT_shared) &&
5848 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005849
Rafael Espindolac1da9812010-11-07 20:14:31 +00005850 ArgStringList CmdArgs;
5851
Rafael Espindola26f14c32010-11-15 18:28:16 +00005852 // Silence warning for "clang -g foo.o -o foo"
5853 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005854 // and "clang -emit-llvm foo.o -o foo"
5855 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00005856 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00005857 // handled somewhere else.
5858 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00005859
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005860 if (!D.SysRoot.empty())
5861 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005862
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00005863 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00005864 CmdArgs.push_back("-pie");
5865
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00005866 if (Args.hasArg(options::OPT_rdynamic))
5867 CmdArgs.push_back("-export-dynamic");
5868
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00005869 if (Args.hasArg(options::OPT_s))
5870 CmdArgs.push_back("-s");
5871
Rafael Espindolac1da9812010-11-07 20:14:31 +00005872 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5873 e = ToolChain.ExtraOpts.end();
5874 i != e; ++i)
5875 CmdArgs.push_back(i->c_str());
5876
5877 if (!Args.hasArg(options::OPT_static)) {
5878 CmdArgs.push_back("--eh-frame-hdr");
5879 }
5880
5881 CmdArgs.push_back("-m");
5882 if (ToolChain.getArch() == llvm::Triple::x86)
5883 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00005884 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5885 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005886 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00005887 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005888 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005889 else if (ToolChain.getArch() == llvm::Triple::ppc)
5890 CmdArgs.push_back("elf32ppclinux");
5891 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5892 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00005893 else if (ToolChain.getArch() == llvm::Triple::mips)
5894 CmdArgs.push_back("elf32btsmip");
5895 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5896 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005897 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5898 if (hasMipsN32ABIArg(Args))
5899 CmdArgs.push_back("elf32btsmipn32");
5900 else
5901 CmdArgs.push_back("elf64btsmip");
5902 }
5903 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5904 if (hasMipsN32ABIArg(Args))
5905 CmdArgs.push_back("elf32ltsmipn32");
5906 else
5907 CmdArgs.push_back("elf64ltsmip");
5908 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005909 else
5910 CmdArgs.push_back("elf_x86_64");
5911
5912 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00005913 if (ToolChain.getArch() == llvm::Triple::arm
5914 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005915 CmdArgs.push_back("-Bstatic");
5916 else
5917 CmdArgs.push_back("-static");
5918 } else if (Args.hasArg(options::OPT_shared)) {
5919 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00005920 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005921 CmdArgs.push_back("-Bsymbolic");
5922 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005923 }
5924
5925 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00005926 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00005927 (!Args.hasArg(options::OPT_static) &&
5928 !Args.hasArg(options::OPT_shared))) {
5929 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005930 if (isAndroid)
5931 CmdArgs.push_back("/system/bin/linker");
5932 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005933 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northoverc264e162013-01-31 12:13:10 +00005934 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5935 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregorf0594d82011-03-06 19:11:49 +00005936 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liu6cc9dc82012-07-30 11:05:56 +00005937 ToolChain.getArch() == llvm::Triple::thumb) {
5938 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5939 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5940 else
5941 CmdArgs.push_back("/lib/ld-linux.so.3");
5942 }
Eli Friedman5bea4f62011-11-08 19:43:37 +00005943 else if (ToolChain.getArch() == llvm::Triple::mips ||
5944 ToolChain.getArch() == llvm::Triple::mipsel)
5945 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan8491cb22012-04-06 20:14:27 +00005946 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005947 ToolChain.getArch() == llvm::Triple::mips64el) {
5948 if (hasMipsN32ABIArg(Args))
5949 CmdArgs.push_back("/lib32/ld.so.1");
5950 else
5951 CmdArgs.push_back("/lib64/ld.so.1");
5952 }
Ted Kremenek43ac2972011-04-05 22:04:27 +00005953 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005954 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005955 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005956 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005957 else
5958 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5959 }
5960
5961 CmdArgs.push_back("-o");
5962 CmdArgs.push_back(Output.getFilename());
5963
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005964 if (!Args.hasArg(options::OPT_nostdlib) &&
5965 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005966 if (!isAndroid) {
5967 const char *crt1 = NULL;
5968 if (!Args.hasArg(options::OPT_shared)){
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00005969 if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005970 crt1 = "Scrt1.o";
5971 else
5972 crt1 = "crt1.o";
5973 }
5974 if (crt1)
5975 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005976
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005977 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5978 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005979
Rafael Espindola89414b32010-11-12 03:00:39 +00005980 const char *crtbegin;
5981 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005982 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005983 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005984 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00005985 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005986 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005987 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005988 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005989 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00005990
5991 // Add crtfastmath.o if available and fast math is enabled.
5992 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00005993 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005994
5995 Args.AddAllArgs(CmdArgs, options::OPT_L);
5996
5997 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5998
Roman Divacky58e5ac92011-03-01 17:53:14 +00005999 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6000 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006001 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006002
Rafael Espindolac5151542012-04-09 23:53:34 +00006003 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6004 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6005 // forward.
6006 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6007 CmdArgs.push_back("-plugin");
6008 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6009 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006010
6011 // Try to pass driver level flags relevant to LTO code generation down to
6012 // the plugin.
6013
6014 // Handle architecture-specific flags for selecting CPU variants.
6015 if (ToolChain.getArch() == llvm::Triple::x86 ||
6016 ToolChain.getArch() == llvm::Triple::x86_64)
6017 CmdArgs.push_back(
6018 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6019 getX86TargetCPU(Args, ToolChain.getTriple())));
6020 else if (ToolChain.getArch() == llvm::Triple::arm ||
6021 ToolChain.getArch() == llvm::Triple::thumb)
6022 CmdArgs.push_back(
6023 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6024 getARMTargetCPU(Args, ToolChain.getTriple())));
6025
6026 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6027 // as well.
Rafael Espindolac5151542012-04-09 23:53:34 +00006028 }
6029
Chandler Carruth700d4e42013-01-13 11:46:33 +00006030
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006031 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6032 CmdArgs.push_back("--no-demangle");
6033
Rafael Espindolac1da9812010-11-07 20:14:31 +00006034 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6035
Eric Christopher6716d942012-11-29 18:51:05 +00006036 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006037 if (Sanitize.needsUbsanRt())
Richard Smith61a574f2013-03-20 23:49:07 +00006038 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
6039 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6040 Sanitize.needsMsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006041 if (Sanitize.needsAsanRt())
6042 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6043 if (Sanitize.needsTsanRt())
6044 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006045 if (Sanitize.needsMsanRt())
6046 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006047
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006048 if (D.CCCIsCXX &&
6049 !Args.hasArg(options::OPT_nostdlib) &&
6050 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006051 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6052 !Args.hasArg(options::OPT_static);
6053 if (OnlyLibstdcxxStatic)
6054 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006055 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006056 if (OnlyLibstdcxxStatic)
6057 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006058 CmdArgs.push_back("-lm");
6059 }
6060
Rafael Espindola89414b32010-11-12 03:00:39 +00006061 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006062 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6063 if (Args.hasArg(options::OPT_static))
6064 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006065
Chandler Carruthdf96e022013-01-17 13:19:29 +00006066 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6067 if (OpenMP) {
6068 CmdArgs.push_back("-lgomp");
6069
6070 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6071 // librt. Most modern Linux platfroms require it, but some may not.
6072 CmdArgs.push_back("-lrt");
6073 }
6074
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006075 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006076
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006077 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006078 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006079 CmdArgs.push_back("-lpthread");
6080
6081 CmdArgs.push_back("-lc");
6082
6083 if (Args.hasArg(options::OPT_static))
6084 CmdArgs.push_back("--end-group");
6085 else
6086 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6087 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006088
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006089 if (!Args.hasArg(options::OPT_nostartfiles)) {
6090 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006091 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006092 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006093 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006094 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006095 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006096 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006097
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006098 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006099 if (!isAndroid)
6100 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006101 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006102 }
6103
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006104 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006105
Rafael Espindolac1da9812010-11-07 20:14:31 +00006106 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6107}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006108
Chris Lattner38e317d2010-07-07 16:01:42 +00006109void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006110 const InputInfo &Output,
6111 const InputInfoList &Inputs,
6112 const ArgList &Args,
6113 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006114 ArgStringList CmdArgs;
6115
6116 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6117 options::OPT_Xassembler);
6118
6119 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006120 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006121
6122 for (InputInfoList::const_iterator
6123 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6124 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006125 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006126 }
6127
6128 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006129 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006130 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006131}
6132
6133void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006134 const InputInfo &Output,
6135 const InputInfoList &Inputs,
6136 const ArgList &Args,
6137 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006138 const Driver &D = getToolChain().getDriver();
6139 ArgStringList CmdArgs;
6140
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006141 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006142 CmdArgs.push_back("-o");
6143 CmdArgs.push_back(Output.getFilename());
6144 } else {
6145 assert(Output.isNothing() && "Invalid output.");
6146 }
6147
6148 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006149 !Args.hasArg(options::OPT_nostartfiles)) {
6150 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6151 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6152 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6153 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6154 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006155
6156 Args.AddAllArgs(CmdArgs, options::OPT_L);
6157 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6158 Args.AddAllArgs(CmdArgs, options::OPT_e);
6159
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006160 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006161
Eli Friedman6d402dc2011-12-08 23:54:21 +00006162 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6163
Chris Lattner38e317d2010-07-07 16:01:42 +00006164 if (!Args.hasArg(options::OPT_nostdlib) &&
6165 !Args.hasArg(options::OPT_nodefaultlibs)) {
6166 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006167 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006168 CmdArgs.push_back("-lm");
6169 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006170 }
6171
6172 if (!Args.hasArg(options::OPT_nostdlib) &&
6173 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006174 if (Args.hasArg(options::OPT_pthread))
6175 CmdArgs.push_back("-lpthread");
6176 CmdArgs.push_back("-lc");
6177 CmdArgs.push_back("-lCompilerRT-Generic");
6178 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6179 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006180 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006181 }
6182
Eli Friedman6d402dc2011-12-08 23:54:21 +00006183 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006184 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006185}
6186
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006187/// DragonFly Tools
6188
6189// For now, DragonFly Assemble does just about the same as for
6190// FreeBSD, but this may change soon.
6191void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006192 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006193 const InputInfoList &Inputs,
6194 const ArgList &Args,
6195 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006196 ArgStringList CmdArgs;
6197
6198 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6199 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006200 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006201 CmdArgs.push_back("--32");
6202
6203 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6204 options::OPT_Xassembler);
6205
6206 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006207 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006208
6209 for (InputInfoList::const_iterator
6210 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6211 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006212 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006213 }
6214
6215 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006216 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006217 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006218}
6219
6220void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006221 const InputInfo &Output,
6222 const InputInfoList &Inputs,
6223 const ArgList &Args,
6224 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006225 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006226 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006227 ArgStringList CmdArgs;
6228
John McCall8cfb7202013-04-11 22:55:55 +00006229 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6230 UseGCC47 = false;
6231
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006232 if (!D.SysRoot.empty())
6233 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6234
John McCall8cfb7202013-04-11 22:55:55 +00006235 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006236 if (Args.hasArg(options::OPT_static)) {
6237 CmdArgs.push_back("-Bstatic");
6238 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006239 if (Args.hasArg(options::OPT_rdynamic))
6240 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006241 if (Args.hasArg(options::OPT_shared))
6242 CmdArgs.push_back("-Bshareable");
6243 else {
6244 CmdArgs.push_back("-dynamic-linker");
6245 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6246 }
John McCall8cfb7202013-04-11 22:55:55 +00006247 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006248 }
6249
6250 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6251 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006252 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006253 CmdArgs.push_back("-m");
6254 CmdArgs.push_back("elf_i386");
6255 }
6256
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006257 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006258 CmdArgs.push_back("-o");
6259 CmdArgs.push_back(Output.getFilename());
6260 } else {
6261 assert(Output.isNothing() && "Invalid output.");
6262 }
6263
6264 if (!Args.hasArg(options::OPT_nostdlib) &&
6265 !Args.hasArg(options::OPT_nostartfiles)) {
6266 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006267 if (Args.hasArg(options::OPT_pg))
6268 CmdArgs.push_back(Args.MakeArgString(
6269 getToolChain().GetFilePath("gcrt1.o")));
6270 else {
6271 if (Args.hasArg(options::OPT_pie))
6272 CmdArgs.push_back(Args.MakeArgString(
6273 getToolChain().GetFilePath("Scrt1.o")));
6274 else
6275 CmdArgs.push_back(Args.MakeArgString(
6276 getToolChain().GetFilePath("crt1.o")));
6277 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006278 }
John McCall8cfb7202013-04-11 22:55:55 +00006279 CmdArgs.push_back(Args.MakeArgString(
6280 getToolChain().GetFilePath("crti.o")));
6281 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6282 CmdArgs.push_back(Args.MakeArgString(
6283 getToolChain().GetFilePath("crtbeginS.o")));
6284 else
6285 CmdArgs.push_back(Args.MakeArgString(
6286 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006287 }
6288
6289 Args.AddAllArgs(CmdArgs, options::OPT_L);
6290 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6291 Args.AddAllArgs(CmdArgs, options::OPT_e);
6292
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006293 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006294
6295 if (!Args.hasArg(options::OPT_nostdlib) &&
6296 !Args.hasArg(options::OPT_nodefaultlibs)) {
6297 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6298 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006299 if (UseGCC47)
6300 CmdArgs.push_back("-L/usr/lib/gcc47");
6301 else
6302 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006303
6304 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006305 if (UseGCC47) {
6306 CmdArgs.push_back("-rpath");
6307 CmdArgs.push_back("/usr/lib/gcc47");
6308 } else {
6309 CmdArgs.push_back("-rpath");
6310 CmdArgs.push_back("/usr/lib/gcc44");
6311 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006312 }
6313
Rafael Espindola405861d2010-07-20 12:59:03 +00006314 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006315 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006316 CmdArgs.push_back("-lm");
6317 }
6318
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006319 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006320 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006321
6322 if (!Args.hasArg(options::OPT_nolibc)) {
6323 CmdArgs.push_back("-lc");
6324 }
6325
John McCall8cfb7202013-04-11 22:55:55 +00006326 if (UseGCC47) {
6327 if (Args.hasArg(options::OPT_static) ||
6328 Args.hasArg(options::OPT_static_libgcc)) {
6329 CmdArgs.push_back("-lgcc");
6330 CmdArgs.push_back("-lgcc_eh");
6331 } else {
6332 if (Args.hasArg(options::OPT_shared_libgcc)) {
6333 CmdArgs.push_back("-lgcc_pic");
6334 if (!Args.hasArg(options::OPT_shared))
6335 CmdArgs.push_back("-lgcc");
6336 } else {
6337 CmdArgs.push_back("-lgcc");
6338 CmdArgs.push_back("--as-needed");
6339 CmdArgs.push_back("-lgcc_pic");
6340 CmdArgs.push_back("--no-as-needed");
6341 }
6342 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006343 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006344 if (Args.hasArg(options::OPT_shared)) {
6345 CmdArgs.push_back("-lgcc_pic");
6346 } else {
6347 CmdArgs.push_back("-lgcc");
6348 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006349 }
6350 }
6351
6352 if (!Args.hasArg(options::OPT_nostdlib) &&
6353 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006354 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006355 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006356 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006357 else
6358 CmdArgs.push_back(Args.MakeArgString(
6359 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006360 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006361 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006362 }
6363
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006364 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006365
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006366 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006367 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006368 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006369}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006370
6371void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6372 const InputInfo &Output,
6373 const InputInfoList &Inputs,
6374 const ArgList &Args,
6375 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006376 ArgStringList CmdArgs;
6377
6378 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006379 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6380 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006381 } else {
6382 assert(Output.isNothing() && "Invalid output.");
6383 }
6384
6385 if (!Args.hasArg(options::OPT_nostdlib) &&
6386 !Args.hasArg(options::OPT_nostartfiles)) {
6387 CmdArgs.push_back("-defaultlib:libcmt");
6388 }
6389
6390 CmdArgs.push_back("-nologo");
6391
Michael J. Spencera2284f52012-06-18 16:56:04 +00006392 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6393
6394 // Add filenames immediately.
6395 for (InputInfoList::const_iterator
6396 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6397 if (it->isFilename())
6398 CmdArgs.push_back(it->getFilename());
6399 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006400
6401 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006402 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006403 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6404}