blob: 7932ba2827184dfb4ba680721b525cd4e34812b0 [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 Gregor8ee51ef2011-09-14 20:28:46 +0000417
418 // If a module path was provided, pass it along. Otherwise, use a temporary
419 // directory.
420 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000421 A->claim();
422 A->render(Args, CmdArgs);
423 } else {
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000424 SmallString<128> DefaultModuleCache;
Douglas Gregor8ee51ef2011-09-14 20:28:46 +0000425 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
426 DefaultModuleCache);
427 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
428 CmdArgs.push_back("-fmodule-cache-path");
429 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
430 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000431
432 // Pass through all -fmodules-ignore-macro arguments.
433 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregorfba18aa2011-09-15 22:00:41 +0000434
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000435 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000436 // FIXME: We should probably sink the logic for handling these from the
437 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000438 // CPATH - included following the user specified includes (but prior to
439 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000440 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000441 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000442 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000443 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000444 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000445 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000446 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000447 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000448 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000449
Chandler Carruth88491fc2011-11-04 07:12:53 +0000450 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000451 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000452 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000453
454 // Add system include arguments.
455 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000456}
457
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000458/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000459/// CPU.
460//
461// FIXME: This is redundant with -mcpu, why does LLVM use this.
462// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000463static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000464 return llvm::StringSwitch<const char *>(CPU)
465 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
466 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
467 .Cases("arm920", "arm920t", "arm922t", "v4t")
468 .Cases("arm940t", "ep9312","v4t")
469 .Cases("arm10tdmi", "arm1020t", "v5")
470 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
471 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
472 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
473 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
474 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
475 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Quentin Colombet74632aa2012-11-29 23:15:27 +0000476 .Cases("cortex-a5", "cortex-a8", "cortex-a9", "cortex-a15", "v7")
Quentin Colombetab137512012-12-21 17:57:47 +0000477 .Case("cortex-r5", "v7r")
Bob Wilson57f6d192012-03-21 17:19:12 +0000478 .Case("cortex-m3", "v7m")
Jim Grosbach69033132012-03-29 19:53:34 +0000479 .Case("cortex-m4", "v7m")
Bob Wilson57f6d192012-03-21 17:19:12 +0000480 .Case("cortex-m0", "v6m")
Bob Wilson336bfa32012-09-29 23:52:50 +0000481 .Case("cortex-a9-mp", "v7f")
482 .Case("swift", "v7s")
Chad Rosierae1aee62011-10-07 17:48:56 +0000483 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000484}
485
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000486/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
487//
488// FIXME: tblgen this.
489static std::string getARMTargetCPU(const ArgList &Args,
490 const llvm::Triple &Triple) {
491 // FIXME: Warn on inconsistent use of -mcpu and -march.
492
493 // If we have -mcpu=, use that.
494 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000495 StringRef MCPU = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000496 // Handle -mcpu=native.
497 if (MCPU == "native")
498 return llvm::sys::getHostCPUName();
499 else
500 return MCPU;
501 }
502
503 StringRef MArch;
504 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
505 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smith1d489cf2012-11-01 04:30:05 +0000506 MArch = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000507 } else {
508 // Otherwise, use the Arch from the triple.
509 MArch = Triple.getArchName();
510 }
511
512 // Handle -march=native.
513 std::string NativeMArch;
514 if (MArch == "native") {
515 std::string CPU = llvm::sys::getHostCPUName();
516 if (CPU != "generic") {
517 // Translate the native cpu into the architecture. The switch below will
518 // then chose the minimum cpu for that arch.
519 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
520 MArch = NativeMArch;
521 }
522 }
523
524 return llvm::StringSwitch<const char *>(MArch)
525 .Cases("armv2", "armv2a","arm2")
526 .Case("armv3", "arm6")
527 .Case("armv3m", "arm7m")
528 .Cases("armv4", "armv4t", "arm7tdmi")
529 .Cases("armv5", "armv5t", "arm10tdmi")
530 .Cases("armv5e", "armv5te", "arm1022e")
531 .Case("armv5tej", "arm926ej-s")
532 .Cases("armv6", "armv6k", "arm1136jf-s")
533 .Case("armv6j", "arm1136j-s")
534 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
535 .Case("armv6t2", "arm1156t2-s")
536 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson336bfa32012-09-29 23:52:50 +0000537 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
538 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000539 .Cases("armv7r", "armv7-r", "cortex-r4")
540 .Cases("armv7m", "armv7-m", "cortex-m3")
541 .Case("ep9312", "ep9312")
542 .Case("iwmmxt", "iwmmxt")
543 .Case("xscale", "xscale")
544 .Cases("armv6m", "armv6-m", "cortex-m0")
545 // If all else failed, return the most base CPU LLVM supports.
546 .Default("arm7tdmi");
547}
548
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000549// FIXME: Move to target hook.
550static bool isSignedCharDefault(const llvm::Triple &Triple) {
551 switch (Triple.getArch()) {
552 default:
553 return true;
554
Tim Northoverc264e162013-01-31 12:13:10 +0000555 case llvm::Triple::aarch64:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000556 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000557 case llvm::Triple::ppc:
558 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000559 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000560 return true;
561 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000562 }
563}
564
Chad Rosier99317272012-04-04 20:51:35 +0000565// Handle -mfpu=.
566//
567// FIXME: Centralize feature selection, defaulting shouldn't be also in the
568// frontend target.
569static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
570 ArgStringList &CmdArgs) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000571 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000572
573 // Set the target features based on the FPU.
574 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
575 // Disable any default FPU support.
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("-vfp2");
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("-vfp3");
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("-neon");
582 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("+vfp3");
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("+d16");
587 CmdArgs.push_back("-target-feature");
588 CmdArgs.push_back("-neon");
589 } else if (FPU == "vfp") {
590 CmdArgs.push_back("-target-feature");
591 CmdArgs.push_back("+vfp2");
592 CmdArgs.push_back("-target-feature");
593 CmdArgs.push_back("-neon");
594 } else if (FPU == "vfp3" || FPU == "vfpv3") {
595 CmdArgs.push_back("-target-feature");
596 CmdArgs.push_back("+vfp3");
597 CmdArgs.push_back("-target-feature");
598 CmdArgs.push_back("-neon");
599 } else if (FPU == "neon") {
600 CmdArgs.push_back("-target-feature");
601 CmdArgs.push_back("+neon");
602 } else
603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Chad Rosier7a938fa2012-04-04 20:39:32 +0000606// Handle -mfpmath=.
607static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000608 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000609 StringRef FPMath = A->getValue();
Chad Rosier7a938fa2012-04-04 20:39:32 +0000610
611 // Set the target features based on the FPMath.
612 if (FPMath == "neon") {
613 CmdArgs.push_back("-target-feature");
614 CmdArgs.push_back("+neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000615
Silviu Baranga2df67ea2012-09-13 15:06:00 +0000616 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
Quentin Colombet74632aa2012-11-29 23:15:27 +0000617 CPU != "cortex-a15" && CPU != "cortex-a5")
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000618 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
619
Chad Rosier7a938fa2012-04-04 20:39:32 +0000620 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
621 FPMath == "vfp4") {
622 CmdArgs.push_back("-target-feature");
623 CmdArgs.push_back("-neonfp");
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000624
625 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier7a938fa2012-04-04 20:39:32 +0000626 } else
627 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
628}
629
Anton Korobeynikove2571792012-04-09 13:38:30 +0000630// Select the float ABI as determined by -msoft-float, -mhard-float, and
631// -mfloat-abi=.
632static StringRef getARMFloatABI(const Driver &D,
633 const ArgList &Args,
634 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000635 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000636 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
637 options::OPT_mhard_float,
638 options::OPT_mfloat_abi_EQ)) {
639 if (A->getOption().matches(options::OPT_msoft_float))
640 FloatABI = "soft";
641 else if (A->getOption().matches(options::OPT_mhard_float))
642 FloatABI = "hard";
643 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000644 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000645 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000646 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000647 << A->getAsString(Args);
648 FloatABI = "soft";
649 }
650 }
651 }
652
653 // If unspecified, choose the default based on the platform.
654 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000655 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000656 case llvm::Triple::Darwin:
657 case llvm::Triple::MacOSX:
658 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000659 // Darwin defaults to "softfp" for v6 and v7.
660 //
661 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000662 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000663 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000664 if (StringRef(ArchName).startswith("v6") ||
665 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000666 FloatABI = "softfp";
667 else
668 FloatABI = "soft";
669 break;
670 }
671
Rafael Espindola27fa2362012-12-13 04:17:14 +0000672 case llvm::Triple::FreeBSD:
673 // FreeBSD defaults to soft float
674 FloatABI = "soft";
675 break;
676
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000677 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000678 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000679 case llvm::Triple::GNUEABIHF:
680 FloatABI = "hard";
681 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000682 case llvm::Triple::GNUEABI:
683 FloatABI = "softfp";
684 break;
685 case llvm::Triple::EABI:
686 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
687 FloatABI = "softfp";
688 break;
Logan Chien94a71422012-09-02 09:30:11 +0000689 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000690 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000691 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000692 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000693 FloatABI = "softfp";
694 else
695 FloatABI = "soft";
696 break;
697 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000698 default:
699 // Assume "soft", but warn the user we are guessing.
700 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000701 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000702 break;
703 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000704 }
705 }
706
Anton Korobeynikove2571792012-04-09 13:38:30 +0000707 return FloatABI;
708}
709
710
711void Clang::AddARMTargetArgs(const ArgList &Args,
712 ArgStringList &CmdArgs,
713 bool KernelOrKext) const {
714 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000715 // Get the effective triple, which takes into account the deployment target.
716 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
717 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000718 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000719
720 // Select the ABI to use.
721 //
722 // FIXME: Support -meabi.
723 const char *ABIName = 0;
724 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000725 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000726 } else if (Triple.isOSDarwin()) {
727 // The backend is hardwired to assume AAPCS for M-class processors, ensure
728 // the frontend matches that.
729 if (StringRef(CPUName).startswith("cortex-m")) {
730 ABIName = "aapcs";
731 } else {
732 ABIName = "apcs-gnu";
733 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000734 } else {
735 // Select the default based on the platform.
736 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000737 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000738 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000739 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000740 ABIName = "aapcs-linux";
741 break;
742 case llvm::Triple::EABI:
743 ABIName = "aapcs";
744 break;
745 default:
746 ABIName = "apcs-gnu";
747 }
748 }
749 CmdArgs.push_back("-target-abi");
750 CmdArgs.push_back(ABIName);
751
752 // Set the CPU based on -march= and -mcpu=.
753 CmdArgs.push_back("-target-cpu");
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000754 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikove2571792012-04-09 13:38:30 +0000755
756 // Determine floating point ABI from the options & target defaults.
757 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000758 if (FloatABI == "soft") {
759 // Floating point operations and argument passing are soft.
760 //
761 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000762 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000763 CmdArgs.push_back("-mfloat-abi");
764 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000765 } else if (FloatABI == "softfp") {
766 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000767 CmdArgs.push_back("-mfloat-abi");
768 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000769 } else {
770 // Floating point operations and argument passing are hard.
771 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000772 CmdArgs.push_back("-mfloat-abi");
773 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000774 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000775
776 // Set appropriate target features for floating point mode.
777 //
778 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
779 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
780 // stripped out by the ARM target.
781
782 // Use software floating point operations?
783 if (FloatABI == "soft") {
784 CmdArgs.push_back("-target-feature");
785 CmdArgs.push_back("+soft-float");
786 }
787
788 // Use software floating point argument passing?
789 if (FloatABI != "hard") {
790 CmdArgs.push_back("-target-feature");
791 CmdArgs.push_back("+soft-float-abi");
792 }
Daniel Dunbara91320b2009-12-21 23:28:17 +0000793
794 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +0000795 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +0000796 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000797
Chad Rosier7a938fa2012-04-04 20:39:32 +0000798 // Honor -mfpmath=.
799 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +0000800 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier7a938fa2012-04-04 20:39:32 +0000801
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000802 // Setting -msoft-float effectively disables NEON because of the GCC
803 // implementation, although the same isn't true of VFP or VFP3.
804 if (FloatABI == "soft") {
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000805 CmdArgs.push_back("-target-feature");
806 CmdArgs.push_back("-neon");
807 }
808
809 // Kernel code has more strict alignment requirements.
810 if (KernelOrKext) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000811 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
812 CmdArgs.push_back("-backend-option");
813 CmdArgs.push_back("-arm-long-calls");
814 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000815
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000816 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000817 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000818
819 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000820 CmdArgs.push_back("-backend-option");
821 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000822 }
Chad Rosier1b906052011-08-26 00:26:29 +0000823
824 // Setting -mno-global-merge disables the codegen global merge pass. Setting
825 // -mglobal-merge has no effect as the pass is enabled by default.
826 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
827 options::OPT_mno_global_merge)) {
828 if (A->getOption().matches(options::OPT_mno_global_merge))
829 CmdArgs.push_back("-mno-global-merge");
830 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000831
Chad Rosier005af272012-05-16 21:19:55 +0000832 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000833 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000834}
835
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000836// Translate MIPS CPU name alias option to CPU name.
837static StringRef getMipsCPUFromAlias(const Arg &A) {
838 if (A.getOption().matches(options::OPT_mips32))
839 return "mips32";
840 if (A.getOption().matches(options::OPT_mips32r2))
841 return "mips32r2";
842 if (A.getOption().matches(options::OPT_mips64))
843 return "mips64";
844 if (A.getOption().matches(options::OPT_mips64r2))
845 return "mips64r2";
846 llvm_unreachable("Unexpected option");
847 return "";
848}
849
Simon Atanasyana2768be2012-04-07 22:09:23 +0000850// Get CPU and ABI names. They are not independent
851// so we have to calculate them together.
852static void getMipsCPUAndABI(const ArgList &Args,
853 const ToolChain &TC,
854 StringRef &CPUName,
855 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000856 const char *DefMips32CPU = "mips32";
857 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000858
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000859 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000860 options::OPT_mcpu_EQ,
861 options::OPT_mips_CPUs_Group)) {
862 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
863 CPUName = getMipsCPUFromAlias(*A);
864 else
Richard Smith1d489cf2012-11-01 04:30:05 +0000865 CPUName = A->getValue();
Simon Atanasyan8e1c5982012-09-21 20:19:32 +0000866 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000867
Akira Hatanaka9f360622011-09-26 21:07:52 +0000868 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +0000869 ABIName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000870
871 // Setup default CPU and ABI names.
872 if (CPUName.empty() && ABIName.empty()) {
873 switch (TC.getTriple().getArch()) {
874 default:
875 llvm_unreachable("Unexpected triple arch name");
876 case llvm::Triple::mips:
877 case llvm::Triple::mipsel:
878 CPUName = DefMips32CPU;
879 break;
880 case llvm::Triple::mips64:
881 case llvm::Triple::mips64el:
882 CPUName = DefMips64CPU;
883 break;
884 }
885 }
886
887 if (!ABIName.empty()) {
888 // Deduce CPU name from ABI name.
889 CPUName = llvm::StringSwitch<const char *>(ABIName)
890 .Cases("o32", "eabi", DefMips32CPU)
891 .Cases("n32", "n64", DefMips64CPU)
892 .Default("");
893 }
894 else if (!CPUName.empty()) {
895 // Deduce ABI name from CPU name.
896 ABIName = llvm::StringSwitch<const char *>(CPUName)
897 .Cases("mips32", "mips32r2", "o32")
898 .Cases("mips64", "mips64r2", "n64")
899 .Default("");
900 }
901
902 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000903}
904
Simon Atanasyan5e627792012-06-02 15:06:29 +0000905// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
906// and -mfloat-abi=.
907static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000908 // Select the float ABI as determined by -msoft-float, -mhard-float,
909 // and -mfloat-abi=.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000910 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000911 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000912 options::OPT_mhard_float,
913 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000914 if (A->getOption().matches(options::OPT_msoft_float))
915 FloatABI = "soft";
916 else if (A->getOption().matches(options::OPT_mhard_float))
917 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000918 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000919 FloatABI = A->getValue();
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000920 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000921 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000922 FloatABI = "hard";
923 }
924 }
Eric Christophered734732010-03-02 02:41:08 +0000925 }
926
927 // If unspecified, choose the default based on the platform.
928 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000929 // Assume "hard", because it's a default value used by gcc.
930 // When we start to recognize specific target MIPS processors,
931 // we will be able to select the default more correctly.
932 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000933 }
934
Simon Atanasyan5e627792012-06-02 15:06:29 +0000935 return FloatABI;
936}
937
Simon Atanasyandc536f52012-07-05 18:51:43 +0000938static void AddTargetFeature(const ArgList &Args,
939 ArgStringList &CmdArgs,
940 OptSpecifier OnOpt,
941 OptSpecifier OffOpt,
942 StringRef FeatureName) {
943 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
944 CmdArgs.push_back("-target-feature");
945 if (A->getOption().matches(OnOpt))
946 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
947 else
948 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
949 }
950}
951
Simon Atanasyan5e627792012-06-02 15:06:29 +0000952void Clang::AddMIPSTargetArgs(const ArgList &Args,
953 ArgStringList &CmdArgs) const {
954 const Driver &D = getToolChain().getDriver();
955 StringRef CPUName;
956 StringRef ABIName;
957 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
958
959 CmdArgs.push_back("-target-cpu");
960 CmdArgs.push_back(CPUName.data());
961
962 CmdArgs.push_back("-target-abi");
963 CmdArgs.push_back(ABIName.data());
964
965 StringRef FloatABI = getMipsFloatABI(D, Args);
966
Simon Atanasyane1d792f2013-01-10 12:36:19 +0000967 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
968
969 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +0000970 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +0000971 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000972 CmdArgs.push_back("-mfloat-abi");
973 CmdArgs.push_back("soft");
974
975 // FIXME: Note, this is a hack. We need to pass the selected float
976 // mode to the MipsTargetInfoBase to define appropriate macros there.
977 // Now it is the only method.
978 CmdArgs.push_back("-target-feature");
979 CmdArgs.push_back("+soft-float");
Simon Atanasyane1d792f2013-01-10 12:36:19 +0000980
981 if (FloatABI == "hard" && IsMips16) {
982 CmdArgs.push_back("-mllvm");
983 CmdArgs.push_back("-mips16-hard-float");
984 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000985 }
986 else if (FloatABI == "single") {
987 // Restrict the use of hardware floating-point
988 // instructions to 32-bit operations.
989 CmdArgs.push_back("-target-feature");
990 CmdArgs.push_back("+single-float");
991 }
992 else {
993 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +0000994 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000995 CmdArgs.push_back("-mfloat-abi");
996 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +0000997 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +0000998
Simon Atanasyandc536f52012-07-05 18:51:43 +0000999 AddTargetFeature(Args, CmdArgs,
1000 options::OPT_mips16, options::OPT_mno_mips16,
1001 "mips16");
Simon Atanasyand797a852012-07-05 19:23:00 +00001002 AddTargetFeature(Args, CmdArgs,
1003 options::OPT_mdsp, options::OPT_mno_dsp,
1004 "dsp");
1005 AddTargetFeature(Args, CmdArgs,
1006 options::OPT_mdspr2, options::OPT_mno_dspr2,
1007 "dspr2");
Simon Atanasyan9804b762012-08-27 20:55:56 +00001008
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001009 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1010 if (A->getOption().matches(options::OPT_mxgot)) {
1011 CmdArgs.push_back("-mllvm");
1012 CmdArgs.push_back("-mxgot");
1013 }
1014 }
1015
Simon Atanasyan9804b762012-08-27 20:55:56 +00001016 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001017 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001018 CmdArgs.push_back("-mllvm");
1019 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1020 A->claim();
1021 }
Eric Christophered734732010-03-02 02:41:08 +00001022}
1023
Hal Finkel02a84272012-06-11 22:35:19 +00001024/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1025static std::string getPPCTargetCPU(const ArgList &Args) {
1026 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001027 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001028
1029 if (CPUName == "native") {
1030 std::string CPU = llvm::sys::getHostCPUName();
1031 if (!CPU.empty() && CPU != "generic")
1032 return CPU;
1033 else
1034 return "";
1035 }
1036
1037 return llvm::StringSwitch<const char *>(CPUName)
1038 .Case("common", "generic")
1039 .Case("440", "440")
1040 .Case("440fp", "440")
1041 .Case("450", "450")
1042 .Case("601", "601")
1043 .Case("602", "602")
1044 .Case("603", "603")
1045 .Case("603e", "603e")
1046 .Case("603ev", "603ev")
1047 .Case("604", "604")
1048 .Case("604e", "604e")
1049 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001050 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001051 .Case("G3", "g3")
1052 .Case("7400", "7400")
1053 .Case("G4", "g4")
1054 .Case("7450", "7450")
1055 .Case("G4+", "g4+")
1056 .Case("750", "750")
1057 .Case("970", "970")
1058 .Case("G5", "g5")
1059 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001060 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001061 .Case("e500mc", "e500mc")
1062 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001063 .Case("power3", "pwr3")
1064 .Case("power4", "pwr4")
1065 .Case("power5", "pwr5")
1066 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001067 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001068 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001069 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001070 .Case("pwr3", "pwr3")
1071 .Case("pwr4", "pwr4")
1072 .Case("pwr5", "pwr5")
1073 .Case("pwr5x", "pwr5x")
1074 .Case("pwr6", "pwr6")
1075 .Case("pwr6x", "pwr6x")
1076 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001077 .Case("powerpc", "ppc")
1078 .Case("powerpc64", "ppc64")
1079 .Default("");
1080 }
1081
1082 return "";
1083}
1084
1085void Clang::AddPPCTargetArgs(const ArgList &Args,
1086 ArgStringList &CmdArgs) const {
1087 std::string TargetCPUName = getPPCTargetCPU(Args);
1088
1089 // LLVM may default to generating code for the native CPU,
1090 // but, like gcc, we default to a more generic option for
1091 // each architecture. (except on Darwin)
1092 llvm::Triple Triple = getToolChain().getTriple();
1093 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1094 if (Triple.getArch() == llvm::Triple::ppc64)
1095 TargetCPUName = "ppc64";
1096 else
1097 TargetCPUName = "ppc";
1098 }
1099
1100 if (!TargetCPUName.empty()) {
1101 CmdArgs.push_back("-target-cpu");
1102 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1103 }
Bill Schmidt199402b2013-02-01 02:14:03 +00001104
1105 // Allow override of the Altivec feature.
1106 if (Args.hasFlag(options::OPT_fno_altivec, options::OPT_faltivec, false)) {
1107 CmdArgs.push_back("-target-feature");
1108 CmdArgs.push_back("-altivec");
1109 }
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001110
1111 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1112 CmdArgs.push_back("-target-feature");
1113 CmdArgs.push_back("-qpx");
1114 }
Hal Finkel02a84272012-06-11 22:35:19 +00001115}
1116
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001117void Clang::AddSparcTargetArgs(const ArgList &Args,
1118 ArgStringList &CmdArgs) const {
1119 const Driver &D = getToolChain().getDriver();
1120
1121 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001122 CmdArgs.push_back("-target-cpu");
Richard Smith1d489cf2012-11-01 04:30:05 +00001123 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001124 }
1125
1126 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001127 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001128 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1129 options::OPT_mhard_float)) {
1130 if (A->getOption().matches(options::OPT_msoft_float))
1131 FloatABI = "soft";
1132 else if (A->getOption().matches(options::OPT_mhard_float))
1133 FloatABI = "hard";
1134 }
1135
1136 // If unspecified, choose the default based on the platform.
1137 if (FloatABI.empty()) {
1138 switch (getToolChain().getTriple().getOS()) {
1139 default:
1140 // Assume "soft", but warn the user we are guessing.
1141 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +00001142 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001143 break;
1144 }
1145 }
1146
1147 if (FloatABI == "soft") {
1148 // Floating point operations and argument passing are soft.
1149 //
1150 // FIXME: This changes CPP defines, we need -target-soft-float.
1151 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001152 CmdArgs.push_back("-target-feature");
1153 CmdArgs.push_back("+soft-float");
1154 } else {
1155 assert(FloatABI == "hard" && "Invalid float abi!");
1156 CmdArgs.push_back("-mhard-float");
1157 }
1158}
1159
Chandler Carruth700d4e42013-01-13 11:46:33 +00001160static const char *getX86TargetCPU(const ArgList &Args,
1161 const llvm::Triple &Triple) {
1162 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1163 if (StringRef(A->getValue()) != "native")
1164 return A->getValue();
1165
1166 // FIXME: Reject attempts to use -march=native unless the target matches
1167 // the host.
1168 //
1169 // FIXME: We should also incorporate the detected target features for use
1170 // with -native.
1171 std::string CPU = llvm::sys::getHostCPUName();
1172 if (!CPU.empty() && CPU != "generic")
1173 return Args.MakeArgString(CPU);
1174 }
1175
1176 // Select the default CPU if none was given (or detection failed).
1177
1178 if (Triple.getArch() != llvm::Triple::x86_64 &&
1179 Triple.getArch() != llvm::Triple::x86)
1180 return 0; // This routine is only handling x86 targets.
1181
1182 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1183
1184 // FIXME: Need target hooks.
1185 if (Triple.isOSDarwin())
1186 return Is64Bit ? "core2" : "yonah";
1187
1188 // Everything else goes to x86-64 in 64-bit mode.
1189 if (Is64Bit)
1190 return "x86-64";
1191
1192 if (Triple.getOSName().startswith("haiku"))
1193 return "i586";
1194 if (Triple.getOSName().startswith("openbsd"))
1195 return "i486";
1196 if (Triple.getOSName().startswith("bitrig"))
1197 return "i686";
1198 if (Triple.getOSName().startswith("freebsd"))
1199 return "i486";
1200 if (Triple.getOSName().startswith("netbsd"))
1201 return "i486";
1202 // All x86 devices running Android have core2 as their common
1203 // denominator. This makes a better choice than pentium4.
1204 if (Triple.getEnvironment() == llvm::Triple::Android)
1205 return "core2";
1206
1207 // Fallback to p4.
1208 return "pentium4";
1209}
1210
Daniel Dunbar6acda162009-09-09 22:33:08 +00001211void Clang::AddX86TargetArgs(const ArgList &Args,
1212 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001213 if (!Args.hasFlag(options::OPT_mred_zone,
1214 options::OPT_mno_red_zone,
1215 true) ||
1216 Args.hasArg(options::OPT_mkernel) ||
1217 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001218 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001219
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001220 if (Args.hasFlag(options::OPT_msoft_float,
1221 options::OPT_mno_soft_float,
1222 false))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001223 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001224
Chandler Carruth700d4e42013-01-13 11:46:33 +00001225 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbar38b48af2009-12-18 06:30:12 +00001226 CmdArgs.push_back("-target-cpu");
Daniel Dunbarf86fedd2009-11-14 22:04:54 +00001227 CmdArgs.push_back(CPUName);
1228 }
1229
Eli Friedmand18eeca2011-07-02 00:34:19 +00001230 // The required algorithm here is slightly strange: the options are applied
1231 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1232 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1233 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1234 // former correctly, but not the latter; handle directly-overridden
1235 // attributes here.
1236 llvm::StringMap<unsigned> PrevFeature;
1237 std::vector<const char*> Features;
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001238 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1239 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001240 StringRef Name = (*it)->getOption().getName();
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00001241 (*it)->claim();
Daniel Dunbar6acda162009-09-09 22:33:08 +00001242
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001243 // Skip over "-m".
Michael J. Spencerc6357102012-10-22 22:13:48 +00001244 assert(Name.startswith("m") && "Invalid feature name.");
1245 Name = Name.substr(1);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001246
Daniel Dunbarcdd96862009-11-25 11:53:23 +00001247 bool IsNegative = Name.startswith("no-");
1248 if (IsNegative)
1249 Name = Name.substr(3);
Daniel Dunbar6acda162009-09-09 22:33:08 +00001250
Eli Friedmand18eeca2011-07-02 00:34:19 +00001251 unsigned& Prev = PrevFeature[Name];
1252 if (Prev)
1253 Features[Prev - 1] = 0;
1254 Prev = Features.size() + 1;
1255 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1256 }
1257 for (unsigned i = 0; i < Features.size(); i++) {
1258 if (Features[i]) {
1259 CmdArgs.push_back("-target-feature");
1260 CmdArgs.push_back(Features[i]);
1261 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001262 }
1263}
1264
Matthew Curtis33c95f12012-12-06 17:49:03 +00001265static inline bool HasPICArg(const ArgList &Args) {
1266 return Args.hasArg(options::OPT_fPIC)
1267 || Args.hasArg(options::OPT_fpic);
1268}
1269
1270static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1271 return Args.getLastArg(options::OPT_G,
1272 options::OPT_G_EQ,
1273 options::OPT_msmall_data_threshold_EQ);
1274}
1275
1276static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1277 std::string value;
1278 if (HasPICArg(Args))
1279 value = "0";
1280 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1281 value = A->getValue();
1282 A->claim();
1283 }
1284 return value;
1285}
1286
Tony Linthicum96319392011-12-12 21:14:55 +00001287void Clang::AddHexagonTargetArgs(const ArgList &Args,
1288 ArgStringList &CmdArgs) const {
1289 llvm::Triple Triple = getToolChain().getTriple();
1290
1291 CmdArgs.push_back("-target-cpu");
Matthew Curtis67814152012-12-06 14:16:43 +00001292 CmdArgs.push_back(Args.MakeArgString(
1293 "hexagon"
1294 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum96319392011-12-12 21:14:55 +00001295 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001296 CmdArgs.push_back("-mqdsp6-compat");
1297 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001298
Matthew Curtis33c95f12012-12-06 17:49:03 +00001299 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1300 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001301 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001302 CmdArgs.push_back(Args.MakeArgString(
1303 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001304 }
1305
Sirish Pande5f9688b2012-05-10 20:19:54 +00001306 if (!Args.hasArg(options::OPT_fno_short_enums))
1307 CmdArgs.push_back("-fshort-enums");
1308 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1309 CmdArgs.push_back ("-mllvm");
1310 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1311 }
Tony Linthicum96319392011-12-12 21:14:55 +00001312 CmdArgs.push_back ("-mllvm");
1313 CmdArgs.push_back ("-machine-sink-split=0");
1314}
1315
Eric Christopher88b7cf02011-08-19 00:30:14 +00001316static bool
John McCall260611a2012-06-20 06:18:46 +00001317shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001318 const llvm::Triple &Triple) {
1319 // We use the zero-cost exception tables for Objective-C if the non-fragile
1320 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1321 // later.
John McCall260611a2012-06-20 06:18:46 +00001322 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001323 return true;
1324
Bob Wilson905c45f2011-10-14 05:03:44 +00001325 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001326 return false;
1327
Eric Christopheraa7333c2011-07-02 00:20:22 +00001328 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001329 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001330 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001331}
1332
Anders Carlsson15348ae2011-02-28 02:27:16 +00001333/// addExceptionArgs - Adds exception related arguments to the driver command
1334/// arguments. There's a master flag, -fexceptions and also language specific
1335/// flags to enable/disable C++ and Objective-C exceptions.
1336/// This makes it possible to for example disable C++ exceptions but enable
1337/// Objective-C exceptions.
1338static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1339 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001340 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001341 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001342 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001343 if (KernelOrKext) {
1344 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1345 // arguments now to avoid warnings about unused arguments.
1346 Args.ClaimAllArgs(options::OPT_fexceptions);
1347 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1348 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1349 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1350 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1351 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001352 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001353 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001354
1355 // Exceptions are enabled by default.
1356 bool ExceptionsEnabled = true;
1357
1358 // This keeps track of whether exceptions were explicitly turned on or off.
1359 bool DidHaveExplicitExceptionFlag = false;
1360
Rafael Espindolaf759df02009-10-01 13:33:33 +00001361 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1362 options::OPT_fno_exceptions)) {
1363 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001364 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001365 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001366 ExceptionsEnabled = false;
1367
1368 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001369 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001370
Anders Carlsson15348ae2011-02-28 02:27:16 +00001371 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001372
Anders Carlsson15348ae2011-02-28 02:27:16 +00001373 // Exception tables and cleanups can be enabled with -fexceptions even if the
1374 // language itself doesn't support exceptions.
1375 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1376 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001377
Daniel Dunbard47ea692011-03-17 23:28:31 +00001378 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1379 // is not necessarily sensible, but follows GCC.
1380 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001381 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001382 options::OPT_fno_objc_exceptions,
1383 true)) {
1384 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001385
Eric Christopher88b7cf02011-08-19 00:30:14 +00001386 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001387 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001388 }
1389
1390 if (types::isCXX(InputType)) {
1391 bool CXXExceptionsEnabled = ExceptionsEnabled;
1392
Eric Christopher88b7cf02011-08-19 00:30:14 +00001393 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1394 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001395 options::OPT_fexceptions,
1396 options::OPT_fno_exceptions)) {
1397 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1398 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001399 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001400 CXXExceptionsEnabled = false;
1401 }
1402
1403 if (CXXExceptionsEnabled) {
1404 CmdArgs.push_back("-fcxx-exceptions");
1405
1406 ShouldUseExceptionTables = true;
1407 }
1408 }
1409
1410 if (ShouldUseExceptionTables)
1411 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001412}
1413
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001414static bool ShouldDisableCFI(const ArgList &Args,
1415 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001416 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001417 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001418 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001419 // we disable them if we think the .s file will be passed to it.
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001420 Default = Args.hasFlag(options::OPT_integrated_as,
Eric Christopher27e2b982012-12-18 00:31:10 +00001421 options::OPT_no_integrated_as,
1422 TC.IsIntegratedAssemblerDefault());
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001423 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001424 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001425 options::OPT_fno_dwarf2_cfi_asm,
1426 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001427}
1428
Nick Lewyckyea523d72011-10-17 23:05:52 +00001429static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1430 const ToolChain &TC) {
1431 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1432 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1433 options::OPT_no_integrated_as,
1434 IsIADefault);
1435 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1436 options::OPT_fno_dwarf_directory_asm,
1437 UseIntegratedAs);
1438 return !UseDwarfDirectory;
1439}
1440
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001441/// \brief Check whether the given input tree contains any compilation actions.
1442static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001443 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001444 return true;
1445
1446 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1447 if (ContainsCompileAction(*it))
1448 return true;
1449
1450 return false;
1451}
1452
1453/// \brief Check if -relax-all should be passed to the internal assembler.
1454/// This is done by default when compiling non-assembler source with -O0.
1455static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1456 bool RelaxDefault = true;
1457
1458 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1459 RelaxDefault = A->getOption().matches(options::OPT_O0);
1460
1461 if (RelaxDefault) {
1462 RelaxDefault = false;
1463 for (ActionList::const_iterator it = C.getActions().begin(),
1464 ie = C.getActions().end(); it != ie; ++it) {
1465 if (ContainsCompileAction(*it)) {
1466 RelaxDefault = true;
1467 break;
1468 }
1469 }
1470 }
1471
1472 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1473 RelaxDefault);
1474}
1475
Alexey Samsonova40548c2013-01-16 11:34:36 +00001476SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args)
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001477 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1478 AsanZeroBaseShadow(false) {
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001479 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1480 // at least once (possibly, disabled further).
Richard Smithc4dabad2012-11-05 22:04:41 +00001481 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov3325b162012-11-28 17:34:24 +00001482 unsigned Add, Remove;
1483 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smithc4dabad2012-11-05 22:04:41 +00001484 continue;
Richard Smithc4dabad2012-11-05 22:04:41 +00001485 (*I)->claim();
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00001486 Kind |= Add;
1487 Kind &= ~Remove;
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001488 AllKinds |= Add;
Richard Smithc4dabad2012-11-05 22:04:41 +00001489 }
1490
Chad Rosier78d85b12013-01-29 23:31:22 +00001491 UbsanTrapOnError =
1492 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1493 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1494 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1495
1496 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1497 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1498 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1499 D.Diag(diag::err_drv_argument_not_allowed_with)
1500 << "-fcatch-undefined-behavior"
1501 << "-fno-sanitize-undefined-trap-on-error";
1502 }
1503
1504 // Warn about undefined sanitizer options that require runtime support.
1505 if (UbsanTrapOnError && notAllowedWithTrap()) {
1506 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1507 D.Diag(diag::err_drv_argument_not_allowed_with)
1508 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1509 << "-fcatch-undefined-behavior";
1510 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1511 options::OPT_fno_sanitize_undefined_trap_on_error,
1512 false))
1513 D.Diag(diag::err_drv_argument_not_allowed_with)
1514 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1515 << "-fsanitize-undefined-trap-on-error";
1516 }
1517
Richard Smithc4dabad2012-11-05 22:04:41 +00001518 // Only one runtime library can be used at once.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00001519 bool NeedsAsan = needsAsanRt();
1520 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001521 bool NeedsMsan = needsMsanRt();
Richard Smith05650372012-12-01 01:02:45 +00001522 if (NeedsAsan && NeedsTsan)
Richard Smithc4dabad2012-11-05 22:04:41 +00001523 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith05650372012-12-01 01:02:45 +00001524 << lastArgumentForKind(D, Args, NeedsAsanRt)
1525 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001526 if (NeedsAsan && NeedsMsan)
1527 D.Diag(diag::err_drv_argument_not_allowed_with)
1528 << lastArgumentForKind(D, Args, NeedsAsanRt)
1529 << lastArgumentForKind(D, Args, NeedsMsanRt);
1530 if (NeedsTsan && NeedsMsan)
1531 D.Diag(diag::err_drv_argument_not_allowed_with)
1532 << lastArgumentForKind(D, Args, NeedsTsanRt)
1533 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +00001534
1535 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov3e335c12013-01-28 07:20:44 +00001536 // explicitly contain -fsanitize=address (probably, turned off later in the
1537 // command line).
1538 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1539 D.Diag(diag::warn_drv_unused_sanitizer)
1540 << lastArgumentForKind(D, Args, AddressFull)
1541 << "-fsanitize=address";
Alexey Samsonov91ecfa62012-12-03 19:12:58 +00001542
1543 // Parse -f(no-)sanitize-blacklist options.
1544 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1545 options::OPT_fno_sanitize_blacklist)) {
1546 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1547 std::string BLPath = BLArg->getValue();
1548 bool BLExists = false;
1549 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1550 BlacklistFile = BLPath;
1551 else
1552 D.Diag(diag::err_drv_no_such_file) << BLPath;
1553 }
1554 }
Evgeniy Stepanov34ef11b2012-12-24 08:42:34 +00001555
1556 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001557 if (NeedsMsan)
Evgeniy Stepanov34ef11b2012-12-24 08:42:34 +00001558 MsanTrackOrigins =
1559 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1560 options::OPT_fno_sanitize_memory_track_origins,
1561 /* Default */false);
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001562
1563 // Parse -f(no-)sanitize-address-zero-base-shadow options.
1564 if (NeedsAsan)
1565 AsanZeroBaseShadow =
1566 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1567 options::OPT_fno_sanitize_address_zero_base_shadow,
1568 /* Default */false);
Richard Smithc4dabad2012-11-05 22:04:41 +00001569}
1570
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001571/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1572/// This needs to be called before we add the C run-time (malloc, etc).
1573static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001574 ArgStringList &CmdArgs) {
Logan Chien94a71422012-09-02 09:30:11 +00001575 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001576 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanov83738622012-06-04 11:15:05 +00001577 if (!Args.hasArg(options::OPT_pie))
1578 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001579 }
Daniel Dunbar8cd0d252011-12-07 23:22:17 +00001580
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001581 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1582 llvm::sys::path::append(LibAsan, "lib", "linux",
1583 (Twine("libclang_rt.asan-") +
1584 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001585 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001586 } else {
1587 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonov4bdc6042013-01-20 13:12:12 +00001588 bool ZeroBaseShadow = Args.hasFlag(
1589 options::OPT_fsanitize_address_zero_base_shadow,
1590 options::OPT_fno_sanitize_address_zero_base_shadow, false);
1591 if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) {
1592 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1593 "-fsanitize-address-zero-base-shadow" << "-pie";
1594 }
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001595 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1596 // resource directory.
1597 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1598 llvm::sys::path::append(LibAsan, "lib", "linux",
1599 (Twine("libclang_rt.asan-") +
1600 TC.getArchName() + ".a"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001601 // The ASan runtime needs to come before -lstdc++ (or -lc++, libstdc++.a,
1602 // etc.) so that the linker picks ASan's versions of the global 'operator
1603 // new' and 'operator delete' symbols. We take the extreme (but simple)
Chandler Carruth1d153982012-12-04 22:54:37 +00001604 // strategy of inserting it at the front of the link command. It also
1605 // needs to be forced to end up in the executable, so wrap it in
1606 // whole-archive.
1607 SmallVector<const char*, 3> PrefixArgs;
1608 PrefixArgs.push_back("-whole-archive");
1609 PrefixArgs.push_back(Args.MakeArgString(LibAsan));
1610 PrefixArgs.push_back("-no-whole-archive");
1611 CmdArgs.insert(CmdArgs.begin(), PrefixArgs.begin(), PrefixArgs.end());
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001612 CmdArgs.push_back("-lpthread");
1613 CmdArgs.push_back("-ldl");
1614 CmdArgs.push_back("-export-dynamic");
1615 }
1616 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001617}
1618
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001619/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1620/// This needs to be called before we add the C run-time (malloc, etc).
1621static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1622 ArgStringList &CmdArgs) {
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001623 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001624 if (!Args.hasArg(options::OPT_pie))
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001625 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1626 "-fsanitize=thread" << "-pie";
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001627 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1628 // resource directory.
1629 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1630 llvm::sys::path::append(LibTsan, "lib", "linux",
1631 (Twine("libclang_rt.tsan-") +
1632 TC.getArchName() + ".a"));
1633 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1634 CmdArgs.push_back("-lpthread");
1635 CmdArgs.push_back("-ldl");
1636 CmdArgs.push_back("-export-dynamic");
1637 }
1638}
1639
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001640/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1641/// This needs to be called before we add the C run-time (malloc, etc).
1642static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1643 ArgStringList &CmdArgs) {
1644 if (!Args.hasArg(options::OPT_shared)) {
1645 if (!Args.hasArg(options::OPT_pie))
Evgeniy Stepanov99469f72012-12-05 13:37:12 +00001646 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1647 "-fsanitize=memory" << "-pie";
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001648 // LibMsan is "libclang_rt.msan-<ArchName>.a" in the Linux library
1649 // resource directory.
1650 SmallString<128> LibMsan(TC.getDriver().ResourceDir);
1651 llvm::sys::path::append(LibMsan, "lib", "linux",
1652 (Twine("libclang_rt.msan-") +
1653 TC.getArchName() + ".a"));
1654 CmdArgs.push_back(Args.MakeArgString(LibMsan));
1655 CmdArgs.push_back("-lpthread");
1656 CmdArgs.push_back("-ldl");
1657 CmdArgs.push_back("-export-dynamic");
1658 }
1659}
1660
Richard Smith4def70d2012-10-09 19:52:38 +00001661/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1662/// (Linux).
1663static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1664 ArgStringList &CmdArgs) {
Richard Smith79188ae2013-01-18 22:09:26 +00001665 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1666 // resource directory.
1667 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1668 llvm::sys::path::append(LibUbsan, "lib", "linux",
1669 (Twine("libclang_rt.ubsan-") +
1670 TC.getArchName() + ".a"));
1671 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
1672 CmdArgs.push_back("-lpthread");
1673 CmdArgs.push_back("-export-dynamic");
Richard Smith4def70d2012-10-09 19:52:38 +00001674}
1675
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001676static bool shouldUseFramePointer(const ArgList &Args,
1677 const llvm::Triple &Triple) {
1678 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1679 options::OPT_fomit_frame_pointer))
1680 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1681
Rafael Espindolaa2a17892011-12-14 21:50:24 +00001682 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001683 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1684 Triple.getArch() == llvm::Triple::x86) &&
1685 Triple.getOS() == llvm::Triple::Linux) {
1686 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1687 if (!A->getOption().matches(options::OPT_O0))
1688 return false;
1689 }
1690
1691 return true;
1692}
1693
Chandler Carruthd566df62012-12-17 21:40:04 +00001694/// If the PWD environment variable is set, add a CC1 option to specify the
1695/// debug compilation directory.
1696static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1697 if (const char *pwd = ::getenv("PWD")) {
1698 // GCC also verifies that stat(pwd) and stat(".") have the same inode
1699 // number. Not doing those because stats are slow, but we could.
1700 if (llvm::sys::path::is_absolute(pwd)) {
1701 std::string CompDir = pwd;
1702 CmdArgs.push_back("-fdebug-compilation-dir");
1703 CmdArgs.push_back(Args.MakeArgString(CompDir));
1704 }
1705 }
1706}
1707
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001708void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001709 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001710 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001711 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001712 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001713 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1714 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001715 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001716 ArgStringList CmdArgs;
1717
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001718 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1719
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001720 // Invoke ourselves in -cc1 mode.
1721 //
1722 // FIXME: Implement custom jobs for internal actions.
1723 CmdArgs.push_back("-cc1");
1724
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001725 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001726 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001727 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001728 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001729
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001730 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001731 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001732
Daniel Dunbar1d460332009-03-18 10:01:51 +00001733 if (isa<AnalyzeJobAction>(JA)) {
1734 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1735 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001736 } else if (isa<MigrateJobAction>(JA)) {
1737 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001738 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001739 if (Output.getType() == types::TY_Dependencies)
1740 CmdArgs.push_back("-Eonly");
1741 else
1742 CmdArgs.push_back("-E");
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001743 } else if (isa<AssembleJobAction>(JA)) {
1744 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001745
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001746 if (UseRelaxAll(C, Args))
Daniel Dunbar99298002010-05-27 06:18:05 +00001747 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00001748
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001749 // When using an integrated assembler, translate -Wa, and -Xassembler
1750 // options.
1751 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1752 options::OPT_Xassembler),
1753 ie = Args.filtered_end(); it != ie; ++it) {
1754 const Arg *A = *it;
1755 A->claim();
1756
1757 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001758 StringRef Value = A->getValue(i);
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001759
1760 if (Value == "-force_cpusubtype_ALL") {
1761 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbarb14eed02010-10-28 20:36:23 +00001762 } else if (Value == "-L") {
Daniel Dunbar96932322011-03-28 22:49:28 +00001763 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger46a49392011-05-19 20:46:39 +00001764 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerd7933502011-05-19 18:42:29 +00001765 CmdArgs.push_back("-mllvm");
1766 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyc3b90142011-06-21 00:14:18 +00001767 } else if (Value == "--noexecstack") {
1768 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001769 } else {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001770 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbarfcec10b2010-10-18 22:36:15 +00001771 << A->getOption().getName() << Value;
1772 }
1773 }
1774 }
Daniel Dunbard02bba82010-11-19 16:23:35 +00001775
1776 // Also ignore explicit -force_cpusubtype_ALL option.
1777 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00001778 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00001779 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001780 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00001781
Aaron Ballman761322b2012-07-31 01:21:00 +00001782 if (JA.getType() == types::TY_Nothing)
1783 CmdArgs.push_back("-fsyntax-only");
1784 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00001785 CmdArgs.push_back("-emit-pch");
1786 else
1787 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001788 } else {
1789 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001790
Daniel Dunbar1d460332009-03-18 10:01:51 +00001791 if (JA.getType() == types::TY_Nothing) {
1792 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001793 } else if (JA.getType() == types::TY_LLVM_IR ||
1794 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001795 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00001796 } else if (JA.getType() == types::TY_LLVM_BC ||
1797 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00001798 CmdArgs.push_back("-emit-llvm-bc");
1799 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00001800 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00001801 } else if (JA.getType() == types::TY_AST) {
1802 CmdArgs.push_back("-emit-pch");
Daniel Dunbar64952502010-02-11 03:16:21 +00001803 } else if (JA.getType() == types::TY_RewrittenObjC) {
1804 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001805 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00001806 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1807 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00001808 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00001809 } else {
1810 assert(JA.getType() == types::TY_PP_Asm &&
1811 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001812 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001813 }
1814
Daniel Dunbar1d460332009-03-18 10:01:51 +00001815 // The make clang go fast button.
1816 CmdArgs.push_back("-disable-free");
1817
John McCallb689afb2010-02-13 03:50:24 +00001818 // Disable the verification pass in -asserts builds.
1819#ifdef NDEBUG
1820 CmdArgs.push_back("-disable-llvm-verifier");
1821#endif
1822
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001823 // Set the main file name, so that debug info works even with
1824 // -save-temps.
1825 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00001826 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00001827
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001828 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00001829 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00001830 if (Args.hasArg(options::OPT_static))
1831 CmdArgs.push_back("-static-define");
1832
Daniel Dunbar1d460332009-03-18 10:01:51 +00001833 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00001834 // Enable region store model by default.
1835 CmdArgs.push_back("-analyzer-store=region");
1836
Ted Kremenekb40d06d2009-12-07 22:26:14 +00001837 // Treat blocks as analysis entry points.
1838 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1839
Ted Kremenek51885072011-03-24 00:28:47 +00001840 CmdArgs.push_back("-analyzer-eagerly-assume");
1841
Daniel Dunbar1d460332009-03-18 10:01:51 +00001842 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001843 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001844 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00001845
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001846 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1847 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00001848
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00001849 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00001850 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00001851
1852 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00001853
1854 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00001855 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1856 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1857 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1858 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1859 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1860 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001861 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00001862
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001863 // Set the output format. The default is plist, for (lame) historical
1864 // reasons.
1865 CmdArgs.push_back("-analyzer-output");
1866 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00001867 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00001868 else
1869 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001870
Ted Kremenek0647a7b2010-03-22 22:32:05 +00001871 // Disable the presentation of standard compiler warnings when
1872 // using --analyze. We only want to show static analyzer diagnostics
1873 // or frontend errors.
1874 CmdArgs.push_back("-w");
1875
Daniel Dunbar1d460332009-03-18 10:01:51 +00001876 // Add -Xanalyzer arguments when running as analyzer.
1877 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00001878 }
1879
Daniel Dunbare2fd6642009-09-10 01:21:12 +00001880 CheckCodeGenerationOptions(D, Args);
1881
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001882 // For the PIC and PIE flag options, this logic is different from the legacy
1883 // logic in very old versions of GCC, as that logic was just a bug no one had
1884 // ever fixed. This logic is both more rational and consistent with GCC's new
1885 // logic now that the bugs are fixed. The last argument relating to either
1886 // PIC or PIE wins, and no other argument is used. If the last argument is
1887 // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
1888 // PIE option implicitly enables PIC at the same level.
1889 bool PIE = false;
1890 bool PIC = getToolChain().isPICDefault();
1891 bool IsPICLevelTwo = PIC;
1892 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1893 options::OPT_fpic, options::OPT_fno_pic,
1894 options::OPT_fPIE, options::OPT_fno_PIE,
1895 options::OPT_fpie, options::OPT_fno_pie)) {
1896 Option O = A->getOption();
1897 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1898 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1899 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1900 PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1901 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
1902 O.matches(options::OPT_fPIC);
1903 } else {
1904 PIE = PIC = false;
1905 }
Benjamin Kramerb12ecd32012-11-13 15:32:35 +00001906 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001907 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
1908 // is forced, then neither PIC nor PIE flags will have no effect.
1909 if (getToolChain().isPICDefaultForced()) {
1910 PIE = false;
1911 PIC = getToolChain().isPICDefault();
1912 IsPICLevelTwo = PIC;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001913 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001914
1915 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
1916 // specified while enabling PIC enabled level 1 PIC, just force it back to
1917 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
1918 // informal testing).
1919 if (PIC && getToolChain().getTriple().isOSDarwin())
1920 IsPICLevelTwo |= getToolChain().isPICDefault();
1921
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001922 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1923 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00001924 llvm::Triple Triple(TripleStr);
1925 if ((Args.hasArg(options::OPT_mkernel) ||
1926 Args.hasArg(options::OPT_fapple_kext)) &&
1927 (Triple.getOS() != llvm::Triple::IOS ||
1928 Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001929 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001930 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001931 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001932
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001933 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1934 // This is a very special mode. It trumps the other modes, almost no one
1935 // uses it, and it isn't even valid on any OS but Darwin.
1936 if (!getToolChain().getTriple().isOSDarwin())
1937 D.Diag(diag::err_drv_unsupported_opt_for_target)
1938 << A->getSpelling() << getToolChain().getTriple().str();
1939
1940 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
1941
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001942 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001943 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001944
Chandler Carruth7ce816a2012-11-19 03:52:03 +00001945 // Only a forced PIC mode can cause the actual compile to have PIC defines
1946 // etc., no flags are sufficient. This behavior was selected to closely
1947 // match that of llvm-gcc and Apple GCC before that.
1948 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
1949 CmdArgs.push_back("-pic-level");
1950 CmdArgs.push_back("2");
1951 }
1952 } else {
1953 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
1954 // handled in Clang's IRGen by the -pie-level flag.
1955 CmdArgs.push_back("-mrelocation-model");
1956 CmdArgs.push_back(PIC ? "pic" : "static");
1957
1958 if (PIC) {
1959 CmdArgs.push_back("-pic-level");
1960 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1961 if (PIE) {
1962 CmdArgs.push_back("-pie-level");
1963 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1964 }
1965 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00001966 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00001967
Tanya Lattner59876c22009-11-04 01:18:09 +00001968 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1969 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00001970 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00001971
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001972 // LLVM Code Generator Options.
1973
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001974 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1975 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00001976 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00001977 }
1978
Roman Divackycfe9af22011-03-01 17:40:53 +00001979 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1980 CmdArgs.push_back("-mrtd");
1981
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001982 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00001983 CmdArgs.push_back("-mdisable-fp-elim");
1984 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1985 options::OPT_fno_zero_initialized_in_bss))
1986 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar398c6102011-02-04 02:20:39 +00001987 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1988 options::OPT_fno_strict_aliasing,
1989 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00001990 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00001991 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1992 false))
1993 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00001994 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1995 options::OPT_fno_optimize_sibling_calls))
1996 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00001997
Chandler Carruthabf07a72012-01-02 14:19:45 +00001998 // Handle various floating point optimization flags, mapping them to the
1999 // appropriate LLVM code generation flags. The pattern for all of these is to
2000 // default off the codegen optimizations, and if any flag enables them and no
2001 // flag disables them after the flag enabling them, enable the codegen
2002 // optimization. This is complicated by several "umbrella" flags.
2003 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002004 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002005 options::OPT_ffinite_math_only,
2006 options::OPT_fno_finite_math_only,
2007 options::OPT_fhonor_infinities,
2008 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002009 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2010 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002011 A->getOption().getID() != options::OPT_fhonor_infinities)
2012 CmdArgs.push_back("-menable-no-infs");
2013 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002014 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002015 options::OPT_ffinite_math_only,
2016 options::OPT_fno_finite_math_only,
2017 options::OPT_fhonor_nans,
2018 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002019 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2020 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002021 A->getOption().getID() != options::OPT_fhonor_nans)
2022 CmdArgs.push_back("-menable-no-nans");
2023
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002024 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2025 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruthabf07a72012-01-02 14:19:45 +00002026 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002027 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002028 options::OPT_fmath_errno,
Chandler Carruth4f50c502012-04-26 02:10:51 +00002029 options::OPT_fno_math_errno))
2030 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2031 if (MathErrno)
2032 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002033
2034 // There are several flags which require disabling very specific
2035 // optimizations. Any of these being disabled forces us to turn off the
2036 // entire set of LLVM optimizations, so collect them through all the flag
2037 // madness.
2038 bool AssociativeMath = false;
2039 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002040 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002041 options::OPT_funsafe_math_optimizations,
2042 options::OPT_fno_unsafe_math_optimizations,
2043 options::OPT_fassociative_math,
2044 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002045 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2046 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002047 A->getOption().getID() != options::OPT_fno_associative_math)
2048 AssociativeMath = true;
2049 bool ReciprocalMath = false;
2050 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002051 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002052 options::OPT_funsafe_math_optimizations,
2053 options::OPT_fno_unsafe_math_optimizations,
2054 options::OPT_freciprocal_math,
2055 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002056 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2057 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002058 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2059 ReciprocalMath = true;
2060 bool SignedZeros = true;
2061 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002062 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002063 options::OPT_funsafe_math_optimizations,
2064 options::OPT_fno_unsafe_math_optimizations,
2065 options::OPT_fsigned_zeros,
2066 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002067 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2068 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002069 A->getOption().getID() != options::OPT_fsigned_zeros)
2070 SignedZeros = false;
2071 bool TrappingMath = true;
2072 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002073 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002074 options::OPT_funsafe_math_optimizations,
2075 options::OPT_fno_unsafe_math_optimizations,
2076 options::OPT_ftrapping_math,
2077 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002078 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2079 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002080 A->getOption().getID() != options::OPT_ftrapping_math)
2081 TrappingMath = false;
2082 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2083 !TrappingMath)
2084 CmdArgs.push_back("-menable-unsafe-fp-math");
2085
Lang Hamesc9686712012-07-06 00:59:19 +00002086
2087 // Validate and pass through -fp-contract option.
2088 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002089 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002090 options::OPT_ffp_contract)) {
2091 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002092 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002093 if (Val == "fast" || Val == "on" || Val == "off") {
2094 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2095 } else {
2096 D.Diag(diag::err_drv_unsupported_option_argument)
2097 << A->getOption().getName() << Val;
2098 }
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002099 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesc9686712012-07-06 00:59:19 +00002100 // If fast-math is set then set the fp-contract mode to fast.
2101 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2102 }
2103 }
2104
Bob Wilson455e72e2012-07-19 03:52:53 +00002105 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2106 // and if we find them, tell the frontend to provide the appropriate
2107 // preprocessor macros. This is distinct from enabling any optimizations as
2108 // these options induce language changes which must survive serialization
2109 // and deserialization, etc.
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002110 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2111 if (A->getOption().matches(options::OPT_ffast_math))
2112 CmdArgs.push_back("-ffast-math");
2113 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2114 if (A->getOption().matches(options::OPT_ffinite_math_only))
2115 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002116
Daniel Dunbar1b718482010-05-14 22:00:22 +00002117 // Decide whether to use verbose asm. Verbose assembly is the default on
2118 // toolchains which have the integrated assembler on by default.
2119 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2120 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002121 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002122 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002123 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002124
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002125 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2126 CmdArgs.push_back("-mdebug-pass");
2127 CmdArgs.push_back("Structure");
2128 }
2129 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2130 CmdArgs.push_back("-mdebug-pass");
2131 CmdArgs.push_back("Arguments");
2132 }
2133
John McCalld0c2ec42010-02-19 02:45:38 +00002134 // Enable -mconstructor-aliases except on darwin, where we have to
2135 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002136 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002137 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002138
John McCall32096692011-03-18 02:56:14 +00002139 // Darwin's kernel doesn't support guard variables; just die if we
2140 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002141 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002142 CmdArgs.push_back("-fforbid-guard-variables");
2143
Douglas Gregor6f755502011-02-01 15:15:22 +00002144 if (Args.hasArg(options::OPT_mms_bitfields)) {
2145 CmdArgs.push_back("-mms-bitfields");
2146 }
John McCalld0c2ec42010-02-19 02:45:38 +00002147
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002148 // This is a coarse approximation of what llvm-gcc actually does, both
2149 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2150 // complicated ways.
2151 bool AsynchronousUnwindTables =
2152 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2153 options::OPT_fno_asynchronous_unwind_tables,
2154 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002155 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002156 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2157 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002158 CmdArgs.push_back("-munwind-tables");
2159
Chandler Carrutha6b25812012-11-21 23:40:23 +00002160 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002161
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002162 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2163 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002164 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002165 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002166
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002167 // FIXME: Handle -mtune=.
2168 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002169
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002170 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002171 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002172 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002173 }
2174
Daniel Dunbar6acda162009-09-09 22:33:08 +00002175 // Add target specific cpu and features flags.
2176 switch(getToolChain().getTriple().getArch()) {
2177 default:
2178 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002179
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002180 case llvm::Triple::arm:
2181 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002182 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002183 break;
2184
Eric Christophered734732010-03-02 02:41:08 +00002185 case llvm::Triple::mips:
2186 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002187 case llvm::Triple::mips64:
2188 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002189 AddMIPSTargetArgs(Args, CmdArgs);
2190 break;
2191
Hal Finkel02a84272012-06-11 22:35:19 +00002192 case llvm::Triple::ppc:
2193 case llvm::Triple::ppc64:
2194 AddPPCTargetArgs(Args, CmdArgs);
2195 break;
2196
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002197 case llvm::Triple::sparc:
2198 AddSparcTargetArgs(Args, CmdArgs);
2199 break;
2200
Daniel Dunbar6acda162009-09-09 22:33:08 +00002201 case llvm::Triple::x86:
2202 case llvm::Triple::x86_64:
2203 AddX86TargetArgs(Args, CmdArgs);
2204 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002205
2206 case llvm::Triple::hexagon:
2207 AddHexagonTargetArgs(Args, CmdArgs);
2208 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002209 }
2210
Tony Linthicum96319392011-12-12 21:14:55 +00002211
2212
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002213 // Pass the linker version in use.
2214 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2215 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002216 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002217 }
2218
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00002219 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002220 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewyckyb2d11cc2011-02-02 06:43:03 +00002221 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson905c45f2011-10-14 05:03:44 +00002222 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002223 CmdArgs.push_back("-momit-leaf-frame-pointer");
2224
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002225 // Explicitly error on some things we know we don't support and can't just
2226 // ignore.
2227 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002228 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2229 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002230 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002231 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbare94db472010-09-24 19:39:37 +00002232 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002233 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2234 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002235 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002236 << Unsupported->getOption().getName();
2237 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002238 }
2239
Daniel Dunbar1d460332009-03-18 10:01:51 +00002240 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002241 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002242 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002243 CmdArgs.push_back("-header-include-file");
2244 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2245 D.CCPrintHeadersFilename : "-");
2246 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002247 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002248 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002249
Chad Rosier2b819102011-08-02 17:58:04 +00002250 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002251 CmdArgs.push_back("-diagnostic-log-file");
2252 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2253 D.CCLogDiagnosticsFilename : "-");
2254 }
2255
Eric Christopherc706c8e2013-02-05 07:29:57 +00002256 // Use the last option from "-g" group. "-gline-tables-only"
2257 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002258 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002259 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002260 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002261 CmdArgs.push_back("-gline-tables-only");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002262 else if (!A->getOption().matches(options::OPT_g0) &&
2263 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosiercf6ba2e2011-11-07 19:52:29 +00002264 CmdArgs.push_back("-g");
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002265 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002266
Alexey Samsonov7f326072012-06-21 08:22:39 +00002267 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2268 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002269 if (Args.hasArg(options::OPT_gcolumn_info))
2270 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002271
Eric Christopherc706c8e2013-02-05 07:29:57 +00002272 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2273 // splitting and extraction.
2274 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
2275 CmdArgs.push_back("-g");
2276 CmdArgs.push_back("-backend-option");
2277 CmdArgs.push_back("-split-dwarf=Enable");
2278 }
2279
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002280 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2281 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2282
Chris Lattner7255a2d2010-06-22 00:03:40 +00002283 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2284
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002285 if (Args.hasArg(options::OPT_ftest_coverage) ||
2286 Args.hasArg(options::OPT_coverage))
2287 CmdArgs.push_back("-femit-coverage-notes");
2288 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2289 Args.hasArg(options::OPT_coverage))
2290 CmdArgs.push_back("-femit-coverage-data");
2291
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002292 if (C.getArgs().hasArg(options::OPT_c) ||
2293 C.getArgs().hasArg(options::OPT_S)) {
2294 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002295 CmdArgs.push_back("-coverage-file");
Bill Wendlingecbbea42012-08-30 00:43:41 +00002296 SmallString<128> absFilename(Output.getFilename());
2297 llvm::sys::fs::make_absolute(absFilename);
2298 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002299 }
2300 }
2301
Daniel Dunbara268fc02011-10-11 18:20:10 +00002302 // Pass options for controlling the default header search paths.
2303 if (Args.hasArg(options::OPT_nostdinc)) {
2304 CmdArgs.push_back("-nostdsysteminc");
2305 CmdArgs.push_back("-nobuiltininc");
2306 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002307 if (Args.hasArg(options::OPT_nostdlibinc))
2308 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002309 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2310 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2311 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002312
Daniel Dunbar5f122322009-12-15 01:02:52 +00002313 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002314 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002315 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002316
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002317 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2318
Ted Kremenek30660a82012-03-06 20:06:33 +00002319 bool ARCMTEnabled = false;
John McCall8f0e8d22011-06-15 23:25:17 +00002320 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002321 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002322 options::OPT_ccc_arcmt_modify,
2323 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002324 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002325 switch (A->getOption().getID()) {
2326 default:
2327 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002328 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002329 CmdArgs.push_back("-arcmt-check");
2330 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002331 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002332 CmdArgs.push_back("-arcmt-modify");
2333 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002334 case options::OPT_ccc_arcmt_migrate:
2335 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002336 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002337 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002338
2339 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2340 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002341 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002342 }
2343 }
2344 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002345
Ted Kremenek30660a82012-03-06 20:06:33 +00002346 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2347 if (ARCMTEnabled) {
2348 D.Diag(diag::err_drv_argument_not_allowed_with)
2349 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2350 }
2351 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002352 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002353
2354 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2355 options::OPT_objcmt_migrate_subscripting)) {
2356 // None specified, means enable them all.
2357 CmdArgs.push_back("-objcmt-migrate-literals");
2358 CmdArgs.push_back("-objcmt-migrate-subscripting");
2359 } else {
2360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2362 }
2363 }
2364
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002365 // Add preprocessing options like -I, -D, etc. if we are using the
2366 // preprocessor.
2367 //
2368 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002369 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002370 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002371
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002372 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2373 // that "The compiler can only warn and ignore the option if not recognized".
2374 // When building with ccache, it will pass -D options to clang even on
2375 // preprocessed inputs and configure concludes that -fPIC is not supported.
2376 Args.ClaimAllArgs(options::OPT_D);
2377
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002378 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar337a6272009-03-24 20:17:30 +00002379 // others.
2380 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +00002381 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar337a6272009-03-24 20:17:30 +00002382 CmdArgs.push_back("-O3");
Daniel Dunbar473916c2010-05-27 06:51:08 +00002383 else if (A->getOption().matches(options::OPT_O) &&
Richard Smith1d489cf2012-11-01 04:30:05 +00002384 A->getValue()[0] == '\0')
Daniel Dunbar20f0eac2009-09-17 06:53:36 +00002385 CmdArgs.push_back("-O2");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002386 else
Daniel Dunbar5697aa02009-03-18 23:39:35 +00002387 A->render(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002388 }
2389
Chad Rosierb2c08872012-12-12 20:06:31 +00002390 // Don't warn about unused -flto. This can happen when we're preprocessing or
2391 // precompiling.
2392 Args.ClaimAllArgs(options::OPT_flto);
2393
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002394 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002395 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2396 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002397 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002398 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002399
2400 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2401 // (-ansi is equivalent to -std=c89).
2402 //
2403 // If a std is supplied, only add -trigraphs if it follows the
2404 // option.
2405 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2406 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002407 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002408 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002409 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002410 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002411 else
2412 Std->render(Args, CmdArgs);
2413
Daniel Dunbar0e100312010-06-14 21:23:08 +00002414 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2415 options::OPT_trigraphs))
2416 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002417 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002418 } else {
2419 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002420 //
2421 // FIXME: Clang doesn't correctly handle -std= when the input language
2422 // doesn't match. For the time being just ignore this for C++ inputs;
2423 // eventually we want to do all the standard defaulting here instead of
2424 // splitting it between the driver and clang -cc1.
2425 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002426 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2427 "-std=", /*Joined=*/true);
2428 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2429 CmdArgs.push_back("-std=c++11");
2430
Daniel Dunbard573d262009-04-07 22:13:21 +00002431 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002432 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002433
Chandler Carruth50465d12011-04-23 06:30:43 +00002434 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2435 // '-fconst-strings'; this better indicates its actual behavior.
2436 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2437 false)) {
2438 // For perfect compatibility with GCC, we do this even in the presence of
2439 // '-w'. This flag names something other than a warning for GCC.
2440 CmdArgs.push_back("-fconst-strings");
2441 }
2442
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002443 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002444 // during C++ compilation, which it is by default. GCC keeps this define even
2445 // in the presence of '-w', match this behavior bug-for-bug.
2446 if (types::isCXX(InputType) &&
2447 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2448 true)) {
2449 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002450 }
2451
Chandler Carruthc304ba32010-05-22 02:21:53 +00002452 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2453 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2454 if (Asm->getOption().matches(options::OPT_fasm))
2455 CmdArgs.push_back("-fgnu-keywords");
2456 else
2457 CmdArgs.push_back("-fno-gnu-keywords");
2458 }
2459
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002460 if (ShouldDisableCFI(Args, getToolChain()))
2461 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002462
Nick Lewyckyea523d72011-10-17 23:05:52 +00002463 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2464 CmdArgs.push_back("-fno-dwarf-directory-asm");
2465
Chandler Carruthd566df62012-12-17 21:40:04 +00002466 // Add in -fdebug-compilation-dir if necessary.
2467 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002468
Richard Smithc18c4232011-11-21 19:36:32 +00002469 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2470 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002471 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002472 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002473 }
2474
Richard Smithc18c4232011-11-21 19:36:32 +00002475 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2476 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002477 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002478 }
2479
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002480 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2481 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002482 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002483 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002484 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2485 } else
2486 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002487 }
2488
Nuno Lopesb3198a82012-05-08 22:10:46 +00002489
Michael J. Spencerc6357102012-10-22 22:13:48 +00002490 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002491 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002492
Daniel Dunbar294691e2009-11-04 06:24:38 +00002493 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2494 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002495 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002496 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002497
Chris Lattner124fca52010-01-09 21:54:33 +00002498 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2499 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002500 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002501 }
2502
Chris Lattner0f0c9632010-04-07 20:49:23 +00002503 CmdArgs.push_back("-ferror-limit");
2504 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002505 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002506 else
2507 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002508
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002509 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2510 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002511 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002512 }
2513
2514 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2515 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002516 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002517 }
2518
Richard Smith08d6e032011-12-16 19:06:07 +00002519 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2520 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002521 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002522 }
2523
Daniel Dunbar55efe142009-11-04 06:24:47 +00002524 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002525 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002526 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002527 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002528 } else {
2529 // If -fmessage-length=N was not specified, determine whether this is a
2530 // terminal and, if so, implicitly define -fmessage-length appropriately.
2531 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002532 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002533 }
2534
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002535 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2536 CmdArgs.push_back("-fvisibility");
Richard Smith1d489cf2012-11-01 04:30:05 +00002537 CmdArgs.push_back(A->getValue());
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002538 }
2539
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002540 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002541
Hans Wennborgde981f32012-06-28 08:01:44 +00002542 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2543
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002544 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002545 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2546 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002547 CmdArgs.push_back("-ffreestanding");
2548
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002549 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002550 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002551 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002552 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002553 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002554 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev17ba2672011-12-23 20:23:19 +00002555 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002556 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2557 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002558
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00002559 SanitizerArgs Sanitize(D, Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00002560 Sanitize.addArgs(Args, CmdArgs);
2561
Will Dietz2d382d12012-12-30 20:53:28 +00002562 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2563 options::OPT_fno_sanitize_recover,
2564 true))
2565 CmdArgs.push_back("-fno-sanitize-recover");
2566
Chad Rosier78d85b12013-01-29 23:31:22 +00002567 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2568 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2569 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2570 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2571
Chad Rosier4574c3d2012-03-13 23:45:51 +00002572 // Report and error for -faltivec on anything other then PowerPC.
2573 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2574 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2575 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2576 D.Diag(diag::err_drv_argument_only_allowed_with)
2577 << A->getAsString(Args) << "ppc/ppc64";
2578
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002579 if (getToolChain().SupportsProfiling())
2580 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002581
2582 // -flax-vector-conversions is default.
2583 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2584 options::OPT_fno_lax_vector_conversions))
2585 CmdArgs.push_back("-fno-lax-vector-conversions");
2586
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002587 if (Args.getLastArg(options::OPT_fapple_kext))
2588 CmdArgs.push_back("-fapple-kext");
2589
David Blaikie940152f2012-06-14 18:55:27 +00002590 if (Args.hasFlag(options::OPT_frewrite_includes,
2591 options::OPT_fno_rewrite_includes, false))
2592 CmdArgs.push_back("-frewrite-includes");
2593
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002594 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002595 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002596 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002597 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2598 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002599
2600 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2601 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002602 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002603 }
2604
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002605 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002606
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002607 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2608 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2609 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2610 options::OPT_fno_wrapv)) {
2611 if (A->getOption().matches(options::OPT_fwrapv))
2612 CmdArgs.push_back("-fwrapv");
2613 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2614 options::OPT_fno_strict_overflow)) {
2615 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2616 CmdArgs.push_back("-fwrapv");
2617 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002618 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf84d4092010-08-07 23:08:14 +00002619 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002620
Daniel Dunbar5345c392009-09-03 04:54:28 +00002621 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2622
Mahesha Sf3b52312012-10-27 07:47:56 +00002623
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002624 // -stack-protector=0 is default.
2625 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002626 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2627 options::OPT_fstack_protector_all,
2628 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002629 if (A->getOption().matches(options::OPT_fstack_protector))
2630 StackProtectorLevel = 1;
2631 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2632 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002633 } else {
2634 StackProtectorLevel =
2635 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2636 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002637 if (StackProtectorLevel) {
2638 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002639 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002640 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002641
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002642 // --param ssp-buffer-size=
2643 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2644 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002645 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002646 if (Str.startswith("ssp-buffer-size=")) {
2647 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002648 CmdArgs.push_back("-stack-protector-buffer-size");
2649 // FIXME: Verify the argument is a valid integer.
2650 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00002651 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002652 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00002653 }
Bill Wendling45483f72009-06-28 07:36:13 +00002654 }
2655
Nick Lewycky4e785c92011-12-06 03:33:03 +00002656 // Translate -mstackrealign
2657 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2658 false)) {
2659 CmdArgs.push_back("-backend-option");
2660 CmdArgs.push_back("-force-align-stack");
2661 }
2662 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2663 false)) {
2664 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2665 }
2666
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00002667 if (Args.hasArg(options::OPT_mstack_alignment)) {
2668 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2669 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00002670 }
Chad Rosier586a0612012-11-29 00:42:06 +00002671 // -mkernel implies -mstrict-align; don't add the redundant option.
2672 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosier485577d2012-11-09 18:27:01 +00002673 CmdArgs.push_back("-backend-option");
2674 CmdArgs.push_back("-arm-strict-align");
Chad Rosier7e293272012-11-09 17:29:19 +00002675 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002676
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002677 // Forward -f options with positive and negative forms; we translate
2678 // these by hand.
2679
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002680 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00002681 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002682 CmdArgs.push_back("-fapple-kext");
2683 if (!Args.hasArg(options::OPT_fbuiltin))
2684 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00002685 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002686 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002687 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002688 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00002689 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002690
Nuno Lopesfc284482009-12-16 16:59:22 +00002691 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2692 options::OPT_fno_assume_sane_operator_new))
2693 CmdArgs.push_back("-fno-assume-sane-operator-new");
2694
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002695 // -fblocks=0 is default.
2696 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00002697 getToolChain().IsBlocksDefault()) ||
2698 (Args.hasArg(options::OPT_fgnu_runtime) &&
2699 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2700 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002701 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00002702
2703 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2704 !getToolChain().hasBlocksRuntime())
2705 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00002706 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002707
Douglas Gregor64554ba2012-01-18 15:19:58 +00002708 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2709 // users must also pass -fcxx-modules. The latter flag will disappear once the
2710 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00002711 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00002712 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2713 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2714 options::OPT_fno_cxx_modules,
2715 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00002716 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00002717 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00002718 HaveModules = true;
2719 }
2720 }
2721
2722 // -fmodules-autolink (on by default when modules is enabled) automatically
2723 // links against libraries for imported modules.
2724 if (HaveModules &&
2725 Args.hasFlag(options::OPT_fmodules_autolink,
2726 options::OPT_fno_modules_autolink,
2727 true)) {
2728 CmdArgs.push_back("-fmodules-autolink");
Douglas Gregor64554ba2012-01-18 15:19:58 +00002729 }
Douglas Gregor7025d2c2012-01-03 17:13:05 +00002730
John McCall32579cf2010-04-09 19:12:06 +00002731 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00002732 if (Args.hasFlag(options::OPT_fno_access_control,
2733 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00002734 false))
John McCall7002f4c2010-04-09 19:03:51 +00002735 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00002736
Anders Carlssona4c24752010-11-21 00:09:52 +00002737 // -felide-constructors is the default.
2738 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2739 options::OPT_felide_constructors,
2740 false))
2741 CmdArgs.push_back("-fno-elide-constructors");
2742
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002743 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002744 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00002745 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00002746 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00002747
Richard Smithc4dabad2012-11-05 22:04:41 +00002748 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00002749 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00002750 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00002751 Args.getLastArg(options::OPT_mkernel,
2752 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00002753 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00002754 D.Diag(diag::err_drv_argument_not_allowed_with)
2755 << "-fsanitize=vptr" << NoRttiArg;
2756 }
2757 }
2758
Tony Linthicum96319392011-12-12 21:14:55 +00002759 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002760 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00002761 options::OPT_fno_short_enums,
2762 getToolChain().getTriple().getArch() ==
2763 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00002764 CmdArgs.push_back("-fshort-enums");
2765
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002766 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002767 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00002768 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00002769 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00002770
Anders Carlssona508b7d2010-02-06 23:23:06 +00002771 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00002772 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00002773 options::OPT_fno_threadsafe_statics))
2774 CmdArgs.push_back("-fno-threadsafe-statics");
2775
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002776 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002777 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2778 options::OPT_fno_use_cxa_atexit,
2779 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00002780 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosierafc4baa2012-03-26 22:04:46 +00002781 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2782 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00002783 CmdArgs.push_back("-fno-use-cxa-atexit");
2784
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002785 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00002786 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00002787 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2788 CmdArgs.push_back("-fms-extensions");
2789
Francois Pichetae556082011-09-17 04:32:15 +00002790 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00002791 if (Args.hasFlag(options::OPT_fms_compatibility,
2792 options::OPT_fno_ms_compatibility,
2793 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2794 Args.hasFlag(options::OPT_fms_extensions,
2795 options::OPT_fno_ms_extensions,
2796 true))))
Francois Pichetae556082011-09-17 04:32:15 +00002797 CmdArgs.push_back("-fms-compatibility");
2798
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002799 // -fmsc-version=1300 is default.
2800 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2801 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2802 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002803 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002804 if (msc_ver.empty())
2805 CmdArgs.push_back("-fmsc-version=1300");
2806 else
2807 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2808 }
2809
2810
Dawn Perchik400b6072010-09-02 23:59:25 +00002811 // -fborland-extensions=0 is default.
2812 if (Args.hasFlag(options::OPT_fborland_extensions,
2813 options::OPT_fno_borland_extensions, false))
2814 CmdArgs.push_back("-fborland-extensions");
2815
Francois Pichet8efcc012011-09-01 16:38:08 +00002816 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2817 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00002818 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2819 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00002820 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00002821 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00002822
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002823 // -fgnu-keywords default varies depending on language; only pass if
2824 // specified.
2825 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00002826 options::OPT_fno_gnu_keywords))
2827 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00002828
Rafael Espindola01ba8542011-06-02 17:30:53 +00002829 if (Args.hasFlag(options::OPT_fgnu89_inline,
2830 options::OPT_fno_gnu89_inline,
2831 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00002832 CmdArgs.push_back("-fgnu89-inline");
2833
Chad Rosierfc055f92012-03-15 22:31:42 +00002834 if (Args.hasArg(options::OPT_fno_inline))
2835 CmdArgs.push_back("-fno-inline");
2836
Chad Rosier634a4b12012-03-06 21:17:19 +00002837 if (Args.hasArg(options::OPT_fno_inline_functions))
2838 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00002839
John McCall260611a2012-06-20 06:18:46 +00002840 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00002841
John McCall260611a2012-06-20 06:18:46 +00002842 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2843 // legacy is the default.
2844 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002845 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2846 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00002847 objcRuntime.isLegacyDispatchDefaultForArch(
2848 getToolChain().getTriple().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002849 if (getToolChain().UseObjCMixedDispatch())
2850 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2851 else
2852 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2853 }
2854 }
2855
Nico Weberdf423542012-03-09 21:19:44 +00002856 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2857 // if the nonfragile objc abi is used.
Fariborz Jahaniane51fe092012-04-09 18:58:55 +00002858 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00002859 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2860 }
2861
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00002862 // -fencode-extended-block-signature=1 is default.
2863 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2864 CmdArgs.push_back("-fencode-extended-block-signature");
2865 }
2866
John McCall9f084a32011-07-06 00:26:06 +00002867 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2868 // NOTE: This logic is duplicated in ToolChains.cpp.
2869 bool ARC = isObjCAutoRefCount(Args);
2870 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00002871 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00002872
John McCall9f084a32011-07-06 00:26:06 +00002873 CmdArgs.push_back("-fobjc-arc");
2874
Chandler Carruth7ffa0322011-11-04 07:34:47 +00002875 // FIXME: It seems like this entire block, and several around it should be
2876 // wrapped in isObjC, but for now we just use it here as this is where it
2877 // was being used previously.
2878 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2879 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2880 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2881 else
2882 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2883 }
2884
John McCall9f084a32011-07-06 00:26:06 +00002885 // Allow the user to enable full exceptions code emission.
2886 // We define off for Objective-CC, on for Objective-C++.
2887 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2888 options::OPT_fno_objc_arc_exceptions,
2889 /*default*/ types::isCXX(InputType)))
2890 CmdArgs.push_back("-fobjc-arc-exceptions");
2891 }
2892
2893 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2894 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00002895 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00002896 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002897
John McCall9f084a32011-07-06 00:26:06 +00002898 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2899 // takes precedence.
2900 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2901 if (!GCArg)
2902 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2903 if (GCArg) {
2904 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002905 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00002906 << GCArg->getAsString(Args);
2907 } else if (getToolChain().SupportsObjCGC()) {
2908 GCArg->render(Args, CmdArgs);
2909 } else {
2910 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002911 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00002912 << GCArg->getAsString(Args);
2913 }
2914 }
2915
John McCalld71315c2011-06-22 00:53:57 +00002916 // Add exception args.
2917 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00002918 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00002919
2920 if (getToolChain().UseSjLjExceptions())
2921 CmdArgs.push_back("-fsjlj-exceptions");
2922
2923 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00002924 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2925 options::OPT_fno_assume_sane_operator_new))
2926 CmdArgs.push_back("-fno-assume-sane-operator-new");
2927
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00002928 // -fconstant-cfstrings is default, and may be subject to argument translation
2929 // on Darwin.
2930 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2931 options::OPT_fno_constant_cfstrings) ||
2932 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2933 options::OPT_mno_constant_cfstrings))
2934 CmdArgs.push_back("-fno-constant-cfstrings");
2935
John Thompsona6fda122009-11-05 20:14:16 +00002936 // -fshort-wchar default varies depending on platform; only
2937 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00002938 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2939 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00002940
Daniel Dunbaree848a72009-10-29 02:39:57 +00002941 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2942 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbar82d00682009-04-07 23:51:44 +00002943 //
2944 // FIXME: This is gross; that translation should be pulled from the
2945 // tool chain.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002946 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00002947 options::OPT_fno_pascal_strings,
2948 false) ||
2949 Args.hasFlag(options::OPT_mpascal_strings,
2950 options::OPT_mno_pascal_strings,
2951 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002952 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002953
Daniel Dunbar88934e82011-10-05 21:04:55 +00002954 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2955 // -fno-pack-struct doesn't apply to -fpack-struct=.
2956 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00002957 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00002958 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00002959 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00002960 } else if (Args.hasFlag(options::OPT_fpack_struct,
2961 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00002962 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00002963 }
2964
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002965 if (Args.hasArg(options::OPT_mkernel) ||
2966 Args.hasArg(options::OPT_fapple_kext)) {
2967 if (!Args.hasArg(options::OPT_fcommon))
2968 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00002969 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002970 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00002971
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002972 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002973 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00002974 CmdArgs.push_back("-fno-common");
2975
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002976 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002977 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00002978 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002979 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002980 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00002981 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2982
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002983 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2984 if (!Args.hasFlag(options::OPT_ffor_scope,
2985 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002986 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00002987 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2988
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00002989 // -fcaret-diagnostics is default.
2990 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2991 options::OPT_fno_caret_diagnostics, true))
2992 CmdArgs.push_back("-fno-caret-diagnostics");
2993
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002994 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00002995 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00002996 options::OPT_fno_diagnostics_fixit_info))
2997 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00002998
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00002999 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003000 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003001 options::OPT_fno_diagnostics_show_option))
3002 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003003
Chris Lattner6fbe8392010-05-04 21:55:25 +00003004 if (const Arg *A =
3005 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3006 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003007 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003008 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003009
Douglas Gregorc9471b02011-05-21 17:07:29 +00003010 if (const Arg *A =
3011 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3012 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003013 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003014 }
3015
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003016 if (Arg *A = Args.getLastArg(
3017 options::OPT_fdiagnostics_show_note_include_stack,
3018 options::OPT_fno_diagnostics_show_note_include_stack)) {
3019 if (A->getOption().matches(
3020 options::OPT_fdiagnostics_show_note_include_stack))
3021 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3022 else
3023 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3024 }
3025
Daniel Dunbar838be482009-11-04 06:24:57 +00003026 // Color diagnostics are the default, unless the terminal doesn't support
3027 // them.
3028 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidisf765d762010-09-23 12:56:06 +00003029 options::OPT_fno_color_diagnostics,
3030 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003031 CmdArgs.push_back("-fcolor-diagnostics");
3032
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003033 if (!Args.hasFlag(options::OPT_fshow_source_location,
3034 options::OPT_fno_show_source_location))
3035 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003036
Douglas Gregorc9471b02011-05-21 17:07:29 +00003037 if (!Args.hasFlag(options::OPT_fshow_column,
3038 options::OPT_fno_show_column,
3039 true))
3040 CmdArgs.push_back("-fno-show-column");
3041
Douglas Gregora0068fc2010-07-09 17:35:33 +00003042 if (!Args.hasFlag(options::OPT_fspell_checking,
3043 options::OPT_fno_spell_checking))
3044 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003045
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003046
Chad Rosier15490fd2012-12-05 21:08:21 +00003047 // -fno-asm-blocks is default.
3048 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3049 false))
3050 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003051
Nadav Rotem0f6ef282012-12-18 23:10:16 +00003052 // -fvectorize is default.
Chad Rosierc04d0932012-12-11 17:12:28 +00003053 if (Args.hasFlag(options::OPT_fvectorize,
Nadav Rotem0f6ef282012-12-18 23:10:16 +00003054 options::OPT_fno_vectorize, true)) {
Chad Rosierc04d0932012-12-11 17:12:28 +00003055 CmdArgs.push_back("-backend-option");
3056 CmdArgs.push_back("-vectorize-loops");
3057 }
3058
Hal Finkel443c9992012-12-11 19:59:32 +00003059 // -fno-slp-vectorize is default.
3060 if (Args.hasFlag(options::OPT_fslp_vectorize,
3061 options::OPT_fno_slp_vectorize, false)) {
3062 CmdArgs.push_back("-backend-option");
3063 CmdArgs.push_back("-vectorize");
3064 }
3065
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003066 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3067 A->render(Args, CmdArgs);
3068
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003069 // -fdollars-in-identifiers default varies depending on platform and
3070 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003071 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003072 options::OPT_fno_dollars_in_identifiers)) {
3073 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003074 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003075 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003076 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003077 }
3078
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003079 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3080 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003081 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003082 options::OPT_fno_unit_at_a_time)) {
3083 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003084 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003085 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003086
Eli Friedman19bda3a2011-11-02 01:53:16 +00003087 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3088 options::OPT_fno_apple_pragma_pack, false))
3089 CmdArgs.push_back("-fapple-pragma-pack");
3090
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003091 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003092 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003093 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003094#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003095 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003096 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3097 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3098 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3099 CmdArgs.push_back("-fno-builtin-strcat");
3100 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3101 CmdArgs.push_back("-fno-builtin-strcpy");
3102 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003103#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003104
Daniel Dunbard98750f2011-03-18 21:23:40 +00003105 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003106 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003107 options::OPT_traditional_cpp)) {
3108 if (isa<PreprocessJobAction>(JA))
3109 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003110 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003111 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003112 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003113
Daniel Dunbar1d460332009-03-18 10:01:51 +00003114 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003115 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003116
3117 // Handle serialized diagnostics.
3118 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3119 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003120 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003121 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003122
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003123 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3124 CmdArgs.push_back("-fretain-comments-from-system-headers");
3125
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003126 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3127 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003128 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003129 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3130 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003131 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003132
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003133 // We translate this by hand to the -cc1 argument, since nightly test uses
3134 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003135 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003136 CmdArgs.push_back("-disable-llvm-optzns");
3137 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003138 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003139 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003140
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003141 if (Output.getType() == types::TY_Dependencies) {
3142 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003143 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003144 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003145 CmdArgs.push_back(Output.getFilename());
3146 } else {
3147 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003148 }
3149
Daniel Dunbar1d460332009-03-18 10:01:51 +00003150 for (InputInfoList::const_iterator
3151 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3152 const InputInfo &II = *it;
3153 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003154 if (Args.hasArg(options::OPT_rewrite_objc))
3155 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3156 else
3157 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003158 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003159 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003160 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003161 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003162 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003163
Chris Lattnere6113de2009-11-03 19:50:27 +00003164 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3165
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003166 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003167
3168 // Optionally embed the -cc1 level arguments into the debug info, for build
3169 // analysis.
3170 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003171 ArgStringList OriginalArgs;
3172 for (ArgList::const_iterator it = Args.begin(),
3173 ie = Args.end(); it != ie; ++it)
3174 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003175
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003176 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003177 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003178 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003179 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003180 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003181 }
3182 CmdArgs.push_back("-dwarf-debug-flags");
3183 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3184 }
3185
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003186 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbara880db02009-03-23 19:03:36 +00003187
Roman Divackybe4c8702011-02-10 16:52:03 +00003188 if (Arg *A = Args.getLastArg(options::OPT_pg))
3189 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003190 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003191 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003192
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003193 // Claim some arguments which clang supports automatically.
3194
Daniel Dunbarf4046862010-04-15 06:18:42 +00003195 // -fpch-preprocess is used with gcc to add a special marker in the output to
3196 // include the PCH file. Clang's PTH solution is completely transparent, so we
3197 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003198 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003199
Daniel Dunbara880db02009-03-23 19:03:36 +00003200 // Claim some arguments which clang doesn't support, but we don't
3201 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003202 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3203 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003204
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003205 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003206 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003207 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003208}
3209
Jim Grosbachfc308292012-02-10 20:37:10 +00003210void ClangAs::AddARMTargetArgs(const ArgList &Args,
3211 ArgStringList &CmdArgs) const {
3212 const Driver &D = getToolChain().getDriver();
3213 llvm::Triple Triple = getToolChain().getTriple();
3214
3215 // Set the CPU based on -march= and -mcpu=.
3216 CmdArgs.push_back("-target-cpu");
Benjamin Kramer92c4fd52012-06-26 22:20:06 +00003217 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbachfc308292012-02-10 20:37:10 +00003218
3219 // Honor -mfpu=.
Chad Rosier99317272012-04-04 20:51:35 +00003220 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierf80f2a52012-04-04 20:56:36 +00003221 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier7a938fa2012-04-04 20:39:32 +00003222
3223 // Honor -mfpmath=.
3224 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier30fe6ba2012-04-04 22:13:40 +00003225 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbachfc308292012-02-10 20:37:10 +00003226}
3227
John McCall260611a2012-06-20 06:18:46 +00003228/// Add options related to the Objective-C runtime/ABI.
3229///
3230/// Returns true if the runtime is non-fragile.
3231ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3232 ArgStringList &cmdArgs,
3233 RewriteKind rewriteKind) const {
3234 // Look for the controlling runtime option.
3235 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3236 options::OPT_fgnu_runtime,
3237 options::OPT_fobjc_runtime_EQ);
3238
3239 // Just forward -fobjc-runtime= to the frontend. This supercedes
3240 // options about fragility.
3241 if (runtimeArg &&
3242 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3243 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003244 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003245 if (runtime.tryParse(value)) {
3246 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3247 << value;
3248 }
3249
3250 runtimeArg->render(args, cmdArgs);
3251 return runtime;
3252 }
3253
3254 // Otherwise, we'll need the ABI "version". Version numbers are
3255 // slightly confusing for historical reasons:
3256 // 1 - Traditional "fragile" ABI
3257 // 2 - Non-fragile ABI, version 1
3258 // 3 - Non-fragile ABI, version 2
3259 unsigned objcABIVersion = 1;
3260 // If -fobjc-abi-version= is present, use that to set the version.
3261 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003262 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003263 if (value == "1")
3264 objcABIVersion = 1;
3265 else if (value == "2")
3266 objcABIVersion = 2;
3267 else if (value == "3")
3268 objcABIVersion = 3;
3269 else
3270 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3271 << value;
3272 } else {
3273 // Otherwise, determine if we are using the non-fragile ABI.
3274 bool nonFragileABIIsDefault =
3275 (rewriteKind == RK_NonFragile ||
3276 (rewriteKind == RK_None &&
3277 getToolChain().IsObjCNonFragileABIDefault()));
3278 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3279 options::OPT_fno_objc_nonfragile_abi,
3280 nonFragileABIIsDefault)) {
3281 // Determine the non-fragile ABI version to use.
3282#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3283 unsigned nonFragileABIVersion = 1;
3284#else
3285 unsigned nonFragileABIVersion = 2;
3286#endif
3287
3288 if (Arg *abiArg = args.getLastArg(
3289 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003290 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003291 if (value == "1")
3292 nonFragileABIVersion = 1;
3293 else if (value == "2")
3294 nonFragileABIVersion = 2;
3295 else
3296 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3297 << value;
3298 }
3299
3300 objcABIVersion = 1 + nonFragileABIVersion;
3301 } else {
3302 objcABIVersion = 1;
3303 }
3304 }
3305
3306 // We don't actually care about the ABI version other than whether
3307 // it's non-fragile.
3308 bool isNonFragile = objcABIVersion != 1;
3309
3310 // If we have no runtime argument, ask the toolchain for its default runtime.
3311 // However, the rewriter only really supports the Mac runtime, so assume that.
3312 ObjCRuntime runtime;
3313 if (!runtimeArg) {
3314 switch (rewriteKind) {
3315 case RK_None:
3316 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3317 break;
3318 case RK_Fragile:
3319 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3320 break;
3321 case RK_NonFragile:
3322 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3323 break;
3324 }
3325
3326 // -fnext-runtime
3327 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3328 // On Darwin, make this use the default behavior for the toolchain.
3329 if (getToolChain().getTriple().isOSDarwin()) {
3330 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3331
3332 // Otherwise, build for a generic macosx port.
3333 } else {
3334 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3335 }
3336
3337 // -fgnu-runtime
3338 } else {
3339 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003340 // Legacy behaviour is to target the gnustep runtime if we are i
3341 // non-fragile mode or the GCC runtime in fragile mode.
3342 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003343 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003344 else
3345 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003346 }
3347
3348 cmdArgs.push_back(args.MakeArgString(
3349 "-fobjc-runtime=" + runtime.getAsString()));
3350 return runtime;
3351}
3352
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003353void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003354 const InputInfo &Output,
3355 const InputInfoList &Inputs,
3356 const ArgList &Args,
3357 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003358 ArgStringList CmdArgs;
3359
3360 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3361 const InputInfo &Input = Inputs[0];
3362
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003363 // Don't warn about "clang -w -c foo.s"
3364 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003365 // and "clang -emit-llvm -c foo.s"
3366 Args.ClaimAllArgs(options::OPT_emit_llvm);
3367 // and "clang -use-gold-plugin -c foo.s"
3368 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003369
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003370 // Invoke ourselves in -cc1as mode.
3371 //
3372 // FIXME: Implement custom jobs for internal actions.
3373 CmdArgs.push_back("-cc1as");
3374
3375 // Add the "effective" target triple.
3376 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003377 std::string TripleStr =
3378 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003379 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3380
3381 // Set the output mode, we currently only expect to be used as a real
3382 // assembler.
3383 CmdArgs.push_back("-filetype");
3384 CmdArgs.push_back("obj");
3385
Eric Christopher27e2b982012-12-18 00:31:10 +00003386 // Set the main file name, so that debug info works even with
3387 // -save-temps or preprocessed assembly.
3388 CmdArgs.push_back("-main-file-name");
3389 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3390
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00003391 if (UseRelaxAll(C, Args))
Daniel Dunbar469d40e2010-05-28 16:43:21 +00003392 CmdArgs.push_back("-relax-all");
Daniel Dunbar99298002010-05-27 06:18:05 +00003393
Jim Grosbachfc308292012-02-10 20:37:10 +00003394 // Add target specific cpu and features flags.
3395 switch(getToolChain().getTriple().getArch()) {
3396 default:
3397 break;
3398
3399 case llvm::Triple::arm:
3400 case llvm::Triple::thumb:
3401 AddARMTargetArgs(Args, CmdArgs);
3402 break;
3403 }
3404
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003405 // Ignore explicit -force_cpusubtype_ALL option.
3406 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003407
Eric Christopher8f0a4032012-01-10 00:38:01 +00003408 // Determine the original source input.
3409 const Action *SourceAction = &JA;
3410 while (SourceAction->getKind() != Action::InputClass) {
3411 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3412 SourceAction = SourceAction->getInputs()[0];
3413 }
3414
Chandler Carruthd566df62012-12-17 21:40:04 +00003415 // Forward -g and handle debug info related flags, assuming we are dealing
3416 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003417 if (SourceAction->getType() == types::TY_Asm ||
3418 SourceAction->getType() == types::TY_PP_Asm) {
3419 Args.ClaimAllArgs(options::OPT_g_Group);
3420 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3421 if (!A->getOption().matches(options::OPT_g0))
3422 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003423
3424 // Add the -fdebug-compilation-dir flag if needed.
3425 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003426
3427 // Set the AT_producer to the clang version when using the integrated
3428 // assembler on assembly source files.
3429 CmdArgs.push_back("-dwarf-debug-producer");
3430 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003431 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003432
3433 // Optionally embed the -cc1as level arguments into the debug info, for build
3434 // analysis.
3435 if (getToolChain().UseDwarfDebugFlags()) {
3436 ArgStringList OriginalArgs;
3437 for (ArgList::const_iterator it = Args.begin(),
3438 ie = Args.end(); it != ie; ++it)
3439 (*it)->render(Args, OriginalArgs);
3440
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003441 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003442 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3443 Flags += Exec;
3444 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3445 Flags += " ";
3446 Flags += OriginalArgs[i];
3447 }
3448 CmdArgs.push_back("-dwarf-debug-flags");
3449 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3450 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003451
3452 // FIXME: Add -static support, once we have it.
3453
3454 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3455 options::OPT_Xassembler);
Daniel Dunbar3df23252011-04-29 17:53:18 +00003456 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003457
3458 assert(Output.isFilename() && "Unexpected lipo output.");
3459 CmdArgs.push_back("-o");
3460 CmdArgs.push_back(Output.getFilename());
3461
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003462 assert(Input.isFilename() && "Invalid input.");
3463 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003464
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003465 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003466 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003467}
3468
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003469void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003470 const InputInfo &Output,
3471 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003472 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003473 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003474 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003475 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003476
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003477 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003478 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003479 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00003480 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003481 // Don't forward any -g arguments to assembly steps.
3482 if (isa<AssembleJobAction>(JA) &&
3483 A->getOption().matches(options::OPT_g_Group))
3484 continue;
3485
Daniel Dunbar75877192009-03-19 07:55:12 +00003486 // It is unfortunate that we have to claim here, as this means
3487 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003488 // platforms using a generic gcc, even if we are just using gcc
3489 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00003490 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00003491 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00003492 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003493 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003494
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003495 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003496
3497 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003498 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00003499 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003500 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00003501
3502 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003503 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003504 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003505 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003506 CmdArgs.push_back("ppc64");
3507 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003508 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003509 }
3510
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003511 // Try to force gcc to match the tool chain we want, if we recognize
3512 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00003513 //
3514 // FIXME: The triple class should directly provide the information we want
3515 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003516 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003517 CmdArgs.push_back("-m32");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00003518 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00003519 CmdArgs.push_back("-m64");
3520
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003521 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003522 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003523 CmdArgs.push_back(Output.getFilename());
3524 } else {
3525 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003526 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003527 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003528
Tony Linthicum96319392011-12-12 21:14:55 +00003529 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3530 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003531
3532 // Only pass -x if gcc will understand it; otherwise hope gcc
3533 // understands the suffix correctly. The main use case this would go
3534 // wrong in is for linker inputs if they happened to have an odd
3535 // suffix; really the only way to get this to happen is a command
3536 // like '-x foobar a.c' which will treat a.c like a linker input.
3537 //
3538 // FIXME: For the linker case specifically, can we safely convert
3539 // inputs into '-Wl,' options?
3540 for (InputInfoList::const_iterator
3541 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3542 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00003543
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003544 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003545 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3546 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003547 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003548 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003549 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003550 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00003551 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00003552
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003553 if (types::canTypeBeUserSpecified(II.getType())) {
3554 CmdArgs.push_back("-x");
3555 CmdArgs.push_back(types::getTypeName(II.getType()));
3556 }
3557
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003558 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003559 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00003560 else {
3561 const Arg &A = II.getInputArg();
3562
3563 // Reverse translate some rewritten options.
3564 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3565 CmdArgs.push_back("-lstdc++");
3566 continue;
3567 }
3568
Daniel Dunbar115a7922009-03-19 07:29:38 +00003569 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00003570 A.render(Args, CmdArgs);
3571 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003572 }
3573
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003574 const std::string customGCCName = D.getCCCGenericGCCName();
3575 const char *GCCName;
3576 if (!customGCCName.empty())
3577 GCCName = customGCCName.c_str();
3578 else if (D.CCCIsCXX) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003579 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00003580 } else
3581 GCCName = "gcc";
3582
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003583 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003584 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003585 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003586}
3587
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003588void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3589 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003590 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003591}
3592
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003593void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3594 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003595 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003596}
3597
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003598void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3599 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00003600 const Driver &D = getToolChain().getDriver();
3601
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003602 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003603 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3604 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003605 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00003606 else {
3607 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00003608 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00003609 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00003610
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003611 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00003612 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003613}
3614
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003615void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3616 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003617 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003618}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003619
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00003620void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3621 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003622 // The types are (hopefully) good enough.
3623}
3624
Tony Linthicum96319392011-12-12 21:14:55 +00003625// Hexagon tools start.
3626void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3627 ArgStringList &CmdArgs) const {
3628
3629}
3630void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3631 const InputInfo &Output,
3632 const InputInfoList &Inputs,
3633 const ArgList &Args,
3634 const char *LinkingOutput) const {
3635
3636 const Driver &D = getToolChain().getDriver();
3637 ArgStringList CmdArgs;
3638
3639 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00003640 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00003641 CmdArgs.push_back(Args.MakeArgString(MarchString));
3642
3643 RenderExtraToolArgs(JA, CmdArgs);
3644
3645 if (Output.isFilename()) {
3646 CmdArgs.push_back("-o");
3647 CmdArgs.push_back(Output.getFilename());
3648 } else {
3649 assert(Output.isNothing() && "Unexpected output");
3650 CmdArgs.push_back("-fsyntax-only");
3651 }
3652
Matthew Curtis33c95f12012-12-06 17:49:03 +00003653 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3654 if (!SmallDataThreshold.empty())
3655 CmdArgs.push_back(
3656 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00003657
Matthew Curtis3d8d4222012-12-07 17:23:04 +00003658 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3659 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3660 options::OPT_Xassembler);
3661
Tony Linthicum96319392011-12-12 21:14:55 +00003662 // Only pass -x if gcc will understand it; otherwise hope gcc
3663 // understands the suffix correctly. The main use case this would go
3664 // wrong in is for linker inputs if they happened to have an odd
3665 // suffix; really the only way to get this to happen is a command
3666 // like '-x foobar a.c' which will treat a.c like a linker input.
3667 //
3668 // FIXME: For the linker case specifically, can we safely convert
3669 // inputs into '-Wl,' options?
3670 for (InputInfoList::const_iterator
3671 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3672 const InputInfo &II = *it;
3673
3674 // Don't try to pass LLVM or AST inputs to a generic gcc.
3675 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3676 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3677 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3678 << getToolChain().getTripleString();
3679 else if (II.getType() == types::TY_AST)
3680 D.Diag(clang::diag::err_drv_no_ast_support)
3681 << getToolChain().getTripleString();
3682
3683 if (II.isFilename())
3684 CmdArgs.push_back(II.getFilename());
3685 else
3686 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3687 II.getInputArg().render(Args, CmdArgs);
3688 }
3689
3690 const char *GCCName = "hexagon-as";
3691 const char *Exec =
3692 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3693 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3694
3695}
3696void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3697 ArgStringList &CmdArgs) const {
3698 // The types are (hopefully) good enough.
3699}
3700
3701void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3702 const InputInfo &Output,
3703 const InputInfoList &Inputs,
3704 const ArgList &Args,
3705 const char *LinkingOutput) const {
3706
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003707 const toolchains::Hexagon_TC& ToolChain =
3708 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
3709 const Driver &D = ToolChain.getDriver();
3710
Tony Linthicum96319392011-12-12 21:14:55 +00003711 ArgStringList CmdArgs;
3712
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003713 //----------------------------------------------------------------------------
3714 //
3715 //----------------------------------------------------------------------------
3716 bool hasStaticArg = Args.hasArg(options::OPT_static);
3717 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00003718 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003719 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
3720 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
3721 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
3722 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00003723
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003724 //----------------------------------------------------------------------------
3725 // Silence warnings for various options
3726 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00003727
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003728 Args.ClaimAllArgs(options::OPT_g_Group);
3729 Args.ClaimAllArgs(options::OPT_emit_llvm);
3730 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
3731 // handled somewhere else.
3732 Args.ClaimAllArgs(options::OPT_static_libgcc);
3733
3734 //----------------------------------------------------------------------------
3735 //
3736 //----------------------------------------------------------------------------
3737 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
3738 e = ToolChain.ExtraOpts.end();
3739 i != e; ++i)
3740 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00003741
Matthew Curtis67814152012-12-06 14:16:43 +00003742 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
3743 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00003744
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003745 if (buildingLib) {
3746 CmdArgs.push_back("-shared");
3747 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
3748 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00003749 }
3750
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003751 if (hasStaticArg)
3752 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00003753
Matthew Curtis33c95f12012-12-06 17:49:03 +00003754 if (buildPIE && !buildingLib)
3755 CmdArgs.push_back("-pie");
3756
3757 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3758 if (!SmallDataThreshold.empty()) {
3759 CmdArgs.push_back(
3760 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
3761 }
3762
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003763 //----------------------------------------------------------------------------
3764 //
3765 //----------------------------------------------------------------------------
3766 CmdArgs.push_back("-o");
3767 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00003768
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003769 const std::string MarchSuffix = "/" + MarchString;
3770 const std::string G0Suffix = "/G0";
3771 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
3772 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
3773 + "/";
3774 const std::string StartFilesDir = RootDir
3775 + "hexagon/lib"
3776 + (buildingLib
3777 ? MarchG0Suffix : MarchSuffix);
3778
3779 //----------------------------------------------------------------------------
3780 // moslib
3781 //----------------------------------------------------------------------------
3782 std::vector<std::string> oslibs;
3783 bool hasStandalone= false;
3784
3785 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
3786 ie = Args.filtered_end(); it != ie; ++it) {
3787 (*it)->claim();
3788 oslibs.push_back((*it)->getValue());
3789 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00003790 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003791 if (oslibs.empty()) {
3792 oslibs.push_back("standalone");
3793 hasStandalone = true;
3794 }
Tony Linthicum96319392011-12-12 21:14:55 +00003795
Matthew Curtis5fdf3502012-12-06 15:46:07 +00003796 //----------------------------------------------------------------------------
3797 // Start Files
3798 //----------------------------------------------------------------------------
3799 if (incStdLib && incStartFiles) {
3800
3801 if (!buildingLib) {
3802 if (hasStandalone) {
3803 CmdArgs.push_back(
3804 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
3805 }
3806 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
3807 }
3808 std::string initObj = useShared ? "/initS.o" : "/init.o";
3809 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
3810 }
3811
3812 //----------------------------------------------------------------------------
3813 // Library Search Paths
3814 //----------------------------------------------------------------------------
3815 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
3816 for (ToolChain::path_list::const_iterator
3817 i = LibPaths.begin(),
3818 e = LibPaths.end();
3819 i != e;
3820 ++i)
3821 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
3822
3823 //----------------------------------------------------------------------------
3824 //
3825 //----------------------------------------------------------------------------
3826 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3827 Args.AddAllArgs(CmdArgs, options::OPT_e);
3828 Args.AddAllArgs(CmdArgs, options::OPT_s);
3829 Args.AddAllArgs(CmdArgs, options::OPT_t);
3830 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
3831
3832 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
3833
3834 //----------------------------------------------------------------------------
3835 // Libraries
3836 //----------------------------------------------------------------------------
3837 if (incStdLib && incDefLibs) {
3838 if (D.CCCIsCXX) {
3839 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
3840 CmdArgs.push_back("-lm");
3841 }
3842
3843 CmdArgs.push_back("--start-group");
3844
3845 if (!buildingLib) {
3846 for(std::vector<std::string>::iterator i = oslibs.begin(),
3847 e = oslibs.end(); i != e; ++i)
3848 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
3849 CmdArgs.push_back("-lc");
3850 }
3851 CmdArgs.push_back("-lgcc");
3852
3853 CmdArgs.push_back("--end-group");
3854 }
3855
3856 //----------------------------------------------------------------------------
3857 // End files
3858 //----------------------------------------------------------------------------
3859 if (incStdLib && incStartFiles) {
3860 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
3861 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
3862 }
3863
3864 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
3865 C.addCommand(
3866 new Command(
3867 JA, *this,
3868 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00003869}
3870// Hexagon tools end.
3871
Rafael Espindolacfed8282012-10-31 18:51:07 +00003872llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3873 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3874 // archs which Darwin doesn't use.
3875
3876 // The matching this routine does is fairly pointless, since it is neither the
3877 // complete architecture list, nor a reasonable subset. The problem is that
3878 // historically the driver driver accepts this and also ties its -march=
3879 // handling to the architecture name, so we need to be careful before removing
3880 // support for it.
3881
3882 // This code must be kept in sync with Clang's Darwin specific argument
3883 // translation.
3884
3885 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3886 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3887 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3888 .Case("ppc64", llvm::Triple::ppc64)
3889 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3890 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3891 llvm::Triple::x86)
3892 .Case("x86_64", llvm::Triple::x86_64)
3893 // This is derived from the driver driver.
3894 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3895 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3896 .Case("r600", llvm::Triple::r600)
3897 .Case("nvptx", llvm::Triple::nvptx)
3898 .Case("nvptx64", llvm::Triple::nvptx64)
3899 .Case("amdil", llvm::Triple::amdil)
3900 .Case("spir", llvm::Triple::spir)
3901 .Default(llvm::Triple::UnknownArch);
3902}
Tony Linthicum96319392011-12-12 21:14:55 +00003903
Bob Wilson66b8a662012-11-23 06:14:39 +00003904const char *Clang::getBaseInputName(const ArgList &Args,
3905 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00003906 return Args.MakeArgString(
3907 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003908}
3909
Bob Wilson66b8a662012-11-23 06:14:39 +00003910const char *Clang::getBaseInputStem(const ArgList &Args,
3911 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003912 const char *Str = getBaseInputName(Args, Inputs);
3913
Chris Lattner657ca662011-01-16 08:14:11 +00003914 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00003915 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003916
3917 return Str;
3918}
3919
Bob Wilson66b8a662012-11-23 06:14:39 +00003920const char *Clang::getDependencyFileName(const ArgList &Args,
3921 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003922 // FIXME: Think about this more.
3923 std::string Res;
3924
3925 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003926 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003927 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00003928 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00003929 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00003930 }
Daniel Dunbar88137642009-09-09 22:32:48 +00003931 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00003932}
3933
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00003934void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003935 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003936 const InputInfoList &Inputs,
3937 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00003938 const char *LinkingOutput) const {
3939 ArgStringList CmdArgs;
3940
3941 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3942 const InputInfo &Input = Inputs[0];
3943
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00003944 // Determine the original source input.
3945 const Action *SourceAction = &JA;
3946 while (SourceAction->getKind() != Action::InputClass) {
3947 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3948 SourceAction = SourceAction->getInputs()[0];
3949 }
3950
3951 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00003952 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00003953 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00003954 if (Args.hasArg(options::OPT_gstabs))
3955 CmdArgs.push_back("--gstabs");
3956 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00003957 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00003958 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003959
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00003960 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00003961 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00003962
Daniel Dunbarf5438e32010-07-22 01:47:22 +00003963 // Use -force_cpusubtype_ALL on x86 by default.
3964 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
3965 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00003966 Args.hasArg(options::OPT_force__cpusubtype__ALL))
3967 CmdArgs.push_back("-force_cpusubtype_ALL");
3968
Daniel Dunbar0e2679d2009-08-24 22:26:16 +00003969 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00003970 (((Args.hasArg(options::OPT_mkernel) ||
3971 Args.hasArg(options::OPT_fapple_kext)) &&
3972 (!getDarwinToolChain().isTargetIPhoneOS() ||
3973 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
3974 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003975 CmdArgs.push_back("-static");
3976
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00003977 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3978 options::OPT_Xassembler);
3979
3980 assert(Output.isFilename() && "Unexpected lipo output.");
3981 CmdArgs.push_back("-o");
3982 CmdArgs.push_back(Output.getFilename());
3983
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003984 assert(Input.isFilename() && "Invalid input.");
3985 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00003986
3987 // asm_final spec is empty.
3988
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003989 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00003990 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003991 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00003992}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00003993
David Blaikie99ba9e32011-12-20 02:48:34 +00003994void darwin::DarwinTool::anchor() {}
3995
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00003996void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
3997 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003998 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00003999
Daniel Dunbar02633b52009-03-26 16:23:12 +00004000 // Derived from darwin_arch spec.
4001 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004002 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004003
Daniel Dunbareeff4062010-01-22 02:04:58 +00004004 // FIXME: Is this needed anymore?
4005 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004006 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004007}
4008
Bill Wendling6acf8b42012-10-02 18:02:50 +00004009bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4010 // We only need to generate a temp path for LTO if we aren't compiling object
4011 // files. When compiling source files, we run 'dsymutil' after linking. We
4012 // don't run 'dsymutil' when compiling object files.
4013 for (InputInfoList::const_iterator
4014 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4015 if (it->getType() != types::TY_Object)
4016 return true;
4017
4018 return false;
4019}
4020
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004021void darwin::Link::AddLinkArgs(Compilation &C,
4022 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004023 ArgStringList &CmdArgs,
4024 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004025 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004026 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004027
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004028 unsigned Version[3] = { 0, 0, 0 };
4029 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4030 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004031 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004032 Version[1], Version[2], HadExtra) ||
4033 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004034 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004035 << A->getAsString(Args);
4036 }
4037
4038 // Newer linkers support -demangle, pass it if supported and not disabled by
4039 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004040 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004041 // Don't pass -demangle to ld_classic.
4042 //
4043 // FIXME: This is a temporary workaround, ld should be handling this.
4044 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4045 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004046 if (getToolChain().getArch() == llvm::Triple::x86) {
4047 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4048 options::OPT_Wl_COMMA),
4049 ie = Args.filtered_end(); it != ie; ++it) {
4050 const Arg *A = *it;
4051 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004052 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004053 UsesLdClassic = true;
4054 }
4055 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004056 if (!UsesLdClassic)
4057 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004058 }
4059
Bill Wendlingc35f9082012-11-16 23:03:00 +00004060 // If we are using LTO, then automatically create a temporary file path for
4061 // the linker to use, so that it's lifetime will extend past a possible
4062 // dsymutil step.
4063 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4064 const char *TmpPath = C.getArgs().MakeArgString(
4065 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4066 C.addTempFile(TmpPath);
4067 CmdArgs.push_back("-object_path_lto");
4068 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004069 }
4070
Daniel Dunbar02633b52009-03-26 16:23:12 +00004071 // Derived from the "link" spec.
4072 Args.AddAllArgs(CmdArgs, options::OPT_static);
4073 if (!Args.hasArg(options::OPT_static))
4074 CmdArgs.push_back("-dynamic");
4075 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4076 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4077 // here. How do we wish to handle such things?
4078 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004079
Daniel Dunbar02633b52009-03-26 16:23:12 +00004080 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004081 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004082 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004083 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004084
4085 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4086 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4087 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4088
4089 Arg *A;
4090 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4091 (A = Args.getLastArg(options::OPT_current__version)) ||
4092 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004093 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004094 << A->getAsString(Args) << "-dynamiclib";
4095
4096 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4097 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4098 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4099 } else {
4100 CmdArgs.push_back("-dylib");
4101
4102 Arg *A;
4103 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4104 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4105 (A = Args.getLastArg(options::OPT_client__name)) ||
4106 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4107 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4108 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004109 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004110 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004111
Daniel Dunbar02633b52009-03-26 16:23:12 +00004112 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4113 "-dylib_compatibility_version");
4114 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4115 "-dylib_current_version");
4116
Daniel Dunbara6d38492010-01-22 02:04:52 +00004117 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004118
4119 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4120 "-dylib_install_name");
4121 }
4122
4123 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4124 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4125 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004126 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004127 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004128 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4129 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4130 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4131 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4132 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4133 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004134 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004135 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4136 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4137 Args.AddAllArgs(CmdArgs, options::OPT_init);
4138
Daniel Dunbarce911f52011-04-28 21:23:41 +00004139 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004140 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004141
4142 // If we had an explicit -mios-simulator-version-min argument, honor that,
4143 // otherwise use the traditional deployment targets. We can't just check the
4144 // is-sim attribute because existing code follows this path, and the linker
4145 // may not handle the argument.
4146 //
4147 // FIXME: We may be able to remove this, once we can verify no one depends on
4148 // it.
4149 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4150 CmdArgs.push_back("-ios_simulator_version_min");
4151 else if (DarwinTC.isTargetIPhoneOS())
4152 CmdArgs.push_back("-iphoneos_version_min");
4153 else
4154 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004155 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004156
Daniel Dunbar02633b52009-03-26 16:23:12 +00004157 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4158 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4159 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4160 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4161 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004162
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004163 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4164 options::OPT_fno_pie,
4165 options::OPT_fno_PIE)) {
4166 if (A->getOption().matches(options::OPT_fpie) ||
4167 A->getOption().matches(options::OPT_fPIE))
4168 CmdArgs.push_back("-pie");
4169 else
4170 CmdArgs.push_back("-no_pie");
4171 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004172
4173 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4174 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4175 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4176 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4177 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4178 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4179 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4180 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4181 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4182 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4183 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4184 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4185 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4186 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4187 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4188 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004189
Daniel Dunbarcc957192011-05-02 21:03:47 +00004190 // Give --sysroot= preference, over the Apple specific behavior to also use
4191 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004192 StringRef sysroot = C.getSysRoot();
4193 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004194 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004195 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004196 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4197 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004198 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004199 }
4200
Daniel Dunbar02633b52009-03-26 16:23:12 +00004201 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4202 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4203 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4204 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4205 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004206 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004207 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4208 Args.AddAllArgs(CmdArgs, options::OPT_y);
4209 Args.AddLastArg(CmdArgs, options::OPT_w);
4210 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4211 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4212 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4213 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4214 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4215 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4216 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4217 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4218 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4219 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4220 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4221 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4222}
4223
4224void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004225 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004226 const InputInfoList &Inputs,
4227 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004228 const char *LinkingOutput) const {
4229 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004230
Daniel Dunbar02633b52009-03-26 16:23:12 +00004231 // The logic here is derived from gcc's behavior; most of which
4232 // comes from specs (starting with link_command). Consult gcc for
4233 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004234 ArgStringList CmdArgs;
4235
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004236 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4237 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4238 options::OPT_ccc_arcmt_migrate)) {
4239 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4240 (*I)->claim();
4241 const char *Exec =
4242 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4243 CmdArgs.push_back(Output.getFilename());
4244 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4245 return;
4246 }
4247
Daniel Dunbar02633b52009-03-26 16:23:12 +00004248 // I'm not sure why this particular decomposition exists in gcc, but
4249 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004250 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004251
Daniel Dunbar02633b52009-03-26 16:23:12 +00004252 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4253 Args.AddAllArgs(CmdArgs, options::OPT_s);
4254 Args.AddAllArgs(CmdArgs, options::OPT_t);
4255 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4256 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004257 Args.AddLastArg(CmdArgs, options::OPT_e);
4258 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4259 Args.AddAllArgs(CmdArgs, options::OPT_r);
4260
Daniel Dunbar270073c2010-10-18 22:08:36 +00004261 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4262 // members of static archive libraries which implement Objective-C classes or
4263 // categories.
4264 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4265 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004266
Bill Wendlingd56f4032012-12-10 21:48:41 +00004267 if (Args.hasArg(options::OPT_rdynamic))
4268 CmdArgs.push_back("-export_dynamic");
4269
Daniel Dunbar02633b52009-03-26 16:23:12 +00004270 CmdArgs.push_back("-o");
4271 CmdArgs.push_back(Output.getFilename());
4272
Chad Rosier18937312012-05-16 23:45:12 +00004273 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004274 !Args.hasArg(options::OPT_nostartfiles)) {
4275 // Derived from startfile spec.
4276 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004277 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004278 if (getDarwinToolChain().isTargetIOSSimulator()) {
4279 // The simulator doesn't have a versioned crt1 file.
4280 CmdArgs.push_back("-ldylib1.o");
4281 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004282 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4283 CmdArgs.push_back("-ldylib1.o");
4284 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004285 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004286 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004287 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004288 CmdArgs.push_back("-ldylib1.10.5.o");
4289 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004290 } else {
4291 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004292 if (!Args.hasArg(options::OPT_static)) {
4293 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004294 if (getDarwinToolChain().isTargetIOSSimulator()) {
4295 // The simulator doesn't have a versioned crt1 file.
4296 CmdArgs.push_back("-lbundle1.o");
4297 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004298 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4299 CmdArgs.push_back("-lbundle1.o");
4300 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004301 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004302 CmdArgs.push_back("-lbundle1.o");
4303 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004304 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004305 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004306 if (Args.hasArg(options::OPT_pg) &&
4307 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004308 if (Args.hasArg(options::OPT_static) ||
4309 Args.hasArg(options::OPT_object) ||
4310 Args.hasArg(options::OPT_preload)) {
4311 CmdArgs.push_back("-lgcrt0.o");
4312 } else {
4313 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004314
Daniel Dunbar02633b52009-03-26 16:23:12 +00004315 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004316 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004317 // By default on OS X 10.8 and later, we don't link with a crt1.o
4318 // file and the linker knows to use _main as the entry point. But,
4319 // when compiling with -pg, we need to link with the gcrt1.o file,
4320 // so pass the -no_new_main option to tell the linker to use the
4321 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004322 if (getDarwinToolChain().isTargetMacOS() &&
4323 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4324 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004325 } else {
4326 if (Args.hasArg(options::OPT_static) ||
4327 Args.hasArg(options::OPT_object) ||
4328 Args.hasArg(options::OPT_preload)) {
4329 CmdArgs.push_back("-lcrt0.o");
4330 } else {
4331 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004332 if (getDarwinToolChain().isTargetIOSSimulator()) {
4333 // The simulator doesn't have a versioned crt1 file.
4334 CmdArgs.push_back("-lcrt1.o");
4335 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004336 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4337 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004338 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004339 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004340 } else {
4341 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4342 CmdArgs.push_back("-lcrt1.o");
4343 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4344 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004345 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004346 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004347
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004348 // darwin_crt2 spec is empty.
4349 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004350 }
4351 }
4352 }
4353 }
4354
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004355 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4356 Args.hasArg(options::OPT_shared_libgcc) &&
4357 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004358 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004359 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004360 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004361 }
4362 }
4363
4364 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004365
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00004366 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004367 // If we're building a dynamic lib with -fsanitize=address,
4368 // unresolved symbols may appear. Mark all
Alexey Samsonov75fcb192012-11-16 12:53:14 +00004369 // of them as dynamic_lookup. Linking executables is handled in
4370 // lib/Driver/ToolChains.cpp.
Alexey Samsonov2cb3d302013-01-21 08:45:02 +00004371 if (Sanitize.needsAsanRt()) {
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00004372 if (Args.hasArg(options::OPT_dynamiclib) ||
4373 Args.hasArg(options::OPT_bundle)) {
4374 CmdArgs.push_back("-undefined");
4375 CmdArgs.push_back("dynamic_lookup");
4376 }
4377 }
4378
Daniel Dunbar02633b52009-03-26 16:23:12 +00004379 if (Args.hasArg(options::OPT_fopenmp))
4380 // This is more complicated in gcc...
4381 CmdArgs.push_back("-lgomp");
4382
Douglas Gregor04e326b2012-05-15 21:00:27 +00004383 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4384
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004385 if (isObjCRuntimeLinked(Args) &&
4386 !Args.hasArg(options::OPT_nostdlib) &&
4387 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004388 // Avoid linking compatibility stubs on i386 mac.
4389 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004390 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004391 // If we don't have ARC or subscripting runtime support, link in the
4392 // runtime stubs. We have to do this *before* adding any of the normal
4393 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004394 ObjCRuntime runtime =
4395 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004396 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004397 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004398 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004399 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004400 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004401 CmdArgs.push_back("-framework");
4402 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004403 // Link libobj.
4404 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004405 }
John McCallf85e1932011-06-15 23:02:42 +00004406
Daniel Dunbar02633b52009-03-26 16:23:12 +00004407 if (LinkingOutput) {
4408 CmdArgs.push_back("-arch_multiple");
4409 CmdArgs.push_back("-final_output");
4410 CmdArgs.push_back(LinkingOutput);
4411 }
4412
Daniel Dunbar02633b52009-03-26 16:23:12 +00004413 if (Args.hasArg(options::OPT_fnested_functions))
4414 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004415
Daniel Dunbar02633b52009-03-26 16:23:12 +00004416 if (!Args.hasArg(options::OPT_nostdlib) &&
4417 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004418 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004419 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004420
Daniel Dunbar02633b52009-03-26 16:23:12 +00004421 // link_ssp spec is empty.
4422
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004423 // Let the tool chain choose which runtime library to link.
4424 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004425 }
4426
Chad Rosier18937312012-05-16 23:45:12 +00004427 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004428 !Args.hasArg(options::OPT_nostartfiles)) {
4429 // endfile_spec is empty.
4430 }
4431
4432 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4433 Args.AddAllArgs(CmdArgs, options::OPT_F);
4434
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004435 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004436 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004437 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004438}
4439
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004440void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004441 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004442 const InputInfoList &Inputs,
4443 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004444 const char *LinkingOutput) const {
4445 ArgStringList CmdArgs;
4446
4447 CmdArgs.push_back("-create");
4448 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004449
4450 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004451 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004452
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004453 for (InputInfoList::const_iterator
4454 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4455 const InputInfo &II = *it;
4456 assert(II.isFilename() && "Unexpected lipo input.");
4457 CmdArgs.push_back(II.getFilename());
4458 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004459 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004460 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004461 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004462}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004463
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004464void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004465 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004466 const InputInfoList &Inputs,
4467 const ArgList &Args,
4468 const char *LinkingOutput) const {
4469 ArgStringList CmdArgs;
4470
Daniel Dunbar03e92302011-05-09 17:23:16 +00004471 CmdArgs.push_back("-o");
4472 CmdArgs.push_back(Output.getFilename());
4473
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004474 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4475 const InputInfo &Input = Inputs[0];
4476 assert(Input.isFilename() && "Unexpected dsymutil input.");
4477 CmdArgs.push_back(Input.getFilename());
4478
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004479 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004480 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004481 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004482}
4483
Eric Christopherf8571862011-08-23 17:56:55 +00004484void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00004485 const InputInfo &Output,
4486 const InputInfoList &Inputs,
4487 const ArgList &Args,
4488 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00004489 ArgStringList CmdArgs;
4490 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00004491 CmdArgs.push_back("--debug-info");
4492 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00004493 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00004494
4495 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4496 const InputInfo &Input = Inputs[0];
4497 assert(Input.isFilename() && "Unexpected verify input");
4498
4499 // Grabbing the output of the earlier dsymutil run.
4500 CmdArgs.push_back(Input.getFilename());
4501
4502 const char *Exec =
4503 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4504 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4505}
4506
David Chisnall31c46902012-02-15 13:39:01 +00004507void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4508 const InputInfo &Output,
4509 const InputInfoList &Inputs,
4510 const ArgList &Args,
4511 const char *LinkingOutput) const {
4512 ArgStringList CmdArgs;
4513
4514 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4515 options::OPT_Xassembler);
4516
4517 CmdArgs.push_back("-o");
4518 CmdArgs.push_back(Output.getFilename());
4519
4520 for (InputInfoList::const_iterator
4521 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4522 const InputInfo &II = *it;
4523 CmdArgs.push_back(II.getFilename());
4524 }
4525
4526 const char *Exec =
4527 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4528 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4529}
4530
4531
4532void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4533 const InputInfo &Output,
4534 const InputInfoList &Inputs,
4535 const ArgList &Args,
4536 const char *LinkingOutput) const {
4537 // FIXME: Find a real GCC, don't hard-code versions here
4538 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4539 const llvm::Triple &T = getToolChain().getTriple();
4540 std::string LibPath = "/usr/lib/";
4541 llvm::Triple::ArchType Arch = T.getArch();
4542 switch (Arch) {
4543 case llvm::Triple::x86:
4544 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4545 T.getOSName()).str() + "/4.5.2/";
4546 break;
4547 case llvm::Triple::x86_64:
4548 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4549 T.getOSName()).str();
4550 GCCLibPath += "/4.5.2/amd64/";
4551 LibPath += "amd64/";
4552 break;
4553 default:
4554 assert(0 && "Unsupported architecture");
4555 }
4556
4557 ArgStringList CmdArgs;
4558
David Chisnall41d476d2012-02-29 15:06:12 +00004559 // Demangle C++ names in errors
4560 CmdArgs.push_back("-C");
4561
David Chisnall31c46902012-02-15 13:39:01 +00004562 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4563 (!Args.hasArg(options::OPT_shared))) {
4564 CmdArgs.push_back("-e");
4565 CmdArgs.push_back("_start");
4566 }
4567
4568 if (Args.hasArg(options::OPT_static)) {
4569 CmdArgs.push_back("-Bstatic");
4570 CmdArgs.push_back("-dn");
4571 } else {
4572 CmdArgs.push_back("-Bdynamic");
4573 if (Args.hasArg(options::OPT_shared)) {
4574 CmdArgs.push_back("-shared");
4575 } else {
4576 CmdArgs.push_back("--dynamic-linker");
4577 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4578 }
4579 }
4580
4581 if (Output.isFilename()) {
4582 CmdArgs.push_back("-o");
4583 CmdArgs.push_back(Output.getFilename());
4584 } else {
4585 assert(Output.isNothing() && "Invalid output.");
4586 }
4587
4588 if (!Args.hasArg(options::OPT_nostdlib) &&
4589 !Args.hasArg(options::OPT_nostartfiles)) {
4590 if (!Args.hasArg(options::OPT_shared)) {
4591 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4592 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004593 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004594 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4595 } else {
4596 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00004597 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4598 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004599 }
David Chisnalle6dd6832012-03-13 14:14:54 +00004600 if (getToolChain().getDriver().CCCIsCXX)
4601 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004602 }
4603
4604 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4605
4606 Args.AddAllArgs(CmdArgs, options::OPT_L);
4607 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4608 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00004609 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00004610
4611 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4612
4613 if (!Args.hasArg(options::OPT_nostdlib) &&
4614 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnalle58e6f92012-04-10 11:49:50 +00004615 if (getToolChain().getDriver().CCCIsCXX)
4616 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00004617 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00004618 if (!Args.hasArg(options::OPT_shared)) {
4619 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00004620 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00004621 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00004622 }
David Chisnall31c46902012-02-15 13:39:01 +00004623 }
4624
4625 if (!Args.hasArg(options::OPT_nostdlib) &&
4626 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00004627 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004628 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00004629 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00004630
4631 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4632
4633 const char *Exec =
4634 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4635 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4636}
4637
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004638void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004639 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004640 const InputInfoList &Inputs,
4641 const ArgList &Args,
4642 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004643 ArgStringList CmdArgs;
4644
4645 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4646 options::OPT_Xassembler);
4647
4648 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004649 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004650
4651 for (InputInfoList::const_iterator
4652 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4653 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004654 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004655 }
4656
4657 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004658 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004659 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004660}
4661
4662void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004663 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00004664 const InputInfoList &Inputs,
4665 const ArgList &Args,
4666 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004667 ArgStringList CmdArgs;
4668
4669 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004670 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004671 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004672 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004673 }
4674
4675 if (Args.hasArg(options::OPT_static)) {
4676 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004677 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004678 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00004679// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004680 CmdArgs.push_back("-Bdynamic");
4681 if (Args.hasArg(options::OPT_shared)) {
4682 CmdArgs.push_back("-shared");
4683 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00004684 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004685 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4686 }
4687 }
4688
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004689 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004690 CmdArgs.push_back("-o");
4691 CmdArgs.push_back(Output.getFilename());
4692 } else {
4693 assert(Output.isNothing() && "Invalid output.");
4694 }
4695
4696 if (!Args.hasArg(options::OPT_nostdlib) &&
4697 !Args.hasArg(options::OPT_nostartfiles)) {
4698 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00004699 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004700 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004701 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004702 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004703 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004704 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004705 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004706 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004707 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004708 }
Chris Lattner38e317d2010-07-07 16:01:42 +00004709 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004710 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004711 }
4712
Daniel Dunbar294691e2009-11-04 06:24:38 +00004713 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4714 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004715 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004716
4717 Args.AddAllArgs(CmdArgs, options::OPT_L);
4718 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4719 Args.AddAllArgs(CmdArgs, options::OPT_e);
4720
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004721 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004722
4723 if (!Args.hasArg(options::OPT_nostdlib) &&
4724 !Args.hasArg(options::OPT_nodefaultlibs)) {
4725 // FIXME: For some reason GCC passes -lgcc before adding
4726 // the default system libraries. Just mimic this for now.
4727 CmdArgs.push_back("-lgcc");
4728
4729 if (Args.hasArg(options::OPT_pthread))
4730 CmdArgs.push_back("-pthread");
4731 if (!Args.hasArg(options::OPT_shared))
4732 CmdArgs.push_back("-lc");
4733 CmdArgs.push_back("-lgcc");
4734 }
4735
4736 if (!Args.hasArg(options::OPT_nostdlib) &&
4737 !Args.hasArg(options::OPT_nostartfiles)) {
4738 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004739 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004740 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004741 }
4742
Bill Wendling3f4be6f2011-06-27 19:15:03 +00004743 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00004744
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004745 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004746 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004747 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00004748}
4749
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004750void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004751 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004752 const InputInfoList &Inputs,
4753 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00004754 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004755 ArgStringList CmdArgs;
4756
4757 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4758 options::OPT_Xassembler);
4759
4760 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004761 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004762
4763 for (InputInfoList::const_iterator
4764 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4765 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004766 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004767 }
4768
4769 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004770 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004771 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004772}
4773
4774void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004775 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004776 const InputInfoList &Inputs,
4777 const ArgList &Args,
4778 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004779 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004780 ArgStringList CmdArgs;
4781
Rafael Espindola6cc2a682012-12-31 22:41:36 +00004782 // Silence warning for "clang -g foo.o -o foo"
4783 Args.ClaimAllArgs(options::OPT_g_Group);
4784 // and "clang -emit-llvm foo.o -o foo"
4785 Args.ClaimAllArgs(options::OPT_emit_llvm);
4786 // and for "clang -w foo.o -o foo". Other warning options are already
4787 // handled somewhere else.
4788 Args.ClaimAllArgs(options::OPT_w);
4789
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004790 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00004791 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004792 CmdArgs.push_back("-e");
4793 CmdArgs.push_back("__start");
4794 }
4795
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004796 if (Args.hasArg(options::OPT_static)) {
4797 CmdArgs.push_back("-Bstatic");
4798 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00004799 if (Args.hasArg(options::OPT_rdynamic))
4800 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004801 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004802 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004803 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004804 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004805 } else {
4806 CmdArgs.push_back("-dynamic-linker");
4807 CmdArgs.push_back("/usr/libexec/ld.so");
4808 }
4809 }
4810
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004811 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004812 CmdArgs.push_back("-o");
4813 CmdArgs.push_back(Output.getFilename());
4814 } else {
4815 assert(Output.isNothing() && "Invalid output.");
4816 }
4817
4818 if (!Args.hasArg(options::OPT_nostdlib) &&
4819 !Args.hasArg(options::OPT_nostartfiles)) {
4820 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00004821 if (Args.hasArg(options::OPT_pg))
4822 CmdArgs.push_back(Args.MakeArgString(
4823 getToolChain().GetFilePath("gcrt0.o")));
4824 else
4825 CmdArgs.push_back(Args.MakeArgString(
4826 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00004827 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004828 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004829 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00004830 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004831 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004832 }
4833 }
4834
Edward O'Callaghane7e18202009-10-28 15:13:08 +00004835 std::string Triple = getToolChain().getTripleString();
4836 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00004837 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00004838 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00004839 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004840
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004841 Args.AddAllArgs(CmdArgs, options::OPT_L);
4842 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4843 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00004844 Args.AddAllArgs(CmdArgs, options::OPT_s);
4845 Args.AddAllArgs(CmdArgs, options::OPT_t);
4846 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4847 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004848
Daniel Dunbar2008fee2010-09-17 00:24:54 +00004849 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004850
4851 if (!Args.hasArg(options::OPT_nostdlib) &&
4852 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar95c04572010-08-01 23:13:54 +00004853 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004854 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00004855 if (Args.hasArg(options::OPT_pg))
4856 CmdArgs.push_back("-lm_p");
4857 else
4858 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00004859 }
4860
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004861 // FIXME: For some reason GCC passes -lgcc before adding
4862 // the default system libraries. Just mimic this for now.
4863 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004864
Eric Christopherdc6cc872012-09-13 06:32:34 +00004865 if (Args.hasArg(options::OPT_pthread)) {
4866 if (!Args.hasArg(options::OPT_shared) &&
4867 Args.hasArg(options::OPT_pg))
4868 CmdArgs.push_back("-lpthread_p");
4869 else
4870 CmdArgs.push_back("-lpthread");
4871 }
4872
Chandler Carruth657849c2011-12-17 22:32:42 +00004873 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00004874 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00004875 CmdArgs.push_back("-lc_p");
4876 else
4877 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00004878 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00004879
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00004880 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004881 }
4882
4883 if (!Args.hasArg(options::OPT_nostdlib) &&
4884 !Args.hasArg(options::OPT_nostartfiles)) {
4885 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00004886 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004887 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004888 else
Chris Lattner38e317d2010-07-07 16:01:42 +00004889 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004890 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004891 }
4892
4893 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004894 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004895 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00004896}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00004897
Eli Friedman42f74f22012-08-08 23:57:20 +00004898void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4899 const InputInfo &Output,
4900 const InputInfoList &Inputs,
4901 const ArgList &Args,
4902 const char *LinkingOutput) const {
4903 ArgStringList CmdArgs;
4904
4905 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4906 options::OPT_Xassembler);
4907
4908 CmdArgs.push_back("-o");
4909 CmdArgs.push_back(Output.getFilename());
4910
4911 for (InputInfoList::const_iterator
4912 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4913 const InputInfo &II = *it;
4914 CmdArgs.push_back(II.getFilename());
4915 }
4916
4917 const char *Exec =
4918 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4919 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4920}
4921
4922void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4923 const InputInfo &Output,
4924 const InputInfoList &Inputs,
4925 const ArgList &Args,
4926 const char *LinkingOutput) const {
4927 const Driver &D = getToolChain().getDriver();
4928 ArgStringList CmdArgs;
4929
4930 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4931 (!Args.hasArg(options::OPT_shared))) {
4932 CmdArgs.push_back("-e");
4933 CmdArgs.push_back("__start");
4934 }
4935
4936 if (Args.hasArg(options::OPT_static)) {
4937 CmdArgs.push_back("-Bstatic");
4938 } else {
4939 if (Args.hasArg(options::OPT_rdynamic))
4940 CmdArgs.push_back("-export-dynamic");
4941 CmdArgs.push_back("--eh-frame-hdr");
4942 CmdArgs.push_back("-Bdynamic");
4943 if (Args.hasArg(options::OPT_shared)) {
4944 CmdArgs.push_back("-shared");
4945 } else {
4946 CmdArgs.push_back("-dynamic-linker");
4947 CmdArgs.push_back("/usr/libexec/ld.so");
4948 }
4949 }
4950
4951 if (Output.isFilename()) {
4952 CmdArgs.push_back("-o");
4953 CmdArgs.push_back(Output.getFilename());
4954 } else {
4955 assert(Output.isNothing() && "Invalid output.");
4956 }
4957
4958 if (!Args.hasArg(options::OPT_nostdlib) &&
4959 !Args.hasArg(options::OPT_nostartfiles)) {
4960 if (!Args.hasArg(options::OPT_shared)) {
4961 if (Args.hasArg(options::OPT_pg))
4962 CmdArgs.push_back(Args.MakeArgString(
4963 getToolChain().GetFilePath("gcrt0.o")));
4964 else
4965 CmdArgs.push_back(Args.MakeArgString(
4966 getToolChain().GetFilePath("crt0.o")));
4967 CmdArgs.push_back(Args.MakeArgString(
4968 getToolChain().GetFilePath("crtbegin.o")));
4969 } else {
4970 CmdArgs.push_back(Args.MakeArgString(
4971 getToolChain().GetFilePath("crtbeginS.o")));
4972 }
4973 }
4974
4975 Args.AddAllArgs(CmdArgs, options::OPT_L);
4976 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4977 Args.AddAllArgs(CmdArgs, options::OPT_e);
4978
4979 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4980
4981 if (!Args.hasArg(options::OPT_nostdlib) &&
4982 !Args.hasArg(options::OPT_nodefaultlibs)) {
4983 if (D.CCCIsCXX) {
4984 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4985 if (Args.hasArg(options::OPT_pg))
4986 CmdArgs.push_back("-lm_p");
4987 else
4988 CmdArgs.push_back("-lm");
4989 }
4990
Rafael Espindola3667bbe2012-10-23 17:07:31 +00004991 if (Args.hasArg(options::OPT_pthread)) {
4992 if (!Args.hasArg(options::OPT_shared) &&
4993 Args.hasArg(options::OPT_pg))
4994 CmdArgs.push_back("-lpthread_p");
4995 else
4996 CmdArgs.push_back("-lpthread");
4997 }
4998
Eli Friedman42f74f22012-08-08 23:57:20 +00004999 if (!Args.hasArg(options::OPT_shared)) {
5000 if (Args.hasArg(options::OPT_pg))
5001 CmdArgs.push_back("-lc_p");
5002 else
5003 CmdArgs.push_back("-lc");
5004 }
5005
5006 std::string myarch = "-lclang_rt.";
5007 const llvm::Triple &T = getToolChain().getTriple();
5008 llvm::Triple::ArchType Arch = T.getArch();
5009 switch (Arch) {
5010 case llvm::Triple::arm:
5011 myarch += ("arm");
5012 break;
5013 case llvm::Triple::x86:
5014 myarch += ("i386");
5015 break;
5016 case llvm::Triple::x86_64:
5017 myarch += ("amd64");
5018 break;
5019 default:
5020 assert(0 && "Unsupported architecture");
5021 }
5022 CmdArgs.push_back(Args.MakeArgString(myarch));
5023 }
5024
5025 if (!Args.hasArg(options::OPT_nostdlib) &&
5026 !Args.hasArg(options::OPT_nostartfiles)) {
5027 if (!Args.hasArg(options::OPT_shared))
5028 CmdArgs.push_back(Args.MakeArgString(
5029 getToolChain().GetFilePath("crtend.o")));
5030 else
5031 CmdArgs.push_back(Args.MakeArgString(
5032 getToolChain().GetFilePath("crtendS.o")));
5033 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005034
5035 const char *Exec =
5036 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5037 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005038}
5039
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005040void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005041 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005042 const InputInfoList &Inputs,
5043 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005044 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005045 ArgStringList CmdArgs;
5046
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005047 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5048 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005049 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005050 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005051 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005052 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005053 else if (getToolChain().getArch() == llvm::Triple::mips ||
5054 getToolChain().getArch() == llvm::Triple::mipsel ||
5055 getToolChain().getArch() == llvm::Triple::mips64 ||
5056 getToolChain().getArch() == llvm::Triple::mips64el) {
5057 StringRef CPUName;
5058 StringRef ABIName;
5059 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005060
Eric Christopherc55da4b2012-09-05 21:32:44 +00005061 CmdArgs.push_back("-march");
5062 CmdArgs.push_back(CPUName.data());
5063
5064 // Convert ABI name to the GNU tools acceptable variant.
5065 if (ABIName == "o32")
5066 ABIName = "32";
5067 else if (ABIName == "n64")
5068 ABIName = "64";
5069
5070 CmdArgs.push_back("-mabi");
5071 CmdArgs.push_back(ABIName.data());
5072
5073 if (getToolChain().getArch() == llvm::Triple::mips ||
5074 getToolChain().getArch() == llvm::Triple::mips64)
5075 CmdArgs.push_back("-EB");
5076 else
5077 CmdArgs.push_back("-EL");
5078
5079 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5080 options::OPT_fpic, options::OPT_fno_pic,
5081 options::OPT_fPIE, options::OPT_fno_PIE,
5082 options::OPT_fpie, options::OPT_fno_pie);
5083 if (LastPICArg &&
5084 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5085 LastPICArg->getOption().matches(options::OPT_fpic) ||
5086 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5087 LastPICArg->getOption().matches(options::OPT_fpie))) {
5088 CmdArgs.push_back("-KPIC");
5089 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005090 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5091 getToolChain().getArch() == llvm::Triple::thumb) {
5092 CmdArgs.push_back("-mfpu=softvfp");
5093 switch(getToolChain().getTriple().getEnvironment()) {
5094 case llvm::Triple::GNUEABI:
5095 case llvm::Triple::EABI:
5096 break;
5097
5098 default:
5099 CmdArgs.push_back("-matpcs");
5100 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005101 }
Eric Christophered734732010-03-02 02:41:08 +00005102
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005103 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5104 options::OPT_Xassembler);
5105
5106 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005107 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005108
5109 for (InputInfoList::const_iterator
5110 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5111 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005112 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005113 }
5114
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005115 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005116 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005117 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005118}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005119
5120void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005121 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005122 const InputInfoList &Inputs,
5123 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005124 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005125 const toolchains::FreeBSD& ToolChain =
5126 static_cast<const toolchains::FreeBSD&>(getToolChain());
5127 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005128 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005129
5130 // Silence warning for "clang -g foo.o -o foo"
5131 Args.ClaimAllArgs(options::OPT_g_Group);
5132 // and "clang -emit-llvm foo.o -o foo"
5133 Args.ClaimAllArgs(options::OPT_emit_llvm);
5134 // and for "clang -w foo.o -o foo". Other warning options are already
5135 // handled somewhere else.
5136 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005137
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005138 if (!D.SysRoot.empty())
5139 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5140
Roman Divacky94380162012-08-28 15:09:03 +00005141 if (Args.hasArg(options::OPT_pie))
5142 CmdArgs.push_back("-pie");
5143
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005144 if (Args.hasArg(options::OPT_static)) {
5145 CmdArgs.push_back("-Bstatic");
5146 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005147 if (Args.hasArg(options::OPT_rdynamic))
5148 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005149 CmdArgs.push_back("--eh-frame-hdr");
5150 if (Args.hasArg(options::OPT_shared)) {
5151 CmdArgs.push_back("-Bshareable");
5152 } else {
5153 CmdArgs.push_back("-dynamic-linker");
5154 CmdArgs.push_back("/libexec/ld-elf.so.1");
5155 }
Roman Divacky94380162012-08-28 15:09:03 +00005156 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5157 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005158 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5159 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5160 CmdArgs.push_back("--hash-style=both");
5161 }
5162 }
5163 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005164 }
5165
5166 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5167 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005168 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005169 CmdArgs.push_back("-m");
5170 CmdArgs.push_back("elf_i386_fbsd");
5171 }
5172
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005173 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005174 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005175 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005176 }
5177
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005178 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005179 CmdArgs.push_back("-o");
5180 CmdArgs.push_back(Output.getFilename());
5181 } else {
5182 assert(Output.isNothing() && "Invalid output.");
5183 }
5184
5185 if (!Args.hasArg(options::OPT_nostdlib) &&
5186 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005187 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005188 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005189 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005190 crt1 = "gcrt1.o";
5191 else if (Args.hasArg(options::OPT_pie))
5192 crt1 = "Scrt1.o";
5193 else
5194 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005195 }
Roman Divacky94380162012-08-28 15:09:03 +00005196 if (crt1)
5197 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5198
5199 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5200
5201 const char *crtbegin = NULL;
5202 if (Args.hasArg(options::OPT_static))
5203 crtbegin = "crtbeginT.o";
5204 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5205 crtbegin = "crtbeginS.o";
5206 else
5207 crtbegin = "crtbegin.o";
5208
5209 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005210 }
5211
5212 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005213 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005214 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5215 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005216 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005217 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5218 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005219 Args.AddAllArgs(CmdArgs, options::OPT_s);
5220 Args.AddAllArgs(CmdArgs, options::OPT_t);
5221 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5222 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005223
Roman Divacky94380162012-08-28 15:09:03 +00005224 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005225
5226 if (!Args.hasArg(options::OPT_nostdlib) &&
5227 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar20022632010-02-17 08:07:51 +00005228 if (D.CCCIsCXX) {
Roman Divacky94380162012-08-28 15:09:03 +00005229 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005230 if (Args.hasArg(options::OPT_pg))
5231 CmdArgs.push_back("-lm_p");
5232 else
5233 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005234 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005235 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5236 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005237 if (Args.hasArg(options::OPT_pg))
5238 CmdArgs.push_back("-lgcc_p");
5239 else
5240 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005241 if (Args.hasArg(options::OPT_static)) {
5242 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005243 } else if (Args.hasArg(options::OPT_pg)) {
5244 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005245 } else {
5246 CmdArgs.push_back("--as-needed");
5247 CmdArgs.push_back("-lgcc_s");
5248 CmdArgs.push_back("--no-as-needed");
5249 }
5250
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005251 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005252 if (Args.hasArg(options::OPT_pg))
5253 CmdArgs.push_back("-lpthread_p");
5254 else
5255 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005256 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005257
Roman Divackyc16bb762011-02-10 16:59:40 +00005258 if (Args.hasArg(options::OPT_pg)) {
5259 if (Args.hasArg(options::OPT_shared))
5260 CmdArgs.push_back("-lc");
5261 else
5262 CmdArgs.push_back("-lc_p");
5263 CmdArgs.push_back("-lgcc_p");
5264 } else {
5265 CmdArgs.push_back("-lc");
5266 CmdArgs.push_back("-lgcc");
5267 }
5268
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005269 if (Args.hasArg(options::OPT_static)) {
5270 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005271 } else if (Args.hasArg(options::OPT_pg)) {
5272 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005273 } else {
5274 CmdArgs.push_back("--as-needed");
5275 CmdArgs.push_back("-lgcc_s");
5276 CmdArgs.push_back("--no-as-needed");
5277 }
5278 }
5279
5280 if (!Args.hasArg(options::OPT_nostdlib) &&
5281 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005282 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005283 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005284 else
5285 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005286 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005287 }
5288
Roman Divacky94380162012-08-28 15:09:03 +00005289 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005290
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005291 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005292 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005293 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005294}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005295
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005296void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5297 const InputInfo &Output,
5298 const InputInfoList &Inputs,
5299 const ArgList &Args,
5300 const char *LinkingOutput) const {
5301 ArgStringList CmdArgs;
5302
5303 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5304 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005305 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005306 CmdArgs.push_back("--32");
5307
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005308 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005309 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005310 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005311 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005312 CmdArgs.push_back("-EL");
5313
5314 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5315 options::OPT_Xassembler);
5316
5317 CmdArgs.push_back("-o");
5318 CmdArgs.push_back(Output.getFilename());
5319
5320 for (InputInfoList::const_iterator
5321 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5322 const InputInfo &II = *it;
5323 CmdArgs.push_back(II.getFilename());
5324 }
5325
David Chisnall5adcec12011-09-27 22:03:18 +00005326 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005327 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5328}
5329
5330void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5331 const InputInfo &Output,
5332 const InputInfoList &Inputs,
5333 const ArgList &Args,
5334 const char *LinkingOutput) const {
5335 const Driver &D = getToolChain().getDriver();
5336 ArgStringList CmdArgs;
5337
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005338 if (!D.SysRoot.empty())
5339 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5340
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005341 if (Args.hasArg(options::OPT_static)) {
5342 CmdArgs.push_back("-Bstatic");
5343 } else {
5344 if (Args.hasArg(options::OPT_rdynamic))
5345 CmdArgs.push_back("-export-dynamic");
5346 CmdArgs.push_back("--eh-frame-hdr");
5347 if (Args.hasArg(options::OPT_shared)) {
5348 CmdArgs.push_back("-Bshareable");
5349 } else {
5350 CmdArgs.push_back("-dynamic-linker");
5351 CmdArgs.push_back("/libexec/ld.elf_so");
5352 }
5353 }
5354
5355 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5356 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005357 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005358 CmdArgs.push_back("-m");
5359 CmdArgs.push_back("elf_i386");
5360 }
5361
5362 if (Output.isFilename()) {
5363 CmdArgs.push_back("-o");
5364 CmdArgs.push_back(Output.getFilename());
5365 } else {
5366 assert(Output.isNothing() && "Invalid output.");
5367 }
5368
5369 if (!Args.hasArg(options::OPT_nostdlib) &&
5370 !Args.hasArg(options::OPT_nostartfiles)) {
5371 if (!Args.hasArg(options::OPT_shared)) {
5372 CmdArgs.push_back(Args.MakeArgString(
5373 getToolChain().GetFilePath("crt0.o")));
5374 CmdArgs.push_back(Args.MakeArgString(
5375 getToolChain().GetFilePath("crti.o")));
5376 CmdArgs.push_back(Args.MakeArgString(
5377 getToolChain().GetFilePath("crtbegin.o")));
5378 } else {
5379 CmdArgs.push_back(Args.MakeArgString(
5380 getToolChain().GetFilePath("crti.o")));
5381 CmdArgs.push_back(Args.MakeArgString(
5382 getToolChain().GetFilePath("crtbeginS.o")));
5383 }
5384 }
5385
5386 Args.AddAllArgs(CmdArgs, options::OPT_L);
5387 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5388 Args.AddAllArgs(CmdArgs, options::OPT_e);
5389 Args.AddAllArgs(CmdArgs, options::OPT_s);
5390 Args.AddAllArgs(CmdArgs, options::OPT_t);
5391 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5392 Args.AddAllArgs(CmdArgs, options::OPT_r);
5393
5394 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5395
5396 if (!Args.hasArg(options::OPT_nostdlib) &&
5397 !Args.hasArg(options::OPT_nodefaultlibs)) {
5398 if (D.CCCIsCXX) {
5399 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5400 CmdArgs.push_back("-lm");
5401 }
5402 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5403 // the default system libraries. Just mimic this for now.
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005404 if (Args.hasArg(options::OPT_static)) {
5405 CmdArgs.push_back("-lgcc_eh");
5406 } else {
5407 CmdArgs.push_back("--as-needed");
5408 CmdArgs.push_back("-lgcc_s");
5409 CmdArgs.push_back("--no-as-needed");
5410 }
Joerg Sonnenbergerdb6393f2011-06-07 23:39:17 +00005411 CmdArgs.push_back("-lgcc");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005412
5413 if (Args.hasArg(options::OPT_pthread))
5414 CmdArgs.push_back("-lpthread");
5415 CmdArgs.push_back("-lc");
5416
5417 CmdArgs.push_back("-lgcc");
5418 if (Args.hasArg(options::OPT_static)) {
5419 CmdArgs.push_back("-lgcc_eh");
5420 } else {
5421 CmdArgs.push_back("--as-needed");
5422 CmdArgs.push_back("-lgcc_s");
5423 CmdArgs.push_back("--no-as-needed");
5424 }
5425 }
5426
5427 if (!Args.hasArg(options::OPT_nostdlib) &&
5428 !Args.hasArg(options::OPT_nostartfiles)) {
5429 if (!Args.hasArg(options::OPT_shared))
5430 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5431 "crtend.o")));
5432 else
5433 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5434 "crtendS.o")));
5435 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5436 "crtn.o")));
5437 }
5438
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005439 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005440
David Chisnall5adcec12011-09-27 22:03:18 +00005441 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005442 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5443}
5444
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005445void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5446 const InputInfo &Output,
5447 const InputInfoList &Inputs,
5448 const ArgList &Args,
5449 const char *LinkingOutput) const {
5450 ArgStringList CmdArgs;
5451
5452 // Add --32/--64 to make sure we get the format we want.
5453 // This is incomplete
5454 if (getToolChain().getArch() == llvm::Triple::x86) {
5455 CmdArgs.push_back("--32");
5456 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5457 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005458 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5459 CmdArgs.push_back("-a32");
5460 CmdArgs.push_back("-mppc");
5461 CmdArgs.push_back("-many");
5462 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5463 CmdArgs.push_back("-a64");
5464 CmdArgs.push_back("-mppc64");
5465 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005466 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005467 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005468 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5469 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005470
5471 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5472 getToolChain().getTriple());
5473 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005474
5475 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5476 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5477 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005478 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5479 getToolChain().getArch() == llvm::Triple::mipsel ||
5480 getToolChain().getArch() == llvm::Triple::mips64 ||
5481 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00005482 StringRef CPUName;
5483 StringRef ABIName;
5484 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005485
Simon Atanasyan073a7802012-04-07 22:31:29 +00005486 CmdArgs.push_back("-march");
5487 CmdArgs.push_back(CPUName.data());
5488
5489 // Convert ABI name to the GNU tools acceptable variant.
5490 if (ABIName == "o32")
5491 ABIName = "32";
5492 else if (ABIName == "n64")
5493 ABIName = "64";
5494
5495 CmdArgs.push_back("-mabi");
5496 CmdArgs.push_back(ABIName.data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00005497
5498 if (getToolChain().getArch() == llvm::Triple::mips ||
5499 getToolChain().getArch() == llvm::Triple::mips64)
5500 CmdArgs.push_back("-EB");
5501 else
5502 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00005503
5504 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5505 options::OPT_fpic, options::OPT_fno_pic,
5506 options::OPT_fPIE, options::OPT_fno_PIE,
5507 options::OPT_fpie, options::OPT_fno_pie);
5508 if (LastPICArg &&
5509 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5510 LastPICArg->getOption().matches(options::OPT_fpic) ||
5511 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5512 LastPICArg->getOption().matches(options::OPT_fpie))) {
5513 CmdArgs.push_back("-KPIC");
5514 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005515 }
5516
5517 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5518 options::OPT_Xassembler);
5519
5520 CmdArgs.push_back("-o");
5521 CmdArgs.push_back(Output.getFilename());
5522
5523 for (InputInfoList::const_iterator
5524 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5525 const InputInfo &II = *it;
5526 CmdArgs.push_back(II.getFilename());
5527 }
5528
5529 const char *Exec =
5530 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5531 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5532}
5533
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005534static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5535 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00005536 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Logan Chien529a73d2012-11-19 12:04:11 +00005537 bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
5538 Args.hasArg(options::OPT_static_libgcc);
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005539 if (!D.CCCIsCXX)
5540 CmdArgs.push_back("-lgcc");
5541
Logan Chien529a73d2012-11-19 12:04:11 +00005542 if (StaticLibgcc || isAndroid) {
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005543 if (D.CCCIsCXX)
5544 CmdArgs.push_back("-lgcc");
5545 } else {
5546 if (!D.CCCIsCXX)
5547 CmdArgs.push_back("--as-needed");
5548 CmdArgs.push_back("-lgcc_s");
5549 if (!D.CCCIsCXX)
5550 CmdArgs.push_back("--no-as-needed");
5551 }
5552
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005553 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005554 CmdArgs.push_back("-lgcc_eh");
5555 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5556 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00005557
5558 // According to Android ABI, we have to link with libdl if we are
5559 // linking with non-static libgcc.
5560 //
5561 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5562 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5563 if (isAndroid && !StaticLibgcc)
5564 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00005565}
5566
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005567static bool hasMipsN32ABIArg(const ArgList &Args) {
5568 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00005569 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005570}
5571
Rafael Espindolac1da9812010-11-07 20:14:31 +00005572void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5573 const InputInfo &Output,
5574 const InputInfoList &Inputs,
5575 const ArgList &Args,
5576 const char *LinkingOutput) const {
5577 const toolchains::Linux& ToolChain =
5578 static_cast<const toolchains::Linux&>(getToolChain());
5579 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00005580 const bool isAndroid =
5581 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005582
Rafael Espindolac1da9812010-11-07 20:14:31 +00005583 ArgStringList CmdArgs;
5584
Rafael Espindola26f14c32010-11-15 18:28:16 +00005585 // Silence warning for "clang -g foo.o -o foo"
5586 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005587 // and "clang -emit-llvm foo.o -o foo"
5588 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00005589 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00005590 // handled somewhere else.
5591 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00005592
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005593 if (!D.SysRoot.empty())
5594 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005595
Peter Collingbourne17d481f2013-01-17 20:17:16 +00005596 if (Args.hasArg(options::OPT_pie) && !Args.hasArg(options::OPT_shared))
Rafael Espindolafdda1712010-11-17 22:26:15 +00005597 CmdArgs.push_back("-pie");
5598
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00005599 if (Args.hasArg(options::OPT_rdynamic))
5600 CmdArgs.push_back("-export-dynamic");
5601
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00005602 if (Args.hasArg(options::OPT_s))
5603 CmdArgs.push_back("-s");
5604
Rafael Espindolac1da9812010-11-07 20:14:31 +00005605 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5606 e = ToolChain.ExtraOpts.end();
5607 i != e; ++i)
5608 CmdArgs.push_back(i->c_str());
5609
5610 if (!Args.hasArg(options::OPT_static)) {
5611 CmdArgs.push_back("--eh-frame-hdr");
5612 }
5613
5614 CmdArgs.push_back("-m");
5615 if (ToolChain.getArch() == llvm::Triple::x86)
5616 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00005617 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5618 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005619 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00005620 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005621 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005622 else if (ToolChain.getArch() == llvm::Triple::ppc)
5623 CmdArgs.push_back("elf32ppclinux");
5624 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5625 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00005626 else if (ToolChain.getArch() == llvm::Triple::mips)
5627 CmdArgs.push_back("elf32btsmip");
5628 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5629 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005630 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5631 if (hasMipsN32ABIArg(Args))
5632 CmdArgs.push_back("elf32btsmipn32");
5633 else
5634 CmdArgs.push_back("elf64btsmip");
5635 }
5636 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5637 if (hasMipsN32ABIArg(Args))
5638 CmdArgs.push_back("elf32ltsmipn32");
5639 else
5640 CmdArgs.push_back("elf64ltsmip");
5641 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005642 else
5643 CmdArgs.push_back("elf_x86_64");
5644
5645 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00005646 if (ToolChain.getArch() == llvm::Triple::arm
5647 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005648 CmdArgs.push_back("-Bstatic");
5649 else
5650 CmdArgs.push_back("-static");
5651 } else if (Args.hasArg(options::OPT_shared)) {
5652 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00005653 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005654 CmdArgs.push_back("-Bsymbolic");
5655 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005656 }
5657
5658 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00005659 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00005660 (!Args.hasArg(options::OPT_static) &&
5661 !Args.hasArg(options::OPT_shared))) {
5662 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005663 if (isAndroid)
5664 CmdArgs.push_back("/system/bin/linker");
5665 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac1da9812010-11-07 20:14:31 +00005666 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northoverc264e162013-01-31 12:13:10 +00005667 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5668 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregorf0594d82011-03-06 19:11:49 +00005669 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liu6cc9dc82012-07-30 11:05:56 +00005670 ToolChain.getArch() == llvm::Triple::thumb) {
5671 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5672 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5673 else
5674 CmdArgs.push_back("/lib/ld-linux.so.3");
5675 }
Eli Friedman5bea4f62011-11-08 19:43:37 +00005676 else if (ToolChain.getArch() == llvm::Triple::mips ||
5677 ToolChain.getArch() == llvm::Triple::mipsel)
5678 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan8491cb22012-04-06 20:14:27 +00005679 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00005680 ToolChain.getArch() == llvm::Triple::mips64el) {
5681 if (hasMipsN32ABIArg(Args))
5682 CmdArgs.push_back("/lib32/ld.so.1");
5683 else
5684 CmdArgs.push_back("/lib64/ld.so.1");
5685 }
Ted Kremenek43ac2972011-04-05 22:04:27 +00005686 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005687 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43ac2972011-04-05 22:04:27 +00005688 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner09f43ed2011-04-11 21:15:37 +00005689 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005690 else
5691 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5692 }
5693
5694 CmdArgs.push_back("-o");
5695 CmdArgs.push_back(Output.getFilename());
5696
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005697 if (!Args.hasArg(options::OPT_nostdlib) &&
5698 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005699 if (!isAndroid) {
5700 const char *crt1 = NULL;
5701 if (!Args.hasArg(options::OPT_shared)){
5702 if (Args.hasArg(options::OPT_pie))
5703 crt1 = "Scrt1.o";
5704 else
5705 crt1 = "crt1.o";
5706 }
5707 if (crt1)
5708 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005709
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005710 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5711 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005712
Rafael Espindola89414b32010-11-12 03:00:39 +00005713 const char *crtbegin;
5714 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005715 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005716 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005717 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005718 else if (Args.hasArg(options::OPT_pie))
5719 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005720 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005721 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005722 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00005723
5724 // Add crtfastmath.o if available and fast math is enabled.
5725 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00005726 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005727
5728 Args.AddAllArgs(CmdArgs, options::OPT_L);
5729
5730 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5731
Roman Divacky58e5ac92011-03-01 17:53:14 +00005732 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5733 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005734 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00005735
Rafael Espindolac5151542012-04-09 23:53:34 +00005736 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5737 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5738 // forward.
5739 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5740 CmdArgs.push_back("-plugin");
5741 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5742 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00005743
5744 // Try to pass driver level flags relevant to LTO code generation down to
5745 // the plugin.
5746
5747 // Handle architecture-specific flags for selecting CPU variants.
5748 if (ToolChain.getArch() == llvm::Triple::x86 ||
5749 ToolChain.getArch() == llvm::Triple::x86_64)
5750 CmdArgs.push_back(
5751 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5752 getX86TargetCPU(Args, ToolChain.getTriple())));
5753 else if (ToolChain.getArch() == llvm::Triple::arm ||
5754 ToolChain.getArch() == llvm::Triple::thumb)
5755 CmdArgs.push_back(
5756 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5757 getARMTargetCPU(Args, ToolChain.getTriple())));
5758
5759 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
5760 // as well.
Rafael Espindolac5151542012-04-09 23:53:34 +00005761 }
5762
Chandler Carruth700d4e42013-01-13 11:46:33 +00005763
Nick Lewyckye276cfc2012-08-17 03:39:16 +00005764 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5765 CmdArgs.push_back("--no-demangle");
5766
Rafael Espindolac1da9812010-11-07 20:14:31 +00005767 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5768
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00005769 SanitizerArgs Sanitize(D, Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00005770
Eric Christopher6716d942012-11-29 18:51:05 +00005771 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00005772 if (Sanitize.needsUbsanRt())
5773 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Eric Christopher6716d942012-11-29 18:51:05 +00005774 if (Sanitize.needsAsanRt())
5775 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5776 if (Sanitize.needsTsanRt())
5777 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00005778 if (Sanitize.needsMsanRt())
5779 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00005780
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005781 if (D.CCCIsCXX &&
5782 !Args.hasArg(options::OPT_nostdlib) &&
5783 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00005784 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5785 !Args.hasArg(options::OPT_static);
5786 if (OnlyLibstdcxxStatic)
5787 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005788 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00005789 if (OnlyLibstdcxxStatic)
5790 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00005791 CmdArgs.push_back("-lm");
5792 }
5793
Rafael Espindola89414b32010-11-12 03:00:39 +00005794 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005795 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5796 if (Args.hasArg(options::OPT_static))
5797 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00005798
Chandler Carruthdf96e022013-01-17 13:19:29 +00005799 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
5800 if (OpenMP) {
5801 CmdArgs.push_back("-lgomp");
5802
5803 // FIXME: Exclude this for platforms whith libgomp that doesn't require
5804 // librt. Most modern Linux platfroms require it, but some may not.
5805 CmdArgs.push_back("-lrt");
5806 }
5807
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005808 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00005809
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005810 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00005811 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00005812 CmdArgs.push_back("-lpthread");
5813
5814 CmdArgs.push_back("-lc");
5815
5816 if (Args.hasArg(options::OPT_static))
5817 CmdArgs.push_back("--end-group");
5818 else
5819 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5820 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00005821
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005822 if (!Args.hasArg(options::OPT_nostartfiles)) {
5823 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005824 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005825 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00005826 else if (Args.hasArg(options::OPT_pie))
5827 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005828 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005829 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00005830
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005831 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00005832 if (!isAndroid)
5833 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00005834 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00005835 }
5836
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005837 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005838
Rafael Espindolac1da9812010-11-07 20:14:31 +00005839 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5840}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005841
Eric Christopherc706c8e2013-02-05 07:29:57 +00005842void linuxtools::SplitDebug::ConstructJob(Compilation &C, const JobAction &JA,
5843 const InputInfo &Output,
5844 const InputInfoList &Inputs,
5845 const ArgList &Args,
5846 const char *LinkingOutput) const {
5847 // Assert some invariants.
5848 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5849 const InputInfo &Input = Inputs[0];
5850 assert(Input.isFilename() && "Unexpected verify input");
5851
5852 ArgStringList ExtractArgs;
5853 ExtractArgs.push_back("--extract-dwo");
5854
5855 ArgStringList StripArgs;
5856 StripArgs.push_back("--strip-dwo");
5857
5858 // Grabbing the output of the earlier compile step.
5859 StripArgs.push_back(Input.getFilename());
5860 ExtractArgs.push_back(Input.getFilename());
5861
5862 // Add an output for the extract.
5863 SmallString<128> T(Inputs[0].getBaseInput());
5864 llvm::sys::path::replace_extension(T, "dwo");
5865 const char *OutFile = Args.MakeArgString(T);
5866 ExtractArgs.push_back(OutFile);
5867
5868 const char *Exec =
5869 Args.MakeArgString(getToolChain().GetProgramPath("objcopy"));
5870
5871 // First extract the dwo sections.
5872 C.addCommand(new Command(JA, *this, Exec, ExtractArgs));
5873
5874 // Then remove them from the original .o file.
5875 C.addCommand(new Command(JA, *this, Exec, StripArgs));
5876}
5877
Chris Lattner38e317d2010-07-07 16:01:42 +00005878void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005879 const InputInfo &Output,
5880 const InputInfoList &Inputs,
5881 const ArgList &Args,
5882 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005883 ArgStringList CmdArgs;
5884
5885 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5886 options::OPT_Xassembler);
5887
5888 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005889 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005890
5891 for (InputInfoList::const_iterator
5892 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5893 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005894 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00005895 }
5896
5897 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00005898 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005899 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005900}
5901
5902void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005903 const InputInfo &Output,
5904 const InputInfoList &Inputs,
5905 const ArgList &Args,
5906 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00005907 const Driver &D = getToolChain().getDriver();
5908 ArgStringList CmdArgs;
5909
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005910 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005911 CmdArgs.push_back("-o");
5912 CmdArgs.push_back(Output.getFilename());
5913 } else {
5914 assert(Output.isNothing() && "Invalid output.");
5915 }
5916
5917 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00005918 !Args.hasArg(options::OPT_nostartfiles)) {
5919 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5920 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5921 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5922 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5923 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005924
5925 Args.AddAllArgs(CmdArgs, options::OPT_L);
5926 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5927 Args.AddAllArgs(CmdArgs, options::OPT_e);
5928
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005929 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005930
Eli Friedman6d402dc2011-12-08 23:54:21 +00005931 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5932
Chris Lattner38e317d2010-07-07 16:01:42 +00005933 if (!Args.hasArg(options::OPT_nostdlib) &&
5934 !Args.hasArg(options::OPT_nodefaultlibs)) {
5935 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005936 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00005937 CmdArgs.push_back("-lm");
5938 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005939 }
5940
5941 if (!Args.hasArg(options::OPT_nostdlib) &&
5942 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00005943 if (Args.hasArg(options::OPT_pthread))
5944 CmdArgs.push_back("-lpthread");
5945 CmdArgs.push_back("-lc");
5946 CmdArgs.push_back("-lCompilerRT-Generic");
5947 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5948 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00005949 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005950 }
5951
Eli Friedman6d402dc2011-12-08 23:54:21 +00005952 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005953 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00005954}
5955
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005956/// DragonFly Tools
5957
5958// For now, DragonFly Assemble does just about the same as for
5959// FreeBSD, but this may change soon.
5960void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005961 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005962 const InputInfoList &Inputs,
5963 const ArgList &Args,
5964 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005965 ArgStringList CmdArgs;
5966
5967 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5968 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005969 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005970 CmdArgs.push_back("--32");
5971
5972 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5973 options::OPT_Xassembler);
5974
5975 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005976 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005977
5978 for (InputInfoList::const_iterator
5979 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5980 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005981 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005982 }
5983
5984 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005985 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005986 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005987}
5988
5989void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005990 const InputInfo &Output,
5991 const InputInfoList &Inputs,
5992 const ArgList &Args,
5993 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005994 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005995 ArgStringList CmdArgs;
5996
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005997 if (!D.SysRoot.empty())
5998 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5999
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006000 if (Args.hasArg(options::OPT_static)) {
6001 CmdArgs.push_back("-Bstatic");
6002 } else {
6003 if (Args.hasArg(options::OPT_shared))
6004 CmdArgs.push_back("-Bshareable");
6005 else {
6006 CmdArgs.push_back("-dynamic-linker");
6007 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6008 }
6009 }
6010
6011 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6012 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006013 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006014 CmdArgs.push_back("-m");
6015 CmdArgs.push_back("elf_i386");
6016 }
6017
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006018 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006019 CmdArgs.push_back("-o");
6020 CmdArgs.push_back(Output.getFilename());
6021 } else {
6022 assert(Output.isNothing() && "Invalid output.");
6023 }
6024
6025 if (!Args.hasArg(options::OPT_nostdlib) &&
6026 !Args.hasArg(options::OPT_nostartfiles)) {
6027 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006028 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006029 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006030 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006031 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006032 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006033 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006034 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00006035 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006036 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006037 CmdArgs.push_back(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006038 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006039 }
6040 }
6041
6042 Args.AddAllArgs(CmdArgs, options::OPT_L);
6043 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6044 Args.AddAllArgs(CmdArgs, options::OPT_e);
6045
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006046 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006047
6048 if (!Args.hasArg(options::OPT_nostdlib) &&
6049 !Args.hasArg(options::OPT_nodefaultlibs)) {
6050 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6051 // rpaths
6052 CmdArgs.push_back("-L/usr/lib/gcc41");
6053
6054 if (!Args.hasArg(options::OPT_static)) {
6055 CmdArgs.push_back("-rpath");
6056 CmdArgs.push_back("/usr/lib/gcc41");
6057
6058 CmdArgs.push_back("-rpath-link");
6059 CmdArgs.push_back("/usr/lib/gcc41");
6060
6061 CmdArgs.push_back("-rpath");
6062 CmdArgs.push_back("/usr/lib");
6063
6064 CmdArgs.push_back("-rpath-link");
6065 CmdArgs.push_back("/usr/lib");
6066 }
6067
Rafael Espindola405861d2010-07-20 12:59:03 +00006068 if (D.CCCIsCXX) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006069 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006070 CmdArgs.push_back("-lm");
6071 }
6072
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006073 if (Args.hasArg(options::OPT_shared)) {
6074 CmdArgs.push_back("-lgcc_pic");
6075 } else {
6076 CmdArgs.push_back("-lgcc");
6077 }
6078
6079
6080 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006081 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006082
6083 if (!Args.hasArg(options::OPT_nolibc)) {
6084 CmdArgs.push_back("-lc");
6085 }
6086
6087 if (Args.hasArg(options::OPT_shared)) {
6088 CmdArgs.push_back("-lgcc_pic");
6089 } else {
6090 CmdArgs.push_back("-lgcc");
6091 }
6092 }
6093
6094 if (!Args.hasArg(options::OPT_nostdlib) &&
6095 !Args.hasArg(options::OPT_nostartfiles)) {
6096 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006097 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006098 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006099 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006100 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006101 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006102 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006103 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006104 }
6105
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006106 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006107
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006108 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006109 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006111}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006112
6113void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6114 const InputInfo &Output,
6115 const InputInfoList &Inputs,
6116 const ArgList &Args,
6117 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006118 ArgStringList CmdArgs;
6119
6120 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006121 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6122 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006123 } else {
6124 assert(Output.isNothing() && "Invalid output.");
6125 }
6126
6127 if (!Args.hasArg(options::OPT_nostdlib) &&
6128 !Args.hasArg(options::OPT_nostartfiles)) {
6129 CmdArgs.push_back("-defaultlib:libcmt");
6130 }
6131
6132 CmdArgs.push_back("-nologo");
6133
Michael J. Spencera2284f52012-06-18 16:56:04 +00006134 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6135
6136 // Add filenames immediately.
6137 for (InputInfoList::const_iterator
6138 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6139 if (it->isFilename())
6140 CmdArgs.push_back(it->getFilename());
6141 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006142
6143 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006144 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006145 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6146}