blob: 00ec3b09688724e283fde0d949e9bf868aa17843 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-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 Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Rafael Espindola0df9e162013-11-05 21:43:54 +000024#include "clang/Sema/SemaDiagnostic.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000032#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000033#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000034#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000035#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000036#include "llvm/Support/Path.h"
Rafael Espindola04b3fc42013-06-25 14:29:51 +000037#include "llvm/Support/Program.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000039#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000040#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000041
Daniel Dunbar1a093d22009-03-18 06:00:36 +000042using namespace clang::driver;
43using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000045using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000046
Daniel Dunbar64198ef2009-09-10 01:21:05 +000047/// CheckPreprocessingOptions - Perform some validation of preprocessing
48/// arguments that is shared with gcc.
49static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
50 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000051 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000053 << A->getAsString(Args) << "-E";
54}
55
Daniel Dunbar4eadb602009-09-10 01:21:12 +000056/// CheckCodeGenerationOptions - Perform some validation of code generation
57/// arguments that is shared with gcc.
58static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
59 // In gcc, only ARM checks this, but it seems reasonable to check universally.
60 if (Args.hasArg(options::OPT_static))
61 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
62 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000063 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000064 << A->getAsString(Args) << "-static";
65}
66
Chris Lattnerbf2803f2010-03-29 17:55:58 +000067// Quote target names for inclusion in GNU Make dependency files.
68// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000069static void QuoteTarget(StringRef Target,
70 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000071 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
72 switch (Target[i]) {
73 case ' ':
74 case '\t':
75 // Escape the preceding backslashes
76 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
77 Res.push_back('\\');
78
79 // Escape the space/tab
80 Res.push_back('\\');
81 break;
82 case '$':
83 Res.push_back('$');
84 break;
85 case '#':
86 Res.push_back('\\');
87 break;
88 default:
89 break;
90 }
91
92 Res.push_back(Target[i]);
93 }
94}
95
Bill Wendlingc0938f32012-03-12 22:10:06 +000096static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000097 ArgStringList &CmdArgs,
98 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000099 const char *EnvVar) {
100 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000101 bool CombinedArg = false;
102
Bill Wendling281ca292012-03-12 21:22:35 +0000103 if (!DirList)
104 return; // Nothing to do.
105
Chad Rosier616e8a52012-10-30 21:42:09 +0000106 StringRef Name(ArgName);
107 if (Name.equals("-I") || Name.equals("-L"))
108 CombinedArg = true;
109
Bill Wendling281ca292012-03-12 21:22:35 +0000110 StringRef Dirs(DirList);
111 if (Dirs.empty()) // Empty string should not add '.'.
112 return;
113
114 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000115 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000116 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000117 if (CombinedArg) {
118 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
119 } else {
120 CmdArgs.push_back(ArgName);
121 CmdArgs.push_back(".");
122 }
Bill Wendling281ca292012-03-12 21:22:35 +0000123 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000124 if (CombinedArg) {
125 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
126 } else {
127 CmdArgs.push_back(ArgName);
128 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
129 }
Bill Wendling281ca292012-03-12 21:22:35 +0000130 }
Nico Weber89355782012-03-19 15:00:03 +0000131 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000132 }
133
134 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000135 if (CombinedArg) {
136 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
137 } else {
138 CmdArgs.push_back(ArgName);
139 CmdArgs.push_back(".");
140 }
Bill Wendling281ca292012-03-12 21:22:35 +0000141 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000142 if (CombinedArg) {
143 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
144 } else {
145 CmdArgs.push_back(ArgName);
146 CmdArgs.push_back(Args.MakeArgString(Dirs));
147 }
Bill Wendling281ca292012-03-12 21:22:35 +0000148 }
149}
150
Daniel Dunbar54423b22010-09-17 00:24:54 +0000151static void AddLinkerInputs(const ToolChain &TC,
152 const InputInfoList &Inputs, const ArgList &Args,
153 ArgStringList &CmdArgs) {
154 const Driver &D = TC.getDriver();
155
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000156 // Add extra linker input arguments which are not treated as inputs
157 // (constructed via -Xarch_).
158 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
159
Daniel Dunbar54423b22010-09-17 00:24:54 +0000160 for (InputInfoList::const_iterator
161 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
162 const InputInfo &II = *it;
163
164 if (!TC.HasNativeLLVMSupport()) {
165 // Don't try to pass LLVM inputs unless we have native support.
166 if (II.getType() == types::TY_LLVM_IR ||
167 II.getType() == types::TY_LTO_IR ||
168 II.getType() == types::TY_LLVM_BC ||
169 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000170 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000171 << TC.getTripleString();
172 }
173
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000174 // Add filenames immediately.
175 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000176 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000177 continue;
178 }
179
180 // Otherwise, this is a linker input argument.
181 const Arg &A = II.getInputArg();
182
183 // Handle reserved library options.
184 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000185 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000186 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
187 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000188 } else
189 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000190 }
Bill Wendling281ca292012-03-12 21:22:35 +0000191
192 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000193 // and only supported on native toolchains.
194 if (!TC.isCrossCompiling())
195 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000196}
197
John McCall31168b02011-06-15 23:02:42 +0000198/// \brief Determine whether Objective-C automated reference counting is
199/// enabled.
200static bool isObjCAutoRefCount(const ArgList &Args) {
201 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
202}
203
Ted Kremeneke65b0862012-03-06 20:05:56 +0000204/// \brief Determine whether we are linking the ObjC runtime.
205static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000206 if (isObjCAutoRefCount(Args)) {
207 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000208 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000209 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000210 return Args.hasArg(options::OPT_fobjc_link_runtime);
211}
212
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000213static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000214 ArgStringList &CmdArgs,
215 llvm::Triple Triple) {
216 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
217 Args.hasArg(options::OPT_fprofile_generate) ||
218 Args.hasArg(options::OPT_fcreate_profile) ||
219 Args.hasArg(options::OPT_coverage)))
220 return;
221
222 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
223 // the link line. We cannot do the same thing because unlike gcov there is a
224 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
225 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000226 std::string ProfileRT =
227 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000228
Bill Wendling08760582011-06-27 19:15:03 +0000229 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000230}
231
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000232static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000233 // Don't forward inputs from the original command line. They are added from
234 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000235 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000236 !O.hasFlag(options::DriverOption) &&
237 !O.hasFlag(options::LinkerInput);
238}
239
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000240void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000241 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000242 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000243 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000244 ArgStringList &CmdArgs,
245 const InputInfo &Output,
246 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000247 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000248
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000249 CheckPreprocessingOptions(D, Args);
250
251 Args.AddLastArg(CmdArgs, options::OPT_C);
252 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
254 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000255 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000256 (A = Args.getLastArg(options::OPT_MD)) ||
257 (A = Args.getLastArg(options::OPT_MMD))) {
258 // Determine the output location.
259 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000260 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000261 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000262 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000263 } else if (Output.getType() == types::TY_Dependencies) {
264 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000265 } else if (A->getOption().matches(options::OPT_M) ||
266 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000267 DepFile = "-";
268 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000269 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000270 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000271 }
272 CmdArgs.push_back("-dependency-file");
273 CmdArgs.push_back(DepFile);
274
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000275 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
277 const char *DepTarget;
278
279 // If user provided -o, that is the dependency target, except
280 // when we are only generating a dependency file.
281 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
282 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000283 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000284 } else {
285 // Otherwise derive from the base input.
286 //
287 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000288 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000289 llvm::sys::path::replace_extension(P, "o");
290 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000291 }
292
293 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000294 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000295 QuoteTarget(DepTarget, Quoted);
296 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 }
298
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000299 if (A->getOption().matches(options::OPT_M) ||
300 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 CmdArgs.push_back("-sys-header-deps");
302 }
303
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000304 if (Args.hasArg(options::OPT_MG)) {
305 if (!A || A->getOption().matches(options::OPT_MD) ||
306 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000307 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000308 CmdArgs.push_back("-MG");
309 }
310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000312
313 // Convert all -MQ <target> args to -MT <quoted target>
314 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
315 options::OPT_MQ),
316 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000317 const Arg *A = *it;
318 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000319
Daniel Dunbara442fd52010-06-11 22:00:13 +0000320 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000322 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000323 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000324 CmdArgs.push_back(Args.MakeArgString(Quoted));
325
326 // -MT flag - no change
327 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000328 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000329 }
330 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331
Douglas Gregor111af7d2009-04-18 00:34:01 +0000332 // Add -i* options, and automatically translate to
333 // -include-pch/-include-pth for transparent PCH support. It's
334 // wonky, but we include looking for .gch so we can support seamless
335 // replacement into a build system already set up to be generating
336 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000337 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000338 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
339 ie = Args.filtered_end(); it != ie; ++it) {
340 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341
342 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000343 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
344 RenderedImplicitInclude = true;
345
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000346 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000347 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000348
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000349 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000350 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000351 SmallString<128> P(A->getValue());
352 // We want the files to have a name like foo.h.pch. Add a dummy extension
353 // so that replace_extension does the right thing.
354 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000355 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000356 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000357 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000358 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000359 }
360
Douglas Gregor111af7d2009-04-18 00:34:01 +0000361 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000362 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000363 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000365 }
366
Douglas Gregor111af7d2009-04-18 00:34:01 +0000367 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000368 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000369 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000370 FoundPCH = UsePCH;
371 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000373 }
374
375 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000376 if (IsFirstImplicitInclude) {
377 A->claim();
378 if (UsePCH)
379 CmdArgs.push_back("-include-pch");
380 else
381 CmdArgs.push_back("-include-pth");
382 CmdArgs.push_back(Args.MakeArgString(P.str()));
383 continue;
384 } else {
385 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000386 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 << P.str() << A->getAsString(Args);
388 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000389 }
390 }
391
392 // Not translated, render as usual.
393 A->claim();
394 A->render(Args, CmdArgs);
395 }
396
397 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000398 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
399 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000400
401 // Add -Wp, and -Xassembler if using the preprocessor.
402
403 // FIXME: There is a very unfortunate problem here, some troubled
404 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
405 // really support that we would have to parse and then translate
406 // those options. :(
407 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
408 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000409
410 // -I- is a deprecated GCC feature, reject it.
411 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000412 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000413
414 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
415 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000416 StringRef sysroot = C.getSysRoot();
417 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418 if (!Args.hasArg(options::OPT_isysroot)) {
419 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000421 }
422 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000423
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000424 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000425 // FIXME: We should probably sink the logic for handling these from the
426 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000427 // CPATH - included following the user specified includes (but prior to
428 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000438
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000439 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000440 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000441 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000442
443 // Add system include arguments.
444 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000445}
446
Amara Emerson703da2e2013-10-31 09:32:33 +0000447/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
448//
449// FIXME: tblgen this.
450static std::string getAArch64TargetCPU(const ArgList &Args,
451 const llvm::Triple &Triple) {
452 // FIXME: Warn on inconsistent use of -mcpu and -march.
453
454 // If we have -mcpu=, use that.
455 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
456 StringRef MCPU = A->getValue();
457 // Handle -mcpu=native.
458 if (MCPU == "native")
459 return llvm::sys::getHostCPUName();
460 else
461 return MCPU;
462 }
463
464 return "generic";
465}
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467// FIXME: Move to target hook.
468static bool isSignedCharDefault(const llvm::Triple &Triple) {
469 switch (Triple.getArch()) {
470 default:
471 return true;
472
Tim Northover9bb857a2013-01-31 12:13:10 +0000473 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000474 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000475 case llvm::Triple::ppc:
476 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000477 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 return true;
479 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000480
Bill Schmidt778d3872013-07-26 01:36:11 +0000481 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000482 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000483 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000484 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000485 }
486}
487
Robert Lytton0e076492013-08-13 09:43:10 +0000488static bool isNoCommonDefault(const llvm::Triple &Triple) {
489 switch (Triple.getArch()) {
490 default:
491 return false;
492
493 case llvm::Triple::xcore:
494 return true;
495 }
496}
497
Chad Rosiercfbfc582012-04-04 20:51:35 +0000498// Handle -mfpu=.
499//
500// FIXME: Centralize feature selection, defaulting shouldn't be also in the
501// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000502static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
503 const ArgList &Args,
504 std::vector<const char *> &Features) {
505 StringRef FPU = A->getValue();
506 if (FPU == "fp-armv8") {
507 Features.push_back("+fp-armv8");
508 } else if (FPU == "neon-fp-armv8") {
509 Features.push_back("+fp-armv8");
510 Features.push_back("+neon");
511 } else if (FPU == "crypto-neon-fp-armv8") {
512 Features.push_back("+fp-armv8");
513 Features.push_back("+neon");
514 Features.push_back("+crypto");
515 } else if (FPU == "neon") {
516 Features.push_back("+neon");
517 } else if (FPU == "none") {
518 Features.push_back("-fp-armv8");
519 Features.push_back("-crypto");
520 Features.push_back("-neon");
521 } else
522 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
523}
524
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000525// Handle -mhwdiv=.
526static void getARMHWDivFeatures(const Driver &D, const Arg *A,
527 const ArgList &Args,
528 std::vector<const char *> &Features) {
529 StringRef HWDiv = A->getValue();
530 if (HWDiv == "arm") {
531 Features.push_back("+hwdiv-arm");
532 Features.push_back("-hwdiv");
533 } else if (HWDiv == "thumb") {
534 Features.push_back("-hwdiv-arm");
535 Features.push_back("+hwdiv");
536 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
537 Features.push_back("+hwdiv-arm");
538 Features.push_back("+hwdiv");
539 } else if (HWDiv == "none") {
540 Features.push_back("-hwdiv-arm");
541 Features.push_back("-hwdiv");
542 } else
543 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
544}
545
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000546// Handle -mfpu=.
547//
548// FIXME: Centralize feature selection, defaulting shouldn't be also in the
549// frontend target.
550static void getARMFPUFeatures(const Driver &D, const Arg *A,
551 const ArgList &Args,
552 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000553 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000554
555 // Set the target features based on the FPU.
556 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
557 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000558 Features.push_back("-vfp2");
559 Features.push_back("-vfp3");
560 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000561 } else if (FPU == "vfp") {
562 Features.push_back("+vfp2");
563 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000564 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000565 Features.push_back("+vfp3");
566 Features.push_back("+d16");
567 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000568 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000569 Features.push_back("+vfp3");
570 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000571 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
572 Features.push_back("+vfp4");
573 Features.push_back("+d16");
574 Features.push_back("-neon");
575 } else if (FPU == "vfp4" || FPU == "vfpv4") {
576 Features.push_back("+vfp4");
577 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000578 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000579 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000580 Features.push_back("-neon");
581 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000582 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000583 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000584 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000585 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000586 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000587 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("+neon");
589 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000590 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000591 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000592 } else if (FPU == "none") {
593 Features.push_back("-vfp2");
594 Features.push_back("-vfp3");
595 Features.push_back("-vfp4");
596 Features.push_back("-fp-armv8");
597 Features.push_back("-crypto");
598 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000599 } else
600 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
601}
602
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000603// Select the float ABI as determined by -msoft-float, -mhard-float, and
604// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000605StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
606 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000607 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000608 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
609 options::OPT_mhard_float,
610 options::OPT_mfloat_abi_EQ)) {
611 if (A->getOption().matches(options::OPT_msoft_float))
612 FloatABI = "soft";
613 else if (A->getOption().matches(options::OPT_mhard_float))
614 FloatABI = "hard";
615 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000616 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000617 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000618 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000619 << A->getAsString(Args);
620 FloatABI = "soft";
621 }
622 }
623 }
624
625 // If unspecified, choose the default based on the platform.
626 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000627 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000628 case llvm::Triple::Darwin:
629 case llvm::Triple::MacOSX:
630 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 // Darwin defaults to "softfp" for v6 and v7.
632 //
633 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000634 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000635 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000636 if (StringRef(ArchName).startswith("v6") ||
637 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000638 FloatABI = "softfp";
639 else
640 FloatABI = "soft";
641 break;
642 }
643
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000644 case llvm::Triple::FreeBSD:
645 // FreeBSD defaults to soft float
646 FloatABI = "soft";
647 break;
648
Daniel Dunbar78485922009-09-10 23:00:09 +0000649 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000650 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000651 case llvm::Triple::GNUEABIHF:
652 FloatABI = "hard";
653 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000654 case llvm::Triple::GNUEABI:
655 FloatABI = "softfp";
656 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000657 case llvm::Triple::EABIHF:
658 FloatABI = "hard";
659 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000660 case llvm::Triple::EABI:
661 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
662 FloatABI = "softfp";
663 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000664 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000665 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000666 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000667 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000668 FloatABI = "softfp";
669 else
670 FloatABI = "soft";
671 break;
672 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000673 default:
674 // Assume "soft", but warn the user we are guessing.
675 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000676 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000677 break;
678 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000679 }
680 }
681
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000682 return FloatABI;
683}
684
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000685static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
686 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000687 std::vector<const char *> &Features,
688 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000689 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000690 if (!ForAS) {
691 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
692 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
693 // stripped out by the ARM target. We should probably pass this a new
694 // -target-option, which is handled by the -cc1/-cc1as invocation.
695 //
696 // FIXME2: For consistency, it would be ideal if we set up the target
697 // machine state the same when using the frontend or the assembler. We don't
698 // currently do that for the assembler, we pass the options directly to the
699 // backend and never even instantiate the frontend TargetInfo. If we did,
700 // and used its handleTargetFeatures hook, then we could ensure the
701 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000702
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000703 // Use software floating point operations?
704 if (FloatABI == "soft")
705 Features.push_back("+soft-float");
706
707 // Use software floating point argument passing?
708 if (FloatABI != "hard")
709 Features.push_back("+soft-float-abi");
710 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000711
712 // Honor -mfpu=.
713 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000714 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000715 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
716 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000717
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000718 // Setting -msoft-float effectively disables NEON because of the GCC
719 // implementation, although the same isn't true of VFP or VFP3.
720 if (FloatABI == "soft")
721 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000722
723 // En/disable crc
724 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
725 options::OPT_mnocrc)) {
726 if (A->getOption().matches(options::OPT_mcrc))
727 Features.push_back("+crc");
728 else
729 Features.push_back("-crc");
730 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000731}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000732
733void Clang::AddARMTargetArgs(const ArgList &Args,
734 ArgStringList &CmdArgs,
735 bool KernelOrKext) const {
736 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000737 // Get the effective triple, which takes into account the deployment target.
738 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
739 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000740 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000741
742 // Select the ABI to use.
743 //
744 // FIXME: Support -meabi.
745 const char *ABIName = 0;
746 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000747 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000748 } else if (Triple.isOSDarwin()) {
749 // The backend is hardwired to assume AAPCS for M-class processors, ensure
750 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000751 if (Triple.getEnvironment() == llvm::Triple::EABI ||
752 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000753 ABIName = "aapcs";
754 } else {
755 ABIName = "apcs-gnu";
756 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000757 } else {
758 // Select the default based on the platform.
759 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000760 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000761 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000762 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000763 ABIName = "aapcs-linux";
764 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000765 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000766 case llvm::Triple::EABI:
767 ABIName = "aapcs";
768 break;
769 default:
770 ABIName = "apcs-gnu";
771 }
772 }
773 CmdArgs.push_back("-target-abi");
774 CmdArgs.push_back(ABIName);
775
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000776 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000777 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000778 if (FloatABI == "soft") {
779 // Floating point operations and argument passing are soft.
780 //
781 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000782 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000783 CmdArgs.push_back("-mfloat-abi");
784 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000785 } else if (FloatABI == "softfp") {
786 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000787 CmdArgs.push_back("-mfloat-abi");
788 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000789 } else {
790 // Floating point operations and argument passing are hard.
791 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000792 CmdArgs.push_back("-mfloat-abi");
793 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000794 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000795
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000796 // Kernel code has more strict alignment requirements.
797 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000798 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000799 CmdArgs.push_back("-backend-option");
800 CmdArgs.push_back("-arm-long-calls");
801 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000802
Daniel Dunbar12100e22011-03-22 16:48:17 +0000803 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000804 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000805
806 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000807 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000808 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000809 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000810
811 // Setting -mno-global-merge disables the codegen global merge pass. Setting
812 // -mglobal-merge has no effect as the pass is enabled by default.
813 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
814 options::OPT_mno_global_merge)) {
815 if (A->getOption().matches(options::OPT_mno_global_merge))
816 CmdArgs.push_back("-mno-global-merge");
817 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000818
Bob Wilson9c8af452013-04-11 18:53:25 +0000819 if (!Args.hasFlag(options::OPT_mimplicit_float,
820 options::OPT_mno_implicit_float,
821 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000822 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000823
824 // llvm does not support reserving registers in general. There is support
825 // for reserving r9 on ARM though (defined as a platform-specific register
826 // in ARM EABI).
827 if (Args.hasArg(options::OPT_ffixed_r9)) {
828 CmdArgs.push_back("-backend-option");
829 CmdArgs.push_back("-arm-reserve-r9");
830 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000831}
832
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000833// Get CPU and ABI names. They are not independent
834// so we have to calculate them together.
835static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000836 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000837 StringRef &CPUName,
838 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000839 const char *DefMips32CPU = "mips32";
840 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000841
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000842 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000843 options::OPT_mcpu_EQ))
844 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000845
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000846 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000847 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000848 // Convert a GNU style Mips ABI name to the name
849 // accepted by LLVM Mips backend.
850 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
851 .Case("32", "o32")
852 .Case("64", "n64")
853 .Default(ABIName);
854 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000855
856 // Setup default CPU and ABI names.
857 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000858 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000859 default:
860 llvm_unreachable("Unexpected triple arch name");
861 case llvm::Triple::mips:
862 case llvm::Triple::mipsel:
863 CPUName = DefMips32CPU;
864 break;
865 case llvm::Triple::mips64:
866 case llvm::Triple::mips64el:
867 CPUName = DefMips64CPU;
868 break;
869 }
870 }
871
872 if (!ABIName.empty()) {
873 // Deduce CPU name from ABI name.
874 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000875 .Cases("32", "o32", "eabi", DefMips32CPU)
876 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000877 .Default("");
878 }
879 else if (!CPUName.empty()) {
880 // Deduce ABI name from CPU name.
881 ABIName = llvm::StringSwitch<const char *>(CPUName)
882 .Cases("mips32", "mips32r2", "o32")
883 .Cases("mips64", "mips64r2", "n64")
884 .Default("");
885 }
886
887 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000888}
889
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000890// Convert ABI name to the GNU tools acceptable variant.
891static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
892 return llvm::StringSwitch<llvm::StringRef>(ABI)
893 .Case("o32", "32")
894 .Case("n64", "64")
895 .Default(ABI);
896}
897
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000898// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
899// and -mfloat-abi=.
900static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000901 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000902 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000903 options::OPT_mhard_float,
904 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000905 if (A->getOption().matches(options::OPT_msoft_float))
906 FloatABI = "soft";
907 else if (A->getOption().matches(options::OPT_mhard_float))
908 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000909 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000910 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000911 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000912 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000913 FloatABI = "hard";
914 }
915 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000916 }
917
918 // If unspecified, choose the default based on the platform.
919 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000920 // Assume "hard", because it's a default value used by gcc.
921 // When we start to recognize specific target MIPS processors,
922 // we will be able to select the default more correctly.
923 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000924 }
925
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000926 return FloatABI;
927}
928
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000929static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000930 std::vector<const char *> &Features,
931 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000932 StringRef FeatureName) {
933 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000934 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000935 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000936 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000938 }
939}
940
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000941static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
942 std::vector<const char *> &Features) {
943 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000944 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000945 // FIXME: Note, this is a hack. We need to pass the selected float
946 // mode to the MipsTargetInfoBase to define appropriate macros there.
947 // Now it is the only method.
948 Features.push_back("+soft-float");
949 }
950
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000951 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
952 if (StringRef(A->getValue()) == "2008")
953 Features.push_back("+nan2008");
954 }
955
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000956 AddTargetFeature(Args, Features, options::OPT_msingle_float,
957 options::OPT_mdouble_float, "single-float");
958 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
959 "mips16");
960 AddTargetFeature(Args, Features, options::OPT_mmicromips,
961 options::OPT_mno_micromips, "micromips");
962 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
963 "dsp");
964 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
965 "dspr2");
966 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
967 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +0000968 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
969 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000970}
971
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000972void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000973 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000974 const Driver &D = getToolChain().getDriver();
975 StringRef CPUName;
976 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000977 const llvm::Triple &Triple = getToolChain().getTriple();
978 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000979
980 CmdArgs.push_back("-target-abi");
981 CmdArgs.push_back(ABIName.data());
982
983 StringRef FloatABI = getMipsFloatABI(D, Args);
984
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000985 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +0000986 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000987 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000988 CmdArgs.push_back("-mfloat-abi");
989 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000990 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000991 else {
992 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000993 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000996 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000997
Simon Atanasyan2eaec512012-12-01 18:27:21 +0000998 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
999 if (A->getOption().matches(options::OPT_mxgot)) {
1000 CmdArgs.push_back("-mllvm");
1001 CmdArgs.push_back("-mxgot");
1002 }
1003 }
1004
Simon Atanasyanc580b322013-05-11 06:33:44 +00001005 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1006 options::OPT_mno_ldc1_sdc1)) {
1007 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1008 CmdArgs.push_back("-mllvm");
1009 CmdArgs.push_back("-mno-ldc1-sdc1");
1010 }
1011 }
1012
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001013 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1014 options::OPT_mno_check_zero_division)) {
1015 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1016 CmdArgs.push_back("-mllvm");
1017 CmdArgs.push_back("-mno-check-zero-division");
1018 }
1019 }
1020
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001021 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001022 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001023 CmdArgs.push_back("-mllvm");
1024 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1025 A->claim();
1026 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001027}
1028
Hal Finkel8eb59282012-06-11 22:35:19 +00001029/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1030static std::string getPPCTargetCPU(const ArgList &Args) {
1031 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001032 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001033
1034 if (CPUName == "native") {
1035 std::string CPU = llvm::sys::getHostCPUName();
1036 if (!CPU.empty() && CPU != "generic")
1037 return CPU;
1038 else
1039 return "";
1040 }
1041
1042 return llvm::StringSwitch<const char *>(CPUName)
1043 .Case("common", "generic")
1044 .Case("440", "440")
1045 .Case("440fp", "440")
1046 .Case("450", "450")
1047 .Case("601", "601")
1048 .Case("602", "602")
1049 .Case("603", "603")
1050 .Case("603e", "603e")
1051 .Case("603ev", "603ev")
1052 .Case("604", "604")
1053 .Case("604e", "604e")
1054 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001055 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001056 .Case("G3", "g3")
1057 .Case("7400", "7400")
1058 .Case("G4", "g4")
1059 .Case("7450", "7450")
1060 .Case("G4+", "g4+")
1061 .Case("750", "750")
1062 .Case("970", "970")
1063 .Case("G5", "g5")
1064 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001065 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001066 .Case("e500mc", "e500mc")
1067 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 .Case("power3", "pwr3")
1069 .Case("power4", "pwr4")
1070 .Case("power5", "pwr5")
1071 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001072 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001073 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001074 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001075 .Case("pwr3", "pwr3")
1076 .Case("pwr4", "pwr4")
1077 .Case("pwr5", "pwr5")
1078 .Case("pwr5x", "pwr5x")
1079 .Case("pwr6", "pwr6")
1080 .Case("pwr6x", "pwr6x")
1081 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001082 .Case("powerpc", "ppc")
1083 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001084 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001085 .Default("");
1086 }
1087
1088 return "";
1089}
1090
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001091static void getPPCTargetFeatures(const ArgList &Args,
1092 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001093 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1094 ie = Args.filtered_end();
1095 it != ie; ++it) {
1096 StringRef Name = (*it)->getOption().getName();
1097 (*it)->claim();
1098
1099 // Skip over "-m".
1100 assert(Name.startswith("m") && "Invalid feature name.");
1101 Name = Name.substr(1);
1102
1103 bool IsNegative = Name.startswith("no-");
1104 if (IsNegative)
1105 Name = Name.substr(3);
1106
1107 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1108 // pass the correct option to the backend while calling the frontend
1109 // option the same.
1110 // TODO: Change the LLVM backend option maybe?
1111 if (Name == "mfcrf")
1112 Name = "mfocrf";
1113
1114 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1115 }
1116
1117 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001118 AddTargetFeature(Args, Features, options::OPT_faltivec,
1119 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001120}
1121
Tom Stellard6674c702013-04-01 20:56:53 +00001122/// Get the (LLVM) name of the R600 gpu we are targeting.
1123static std::string getR600TargetGPU(const ArgList &Args) {
1124 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001125 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001126 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001127 .Cases("rv630", "rv635", "r600")
1128 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001129 .Case("rv740", "rv770")
1130 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001131 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001132 .Case("hemlock", "cypress")
1133 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001134 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001135 }
1136 return "";
1137}
1138
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001139static void getSparcTargetFeatures(const ArgList &Args,
1140 std::vector<const char *> Features) {
1141 bool SoftFloatABI = true;
1142 if (Arg *A =
1143 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1144 if (A->getOption().matches(options::OPT_mhard_float))
1145 SoftFloatABI = false;
1146 }
1147 if (SoftFloatABI)
1148 Features.push_back("+soft-float");
1149}
1150
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001151void Clang::AddSparcTargetArgs(const ArgList &Args,
1152 ArgStringList &CmdArgs) const {
1153 const Driver &D = getToolChain().getDriver();
1154
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001155 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001156 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001157 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1158 options::OPT_mhard_float)) {
1159 if (A->getOption().matches(options::OPT_msoft_float))
1160 FloatABI = "soft";
1161 else if (A->getOption().matches(options::OPT_mhard_float))
1162 FloatABI = "hard";
1163 }
1164
1165 // If unspecified, choose the default based on the platform.
1166 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001167 // Assume "soft", but warn the user we are guessing.
1168 FloatABI = "soft";
1169 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001170 }
1171
1172 if (FloatABI == "soft") {
1173 // Floating point operations and argument passing are soft.
1174 //
1175 // FIXME: This changes CPP defines, we need -target-soft-float.
1176 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001177 } else {
1178 assert(FloatABI == "hard" && "Invalid float abi!");
1179 CmdArgs.push_back("-mhard-float");
1180 }
1181}
1182
Richard Sandiford4652d892013-07-19 16:51:51 +00001183static const char *getSystemZTargetCPU(const ArgList &Args) {
1184 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1185 return A->getValue();
1186 return "z10";
1187}
1188
Chandler Carruth953fb082013-01-13 11:46:33 +00001189static const char *getX86TargetCPU(const ArgList &Args,
1190 const llvm::Triple &Triple) {
1191 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001192 if (StringRef(A->getValue()) != "native") {
1193 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1194 return "core-avx2";
1195
Chandler Carruth953fb082013-01-13 11:46:33 +00001196 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001197 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001198
1199 // FIXME: Reject attempts to use -march=native unless the target matches
1200 // the host.
1201 //
1202 // FIXME: We should also incorporate the detected target features for use
1203 // with -native.
1204 std::string CPU = llvm::sys::getHostCPUName();
1205 if (!CPU.empty() && CPU != "generic")
1206 return Args.MakeArgString(CPU);
1207 }
1208
1209 // Select the default CPU if none was given (or detection failed).
1210
1211 if (Triple.getArch() != llvm::Triple::x86_64 &&
1212 Triple.getArch() != llvm::Triple::x86)
1213 return 0; // This routine is only handling x86 targets.
1214
1215 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1216
1217 // FIXME: Need target hooks.
Jim Grosbach82eee262013-11-16 00:53:35 +00001218 if (Triple.isOSDarwin()) {
1219 if (Triple.getArchName() == "x86_64h")
1220 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001221 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001222 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001223
Chandler Carruth953fb082013-01-13 11:46:33 +00001224 // All x86 devices running Android have core2 as their common
1225 // denominator. This makes a better choice than pentium4.
1226 if (Triple.getEnvironment() == llvm::Triple::Android)
1227 return "core2";
1228
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001229 // Everything else goes to x86-64 in 64-bit mode.
1230 if (Is64Bit)
1231 return "x86-64";
1232
1233 switch (Triple.getOS()) {
1234 case llvm::Triple::FreeBSD:
1235 case llvm::Triple::NetBSD:
1236 case llvm::Triple::OpenBSD:
1237 return "i486";
1238 case llvm::Triple::Haiku:
1239 return "i586";
1240 case llvm::Triple::Bitrig:
1241 return "i686";
1242 default:
1243 // Fallback to p4.
1244 return "pentium4";
1245 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001246}
1247
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001248static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1249 switch(T.getArch()) {
1250 default:
1251 return "";
1252
Amara Emerson703da2e2013-10-31 09:32:33 +00001253 case llvm::Triple::aarch64:
1254 return getAArch64TargetCPU(Args, T);
1255
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001256 case llvm::Triple::arm:
1257 case llvm::Triple::thumb:
Bernard Ogden31561762013-12-12 13:27:11 +00001258 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001259
1260 case llvm::Triple::mips:
1261 case llvm::Triple::mipsel:
1262 case llvm::Triple::mips64:
1263 case llvm::Triple::mips64el: {
1264 StringRef CPUName;
1265 StringRef ABIName;
1266 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1267 return CPUName;
1268 }
1269
1270 case llvm::Triple::ppc:
1271 case llvm::Triple::ppc64:
1272 case llvm::Triple::ppc64le: {
1273 std::string TargetCPUName = getPPCTargetCPU(Args);
1274 // LLVM may default to generating code for the native CPU,
1275 // but, like gcc, we default to a more generic option for
1276 // each architecture. (except on Darwin)
1277 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1278 if (T.getArch() == llvm::Triple::ppc64)
1279 TargetCPUName = "ppc64";
1280 else if (T.getArch() == llvm::Triple::ppc64le)
1281 TargetCPUName = "ppc64le";
1282 else
1283 TargetCPUName = "ppc";
1284 }
1285 return TargetCPUName;
1286 }
1287
1288 case llvm::Triple::sparc:
1289 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1290 return A->getValue();
1291 return "";
1292
1293 case llvm::Triple::x86:
1294 case llvm::Triple::x86_64:
1295 return getX86TargetCPU(Args, T);
1296
1297 case llvm::Triple::hexagon:
1298 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1299
1300 case llvm::Triple::systemz:
1301 return getSystemZTargetCPU(Args);
1302
1303 case llvm::Triple::r600:
1304 return getR600TargetGPU(Args);
1305 }
1306}
1307
Alp Tokerce365ca2013-12-02 12:43:03 +00001308static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1309 ArgStringList &CmdArgs) {
1310 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1311 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1312 // forward.
1313 CmdArgs.push_back("-plugin");
1314 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1315 CmdArgs.push_back(Args.MakeArgString(Plugin));
1316
1317 // Try to pass driver level flags relevant to LTO code generation down to
1318 // the plugin.
1319
1320 // Handle flags for selecting CPU variants.
1321 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1322 if (!CPU.empty())
1323 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1324}
1325
Jim Grosbach82eee262013-11-16 00:53:35 +00001326static void getX86TargetFeatures(const llvm::Triple &Triple,
1327 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001328 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001329 if (Triple.getArchName() == "x86_64h") {
1330 // x86_64h implies quite a few of the more modern subtarget features
1331 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1332 Features.push_back("-rdrnd");
1333 Features.push_back("-aes");
1334 Features.push_back("-pclmul");
1335 Features.push_back("-rtm");
1336 Features.push_back("-hle");
1337 Features.push_back("-fsgsbase");
1338 }
1339
1340 // Now add any that the user explicitly requested on the command line,
1341 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001342 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1343 ie = Args.filtered_end();
1344 it != ie; ++it) {
1345 StringRef Name = (*it)->getOption().getName();
1346 (*it)->claim();
1347
1348 // Skip over "-m".
1349 assert(Name.startswith("m") && "Invalid feature name.");
1350 Name = Name.substr(1);
1351
1352 bool IsNegative = Name.startswith("no-");
1353 if (IsNegative)
1354 Name = Name.substr(3);
1355
1356 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1357 }
1358}
1359
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001360void Clang::AddX86TargetArgs(const ArgList &Args,
1361 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001362 if (!Args.hasFlag(options::OPT_mred_zone,
1363 options::OPT_mno_red_zone,
1364 true) ||
1365 Args.hasArg(options::OPT_mkernel) ||
1366 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001367 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001368
Bob Wilson2616e2e2013-02-10 16:01:41 +00001369 // Default to avoid implicit floating-point for kernel/kext code, but allow
1370 // that to be overridden with -mno-soft-float.
1371 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1372 Args.hasArg(options::OPT_fapple_kext));
1373 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1374 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001375 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001376 options::OPT_mno_implicit_float)) {
1377 const Option &O = A->getOption();
1378 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1379 O.matches(options::OPT_msoft_float));
1380 }
1381 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001382 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001383}
1384
Matthew Curtise8f80a12012-12-06 17:49:03 +00001385static inline bool HasPICArg(const ArgList &Args) {
1386 return Args.hasArg(options::OPT_fPIC)
1387 || Args.hasArg(options::OPT_fpic);
1388}
1389
1390static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1391 return Args.getLastArg(options::OPT_G,
1392 options::OPT_G_EQ,
1393 options::OPT_msmall_data_threshold_EQ);
1394}
1395
1396static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1397 std::string value;
1398 if (HasPICArg(Args))
1399 value = "0";
1400 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1401 value = A->getValue();
1402 A->claim();
1403 }
1404 return value;
1405}
1406
Tony Linthicum76329bf2011-12-12 21:14:55 +00001407void Clang::AddHexagonTargetArgs(const ArgList &Args,
1408 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001409 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001410 CmdArgs.push_back("-mqdsp6-compat");
1411 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001412
Matthew Curtise8f80a12012-12-06 17:49:03 +00001413 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1414 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001415 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001416 CmdArgs.push_back(Args.MakeArgString(
1417 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001418 }
1419
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001420 if (!Args.hasArg(options::OPT_fno_short_enums))
1421 CmdArgs.push_back("-fshort-enums");
1422 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1423 CmdArgs.push_back ("-mllvm");
1424 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1425 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001426 CmdArgs.push_back ("-mllvm");
1427 CmdArgs.push_back ("-machine-sink-split=0");
1428}
1429
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001430static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1431 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001432 // Honor -mfpu=.
1433 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001434 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001435}
1436
1437static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001438 const ArgList &Args, ArgStringList &CmdArgs,
1439 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001440 std::vector<const char *> Features;
1441 switch (Triple.getArch()) {
1442 default:
1443 break;
1444 case llvm::Triple::mips:
1445 case llvm::Triple::mipsel:
1446 case llvm::Triple::mips64:
1447 case llvm::Triple::mips64el:
1448 getMIPSTargetFeatures(D, Args, Features);
1449 break;
1450
1451 case llvm::Triple::arm:
1452 case llvm::Triple::thumb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001453 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001454 break;
1455
1456 case llvm::Triple::ppc:
1457 case llvm::Triple::ppc64:
1458 case llvm::Triple::ppc64le:
1459 getPPCTargetFeatures(Args, Features);
1460 break;
1461 case llvm::Triple::sparc:
1462 getSparcTargetFeatures(Args, Features);
1463 break;
1464 case llvm::Triple::aarch64:
1465 getAArch64TargetFeatures(D, Args, Features);
1466 break;
1467 case llvm::Triple::x86:
1468 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001469 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001470 break;
1471 }
Rafael Espindola43964802013-08-21 17:34:32 +00001472
1473 // Find the last of each feature.
1474 llvm::StringMap<unsigned> LastOpt;
1475 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1476 const char *Name = Features[I];
1477 assert(Name[0] == '-' || Name[0] == '+');
1478 LastOpt[Name + 1] = I;
1479 }
1480
1481 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1482 // If this feature was overridden, ignore it.
1483 const char *Name = Features[I];
1484 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1485 assert(LastI != LastOpt.end());
1486 unsigned Last = LastI->second;
1487 if (Last != I)
1488 continue;
1489
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001490 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001491 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001492 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001493}
1494
Eric Christopher84fbdb42011-08-19 00:30:14 +00001495static bool
John McCall5fb5df92012-06-20 06:18:46 +00001496shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001497 const llvm::Triple &Triple) {
1498 // We use the zero-cost exception tables for Objective-C if the non-fragile
1499 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1500 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001501 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001502 return true;
1503
Bob Wilson83e723a2013-12-05 19:38:42 +00001504 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001505 return false;
1506
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001507 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001508 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001509 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001510}
1511
Anders Carlssone96ab552011-02-28 02:27:16 +00001512/// addExceptionArgs - Adds exception related arguments to the driver command
1513/// arguments. There's a master flag, -fexceptions and also language specific
1514/// flags to enable/disable C++ and Objective-C exceptions.
1515/// This makes it possible to for example disable C++ exceptions but enable
1516/// Objective-C exceptions.
1517static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1518 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001519 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001520 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001521 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001522 if (KernelOrKext) {
1523 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1524 // arguments now to avoid warnings about unused arguments.
1525 Args.ClaimAllArgs(options::OPT_fexceptions);
1526 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1527 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1528 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1529 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1530 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001531 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001532 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001533
1534 // Exceptions are enabled by default.
1535 bool ExceptionsEnabled = true;
1536
1537 // This keeps track of whether exceptions were explicitly turned on or off.
1538 bool DidHaveExplicitExceptionFlag = false;
1539
Rafael Espindola00a66572009-10-01 13:33:33 +00001540 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1541 options::OPT_fno_exceptions)) {
1542 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001543 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001544 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001545 ExceptionsEnabled = false;
1546
1547 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001548 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001549
Anders Carlssone96ab552011-02-28 02:27:16 +00001550 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001551
Anders Carlssone96ab552011-02-28 02:27:16 +00001552 // Exception tables and cleanups can be enabled with -fexceptions even if the
1553 // language itself doesn't support exceptions.
1554 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1555 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001556
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001557 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1558 // is not necessarily sensible, but follows GCC.
1559 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001560 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001561 options::OPT_fno_objc_exceptions,
1562 true)) {
1563 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001564
Eric Christopher84fbdb42011-08-19 00:30:14 +00001565 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001566 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001567 }
1568
1569 if (types::isCXX(InputType)) {
1570 bool CXXExceptionsEnabled = ExceptionsEnabled;
1571
Eric Christopher84fbdb42011-08-19 00:30:14 +00001572 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1573 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001574 options::OPT_fexceptions,
1575 options::OPT_fno_exceptions)) {
1576 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1577 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001578 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001579 CXXExceptionsEnabled = false;
1580 }
1581
1582 if (CXXExceptionsEnabled) {
1583 CmdArgs.push_back("-fcxx-exceptions");
1584
1585 ShouldUseExceptionTables = true;
1586 }
1587 }
1588
1589 if (ShouldUseExceptionTables)
1590 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001591}
1592
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001593static bool ShouldDisableAutolink(const ArgList &Args,
1594 const ToolChain &TC) {
1595 bool Default = true;
1596 if (TC.getTriple().isOSDarwin()) {
1597 // The native darwin assembler doesn't support the linker_option directives,
1598 // so we disable them if we think the .s file will be passed to it.
1599 Default = TC.useIntegratedAs();
1600 }
1601 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1602 Default);
1603}
1604
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001605static bool ShouldDisableCFI(const ArgList &Args,
1606 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001607 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001608 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001609 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001610 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001611 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001612 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001613 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001614 options::OPT_fno_dwarf2_cfi_asm,
1615 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001616}
1617
Ted Kremenek62093662013-03-12 17:02:12 +00001618static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1619 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001620 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1621 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001622 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001623 return !UseDwarfDirectory;
1624}
1625
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001626/// \brief Check whether the given input tree contains any compilation actions.
1627static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001628 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001629 return true;
1630
1631 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1632 if (ContainsCompileAction(*it))
1633 return true;
1634
1635 return false;
1636}
1637
1638/// \brief Check if -relax-all should be passed to the internal assembler.
1639/// This is done by default when compiling non-assembler source with -O0.
1640static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1641 bool RelaxDefault = true;
1642
1643 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1644 RelaxDefault = A->getOption().matches(options::OPT_O0);
1645
1646 if (RelaxDefault) {
1647 RelaxDefault = false;
1648 for (ActionList::const_iterator it = C.getActions().begin(),
1649 ie = C.getActions().end(); it != ie; ++it) {
1650 if (ContainsCompileAction(*it)) {
1651 RelaxDefault = true;
1652 break;
1653 }
1654 }
1655 }
1656
1657 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1658 RelaxDefault);
1659}
1660
David Blaikie9260ed62013-07-25 21:19:01 +00001661static void CollectArgsForIntegratedAssembler(Compilation &C,
1662 const ArgList &Args,
1663 ArgStringList &CmdArgs,
1664 const Driver &D) {
1665 if (UseRelaxAll(C, Args))
1666 CmdArgs.push_back("-mrelax-all");
1667
David Peixottodfb66142013-11-14 22:52:58 +00001668 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001669 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001670 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1671 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1672 // arg after parsing the '-I' arg.
1673 bool TakeNextArg = false;
1674
David Blaikie9260ed62013-07-25 21:19:01 +00001675 // When using an integrated assembler, translate -Wa, and -Xassembler
1676 // options.
1677 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1678 options::OPT_Xassembler),
1679 ie = Args.filtered_end(); it != ie; ++it) {
1680 const Arg *A = *it;
1681 A->claim();
1682
1683 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1684 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001685 if (TakeNextArg) {
1686 CmdArgs.push_back(Value.data());
1687 TakeNextArg = false;
1688 continue;
1689 }
David Blaikie9260ed62013-07-25 21:19:01 +00001690
1691 if (Value == "-force_cpusubtype_ALL") {
1692 // Do nothing, this is the default and we don't support anything else.
1693 } else if (Value == "-L") {
1694 CmdArgs.push_back("-msave-temp-labels");
1695 } else if (Value == "--fatal-warnings") {
1696 CmdArgs.push_back("-mllvm");
1697 CmdArgs.push_back("-fatal-assembler-warnings");
1698 } else if (Value == "--noexecstack") {
1699 CmdArgs.push_back("-mnoexecstack");
David Peixottodfb66142013-11-14 22:52:58 +00001700 } else if (Value.startswith("-I")) {
1701 CmdArgs.push_back(Value.data());
1702 // We need to consume the next argument if the current arg is a plain
1703 // -I. The next arg will be the include directory.
1704 if (Value == "-I")
1705 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001706 } else {
1707 D.Diag(diag::err_drv_unsupported_option_argument)
1708 << A->getOption().getName() << Value;
1709 }
1710 }
1711 }
1712}
1713
Chandler Carruth36381702013-06-23 11:28:48 +00001714static void addProfileRTLinux(
1715 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1716 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1717 Args.hasArg(options::OPT_fprofile_generate) ||
1718 Args.hasArg(options::OPT_fcreate_profile) ||
1719 Args.hasArg(options::OPT_coverage)))
1720 return;
1721
1722 // The profile runtime is located in the Linux library directory and has name
1723 // "libclang_rt.profile-<ArchName>.a".
1724 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1725 llvm::sys::path::append(
1726 LibProfile, "lib", "linux",
1727 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1728
1729 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1730}
1731
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001732static void addSanitizerRTLinkFlagsLinux(
1733 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001734 const StringRef Sanitizer, bool BeforeLibStdCXX,
1735 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001736 // Sanitizer runtime is located in the Linux library directory and
1737 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1738 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1739 llvm::sys::path::append(
1740 LibSanitizer, "lib", "linux",
1741 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001742
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001743 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1744 // etc.) so that the linker picks custom versions of the global 'operator
1745 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001746 // strategy of inserting it at the front of the link command. It also
1747 // needs to be forced to end up in the executable, so wrap it in
1748 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001749 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001750 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001751 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001752 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001753
1754 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1755 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1756
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001757 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001758 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001759 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001760 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001761
1762 // If possible, use a dynamic symbols file to export the symbols from the
1763 // runtime library. If we can't do so, use -export-dynamic instead to export
1764 // all symbols from the binary.
1765 if (ExportSymbols) {
1766 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1767 CmdArgs.push_back(
1768 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1769 else
1770 CmdArgs.push_back("-export-dynamic");
1771 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001772}
1773
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001774/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1775/// This needs to be called before we add the C run-time (malloc, etc).
1776static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001777 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001778 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001779 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1780 llvm::sys::path::append(LibAsan, "lib", "linux",
1781 (Twine("libclang_rt.asan-") +
1782 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001783 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001784 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001785 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001786 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001787 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001788}
1789
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001790/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1791/// This needs to be called before we add the C run-time (malloc, etc).
1792static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1793 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001794 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001795 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001796}
1797
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001798/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1799/// This needs to be called before we add the C run-time (malloc, etc).
1800static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1801 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001802 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001803 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001804}
1805
1806/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1807/// This needs to be called before we add the C run-time (malloc, etc).
1808static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1809 ArgStringList &CmdArgs) {
1810 if (!Args.hasArg(options::OPT_shared))
1811 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001812}
1813
Richard Smithe30752c2012-10-09 19:52:38 +00001814/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1815/// (Linux).
1816static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001817 ArgStringList &CmdArgs, bool IsCXX,
1818 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001819 // Need a copy of sanitizer_common. This could come from another sanitizer
1820 // runtime; if we're not including one, include our own copy.
1821 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001822 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1823
1824 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1825
1826 // Only include the bits of the runtime which need a C++ ABI library if
1827 // we're linking in C++ mode.
1828 if (IsCXX)
1829 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001830}
1831
Peter Collingbournec3772752013-08-07 22:47:34 +00001832static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1833 ArgStringList &CmdArgs) {
1834 if (!Args.hasArg(options::OPT_shared))
1835 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1836}
1837
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001838static bool shouldUseFramePointerForTarget(const ArgList &Args,
1839 const llvm::Triple &Triple) {
1840 switch (Triple.getArch()) {
1841 // Don't use a frame pointer on linux if optimizing for certain targets.
1842 case llvm::Triple::mips64:
1843 case llvm::Triple::mips64el:
1844 case llvm::Triple::mips:
1845 case llvm::Triple::mipsel:
1846 case llvm::Triple::systemz:
1847 case llvm::Triple::x86:
1848 case llvm::Triple::x86_64:
1849 if (Triple.isOSLinux())
1850 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1851 if (!A->getOption().matches(options::OPT_O0))
1852 return false;
1853 return true;
1854 case llvm::Triple::xcore:
1855 return false;
1856 default:
1857 return true;
1858 }
1859}
1860
Rafael Espindola224dd632011-12-14 21:02:23 +00001861static bool shouldUseFramePointer(const ArgList &Args,
1862 const llvm::Triple &Triple) {
1863 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1864 options::OPT_fomit_frame_pointer))
1865 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1866
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001867 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001868}
1869
Eric Christopherb7d97e92013-04-03 01:58:53 +00001870static bool shouldUseLeafFramePointer(const ArgList &Args,
1871 const llvm::Triple &Triple) {
1872 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1873 options::OPT_momit_leaf_frame_pointer))
1874 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1875
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001876 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001877}
1878
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001879/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001880static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001881 SmallString<128> cwd;
1882 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001883 CmdArgs.push_back("-fdebug-compilation-dir");
1884 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001885 }
1886}
1887
Eric Christopherd3804002013-02-22 20:12:52 +00001888static const char *SplitDebugName(const ArgList &Args,
1889 const InputInfoList &Inputs) {
1890 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1891 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1892 SmallString<128> T(FinalOutput->getValue());
1893 llvm::sys::path::replace_extension(T, "dwo");
1894 return Args.MakeArgString(T);
1895 } else {
1896 // Use the compilation dir.
1897 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1898 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1899 llvm::sys::path::replace_extension(F, "dwo");
1900 T += F;
1901 return Args.MakeArgString(F);
1902 }
1903}
1904
1905static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1906 const Tool &T, const JobAction &JA,
1907 const ArgList &Args, const InputInfo &Output,
1908 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001909 ArgStringList ExtractArgs;
1910 ExtractArgs.push_back("--extract-dwo");
1911
1912 ArgStringList StripArgs;
1913 StripArgs.push_back("--strip-dwo");
1914
1915 // Grabbing the output of the earlier compile step.
1916 StripArgs.push_back(Output.getFilename());
1917 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001918 ExtractArgs.push_back(OutFile);
1919
1920 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001921 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001922
1923 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001924 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001925
1926 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001927 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001928}
1929
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001930static bool isOptimizationLevelFast(const ArgList &Args) {
1931 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1932 if (A->getOption().matches(options::OPT_Ofast))
1933 return true;
1934 return false;
1935}
1936
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001937/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1938static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1939 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001940 if (A->getOption().matches(options::OPT_O4) ||
1941 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001942 return true;
1943
1944 if (A->getOption().matches(options::OPT_O0))
1945 return false;
1946
1947 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1948
Rafael Espindola91780de2013-08-26 14:05:41 +00001949 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001950 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001951 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001952 return true;
1953
1954 // Don't vectorize -Oz.
1955 if (S == "z")
1956 return false;
1957
1958 unsigned OptLevel = 0;
1959 if (S.getAsInteger(10, OptLevel))
1960 return false;
1961
1962 return OptLevel > 1;
1963 }
1964
1965 return false;
1966}
1967
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001968void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001969 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001970 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001971 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001972 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001973 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1974 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001975 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001976 ArgStringList CmdArgs;
1977
Daniel Dunbare521a892009-03-31 20:53:55 +00001978 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1979
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001980 // Invoke ourselves in -cc1 mode.
1981 //
1982 // FIXME: Implement custom jobs for internal actions.
1983 CmdArgs.push_back("-cc1");
1984
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001985 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001986 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001987 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001988 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001989
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001990 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001991 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001992
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001993 if (isa<AnalyzeJobAction>(JA)) {
1994 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1995 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001996 } else if (isa<MigrateJobAction>(JA)) {
1997 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001998 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001999 if (Output.getType() == types::TY_Dependencies)
2000 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002001 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002002 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002003 if (Args.hasArg(options::OPT_rewrite_objc) &&
2004 !Args.hasArg(options::OPT_g_Group))
2005 CmdArgs.push_back("-P");
2006 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002007 } else if (isa<AssembleJobAction>(JA)) {
2008 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002009
David Blaikie9260ed62013-07-25 21:19:01 +00002010 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002011
2012 // Also ignore explicit -force_cpusubtype_ALL option.
2013 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002014 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002015 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002016 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002017
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002018 if (JA.getType() == types::TY_Nothing)
2019 CmdArgs.push_back("-fsyntax-only");
2020 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002021 CmdArgs.push_back("-emit-pch");
2022 else
2023 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002024 } else {
2025 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002026
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002027 if (JA.getType() == types::TY_Nothing) {
2028 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002029 } else if (JA.getType() == types::TY_LLVM_IR ||
2030 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002031 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002032 } else if (JA.getType() == types::TY_LLVM_BC ||
2033 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002034 CmdArgs.push_back("-emit-llvm-bc");
2035 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002036 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002037 } else if (JA.getType() == types::TY_AST) {
2038 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002039 } else if (JA.getType() == types::TY_ModuleFile) {
2040 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002041 } else if (JA.getType() == types::TY_RewrittenObjC) {
2042 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002043 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002044 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2045 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002046 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002047 } else {
2048 assert(JA.getType() == types::TY_PP_Asm &&
2049 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002050 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002051 }
2052
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002053 // The make clang go fast button.
2054 CmdArgs.push_back("-disable-free");
2055
John McCallbb79b5f2010-02-13 03:50:24 +00002056 // Disable the verification pass in -asserts builds.
2057#ifdef NDEBUG
2058 CmdArgs.push_back("-disable-llvm-verifier");
2059#endif
2060
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002061 // Set the main file name, so that debug info works even with
2062 // -save-temps.
2063 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002064 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002065
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002066 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002067 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002068 if (Args.hasArg(options::OPT_static))
2069 CmdArgs.push_back("-static-define");
2070
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002071 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002072 // Enable region store model by default.
2073 CmdArgs.push_back("-analyzer-store=region");
2074
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002075 // Treat blocks as analysis entry points.
2076 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2077
Ted Kremenek49c79792011-03-24 00:28:47 +00002078 CmdArgs.push_back("-analyzer-eagerly-assume");
2079
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002080 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002081 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002082 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002083
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002084 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2085 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002086
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002087 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002088 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002089
2090 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002091
Jordan Rose10ad0812013-04-05 17:55:07 +00002092 if (types::isCXX(Inputs[0].getType()))
2093 CmdArgs.push_back("-analyzer-checker=cplusplus");
2094
Ted Kremenek37e96522012-01-26 02:27:38 +00002095 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002096 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2097 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2098 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2099 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2100 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2101 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002102 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002103
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002104 // Set the output format. The default is plist, for (lame) historical
2105 // reasons.
2106 CmdArgs.push_back("-analyzer-output");
2107 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002108 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002109 else
2110 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002111
Ted Kremenekfe449a22010-03-22 22:32:05 +00002112 // Disable the presentation of standard compiler warnings when
2113 // using --analyze. We only want to show static analyzer diagnostics
2114 // or frontend errors.
2115 CmdArgs.push_back("-w");
2116
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002117 // Add -Xanalyzer arguments when running as analyzer.
2118 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002119 }
2120
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002121 CheckCodeGenerationOptions(D, Args);
2122
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002123 bool PIE = getToolChain().isPIEDefault();
2124 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002125 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002126
Alexey Samsonov090301e2013-04-09 12:28:19 +00002127 // For the PIC and PIE flag options, this logic is different from the
2128 // legacy logic in very old versions of GCC, as that logic was just
2129 // a bug no one had ever fixed. This logic is both more rational and
2130 // consistent with GCC's new logic now that the bugs are fixed. The last
2131 // argument relating to either PIC or PIE wins, and no other argument is
2132 // used. If the last argument is any flavor of the '-fno-...' arguments,
2133 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2134 // at the same level.
2135 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2136 options::OPT_fpic, options::OPT_fno_pic,
2137 options::OPT_fPIE, options::OPT_fno_PIE,
2138 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002139 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2140 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002141 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002142 if (LastPICArg) {
2143 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002144 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2145 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2146 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2147 PIC = PIE || O.matches(options::OPT_fPIC) ||
2148 O.matches(options::OPT_fpic);
2149 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2150 O.matches(options::OPT_fPIC);
2151 } else {
2152 PIE = PIC = false;
2153 }
2154 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002155 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002156
Nick Lewycky609dd662013-10-11 03:33:53 +00002157 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002158 // specified while enabling PIC enabled level 1 PIC, just force it back to
2159 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2160 // informal testing).
2161 if (PIC && getToolChain().getTriple().isOSDarwin())
2162 IsPICLevelTwo |= getToolChain().isPICDefault();
2163
Chandler Carruthc0c04552012-04-08 16:40:35 +00002164 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2165 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002166 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002167 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002168 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002169 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002170 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002171 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002172
Chandler Carruth76a943b2012-11-19 03:52:03 +00002173 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2174 // This is a very special mode. It trumps the other modes, almost no one
2175 // uses it, and it isn't even valid on any OS but Darwin.
2176 if (!getToolChain().getTriple().isOSDarwin())
2177 D.Diag(diag::err_drv_unsupported_opt_for_target)
2178 << A->getSpelling() << getToolChain().getTriple().str();
2179
2180 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2181
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002182 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002183 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002184
Chandler Carruth76a943b2012-11-19 03:52:03 +00002185 // Only a forced PIC mode can cause the actual compile to have PIC defines
2186 // etc., no flags are sufficient. This behavior was selected to closely
2187 // match that of llvm-gcc and Apple GCC before that.
2188 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2189 CmdArgs.push_back("-pic-level");
2190 CmdArgs.push_back("2");
2191 }
2192 } else {
2193 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2194 // handled in Clang's IRGen by the -pie-level flag.
2195 CmdArgs.push_back("-mrelocation-model");
2196 CmdArgs.push_back(PIC ? "pic" : "static");
2197
2198 if (PIC) {
2199 CmdArgs.push_back("-pic-level");
2200 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2201 if (PIE) {
2202 CmdArgs.push_back("-pie-level");
2203 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2204 }
2205 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002206 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002207
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002208 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2209 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002210 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002211
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002212 // LLVM Code Generator Options.
2213
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002214 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2215 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002216 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002217 }
2218
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002219 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2220 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002221 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002222 D.Diag(diag::err_drv_unsupported_opt_for_target)
2223 << A->getSpelling() << getToolChain().getTriple().str();
2224 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2225 CmdArgs.push_back("-fpcc-struct-return");
2226 } else {
2227 assert(A->getOption().matches(options::OPT_freg_struct_return));
2228 CmdArgs.push_back("-freg-struct-return");
2229 }
2230 }
2231
Roman Divacky65b88cd2011-03-01 17:40:53 +00002232 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2233 CmdArgs.push_back("-mrtd");
2234
Rafael Espindola224dd632011-12-14 21:02:23 +00002235 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002236 CmdArgs.push_back("-mdisable-fp-elim");
2237 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2238 options::OPT_fno_zero_initialized_in_bss))
2239 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002240
2241 bool OFastEnabled = isOptimizationLevelFast(Args);
2242 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2243 // enabled. This alias option is being used to simplify the hasFlag logic.
2244 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2245 options::OPT_fstrict_aliasing;
2246 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002247 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002248 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002249 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2250 options::OPT_fno_struct_path_tbaa))
2251 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002252 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2253 false))
2254 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002255 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2256 options::OPT_fno_optimize_sibling_calls))
2257 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002258
Eric Christopher006208c2013-04-04 06:29:47 +00002259 // Handle segmented stacks.
2260 if (Args.hasArg(options::OPT_fsplit_stack))
2261 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002262
2263 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2264 // This alias option is being used to simplify the getLastArg logic.
2265 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2266 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002267
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002268 // Handle various floating point optimization flags, mapping them to the
2269 // appropriate LLVM code generation flags. The pattern for all of these is to
2270 // default off the codegen optimizations, and if any flag enables them and no
2271 // flag disables them after the flag enabling them, enable the codegen
2272 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002273 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002274 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002275 options::OPT_ffinite_math_only,
2276 options::OPT_fno_finite_math_only,
2277 options::OPT_fhonor_infinities,
2278 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002279 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2280 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002281 A->getOption().getID() != options::OPT_fhonor_infinities)
2282 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002283 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002284 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002285 options::OPT_ffinite_math_only,
2286 options::OPT_fno_finite_math_only,
2287 options::OPT_fhonor_nans,
2288 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002289 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2290 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002291 A->getOption().getID() != options::OPT_fhonor_nans)
2292 CmdArgs.push_back("-menable-no-nans");
2293
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002294 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2295 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002296 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002297 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002298 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002299 options::OPT_fno_math_errno)) {
2300 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2301 // However, turning *off* -ffast_math merely restores the toolchain default
2302 // (which may be false).
2303 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2304 A->getOption().getID() == options::OPT_ffast_math ||
2305 A->getOption().getID() == options::OPT_Ofast)
2306 MathErrno = false;
2307 else if (A->getOption().getID() == options::OPT_fmath_errno)
2308 MathErrno = true;
2309 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002310 if (MathErrno)
2311 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002312
2313 // There are several flags which require disabling very specific
2314 // optimizations. Any of these being disabled forces us to turn off the
2315 // entire set of LLVM optimizations, so collect them through all the flag
2316 // madness.
2317 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002318 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002319 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002320 options::OPT_funsafe_math_optimizations,
2321 options::OPT_fno_unsafe_math_optimizations,
2322 options::OPT_fassociative_math,
2323 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002324 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2325 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002326 A->getOption().getID() != options::OPT_fno_associative_math)
2327 AssociativeMath = true;
2328 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002329 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002330 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002331 options::OPT_funsafe_math_optimizations,
2332 options::OPT_fno_unsafe_math_optimizations,
2333 options::OPT_freciprocal_math,
2334 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002335 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2336 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002337 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2338 ReciprocalMath = true;
2339 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002340 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002341 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002342 options::OPT_funsafe_math_optimizations,
2343 options::OPT_fno_unsafe_math_optimizations,
2344 options::OPT_fsigned_zeros,
2345 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002346 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2347 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002348 A->getOption().getID() != options::OPT_fsigned_zeros)
2349 SignedZeros = false;
2350 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002351 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002352 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002353 options::OPT_funsafe_math_optimizations,
2354 options::OPT_fno_unsafe_math_optimizations,
2355 options::OPT_ftrapping_math,
2356 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002357 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2358 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002359 A->getOption().getID() != options::OPT_ftrapping_math)
2360 TrappingMath = false;
2361 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2362 !TrappingMath)
2363 CmdArgs.push_back("-menable-unsafe-fp-math");
2364
Lang Hamesaa53b932012-07-06 00:59:19 +00002365
2366 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002367 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002368 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002369 options::OPT_ffp_contract)) {
2370 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002371 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002372 if (Val == "fast" || Val == "on" || Val == "off") {
2373 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2374 } else {
2375 D.Diag(diag::err_drv_unsupported_option_argument)
2376 << A->getOption().getName() << Val;
2377 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002378 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2379 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002380 // If fast-math is set then set the fp-contract mode to fast.
2381 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2382 }
2383 }
2384
Bob Wilson6a039162012-07-19 03:52:53 +00002385 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2386 // and if we find them, tell the frontend to provide the appropriate
2387 // preprocessor macros. This is distinct from enabling any optimizations as
2388 // these options induce language changes which must survive serialization
2389 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002390 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2391 options::OPT_fno_fast_math))
2392 if (!A->getOption().matches(options::OPT_fno_fast_math))
2393 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002394 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2395 if (A->getOption().matches(options::OPT_ffinite_math_only))
2396 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002397
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002398 // Decide whether to use verbose asm. Verbose assembly is the default on
2399 // toolchains which have the integrated assembler on by default.
2400 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2401 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002402 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002403 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002404 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002405
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002406 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2407 CmdArgs.push_back("-mdebug-pass");
2408 CmdArgs.push_back("Structure");
2409 }
2410 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2411 CmdArgs.push_back("-mdebug-pass");
2412 CmdArgs.push_back("Arguments");
2413 }
2414
John McCall8517abc2010-02-19 02:45:38 +00002415 // Enable -mconstructor-aliases except on darwin, where we have to
2416 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002417 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002418 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002419
John McCall7ef5cb32011-03-18 02:56:14 +00002420 // Darwin's kernel doesn't support guard variables; just die if we
2421 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002422 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002423 CmdArgs.push_back("-fforbid-guard-variables");
2424
Douglas Gregordbe39272011-02-01 15:15:22 +00002425 if (Args.hasArg(options::OPT_mms_bitfields)) {
2426 CmdArgs.push_back("-mms-bitfields");
2427 }
John McCall8517abc2010-02-19 02:45:38 +00002428
Daniel Dunbar306945d2009-09-16 06:17:29 +00002429 // This is a coarse approximation of what llvm-gcc actually does, both
2430 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2431 // complicated ways.
2432 bool AsynchronousUnwindTables =
2433 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2434 options::OPT_fno_asynchronous_unwind_tables,
2435 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002436 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002437 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2438 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002439 CmdArgs.push_back("-munwind-tables");
2440
Chandler Carruth05fb5852012-11-21 23:40:23 +00002441 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002442
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002443 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2444 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002445 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002446 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002447
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002448 // FIXME: Handle -mtune=.
2449 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002450
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002451 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002452 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002453 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002454 }
2455
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002456 // Add the target cpu
2457 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2458 llvm::Triple ETriple(ETripleStr);
2459 std::string CPU = getCPUName(Args, ETriple);
2460 if (!CPU.empty()) {
2461 CmdArgs.push_back("-target-cpu");
2462 CmdArgs.push_back(Args.MakeArgString(CPU));
2463 }
2464
Rafael Espindolaeb265472013-08-21 21:59:03 +00002465 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2466 CmdArgs.push_back("-mfpmath");
2467 CmdArgs.push_back(A->getValue());
2468 }
2469
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002470 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002471 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002472
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002473 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002474 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002475 default:
2476 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002477
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002478 case llvm::Triple::arm:
2479 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002480 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002481 break;
2482
Eric Christopher0b26a612010-03-02 02:41:08 +00002483 case llvm::Triple::mips:
2484 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002485 case llvm::Triple::mips64:
2486 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002487 AddMIPSTargetArgs(Args, CmdArgs);
2488 break;
2489
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002490 case llvm::Triple::sparc:
2491 AddSparcTargetArgs(Args, CmdArgs);
2492 break;
2493
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002494 case llvm::Triple::x86:
2495 case llvm::Triple::x86_64:
2496 AddX86TargetArgs(Args, CmdArgs);
2497 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002498
2499 case llvm::Triple::hexagon:
2500 AddHexagonTargetArgs(Args, CmdArgs);
2501 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002502 }
2503
Hans Wennborg75958c42013-08-08 00:17:41 +00002504 // Add clang-cl arguments.
2505 if (getToolChain().getDriver().IsCLMode())
2506 AddClangCLArgs(Args, CmdArgs);
2507
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002508 // Pass the linker version in use.
2509 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2510 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002511 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002512 }
2513
Eric Christopherb7d97e92013-04-03 01:58:53 +00002514 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002515 CmdArgs.push_back("-momit-leaf-frame-pointer");
2516
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002517 // Explicitly error on some things we know we don't support and can't just
2518 // ignore.
2519 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002520 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2521 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002522 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002523 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002524 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002525 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2526 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002527 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002528 << Unsupported->getOption().getName();
2529 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002530 }
2531
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002532 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002533 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002534 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002535 CmdArgs.push_back("-header-include-file");
2536 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2537 D.CCPrintHeadersFilename : "-");
2538 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002539 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002540 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002541
Chad Rosierbe10f982011-08-02 17:58:04 +00002542 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002543 CmdArgs.push_back("-diagnostic-log-file");
2544 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2545 D.CCLogDiagnosticsFilename : "-");
2546 }
2547
Manman Ren17bdb0f2013-11-20 20:22:14 +00002548 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2549 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002550 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002551 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002552 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2553 // FIXME: we should support specifying dwarf version with
2554 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002555 CmdArgs.push_back("-gline-tables-only");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002556 // Default is dwarf-2 for darwin.
2557 if (getToolChain().getTriple().isOSDarwin())
2558 CmdArgs.push_back("-gdwarf-2");
2559 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002560 CmdArgs.push_back("-gdwarf-2");
2561 else if (A->getOption().matches(options::OPT_gdwarf_3))
2562 CmdArgs.push_back("-gdwarf-3");
2563 else if (A->getOption().matches(options::OPT_gdwarf_4))
2564 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002565 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002566 !A->getOption().matches(options::OPT_ggdb0)) {
2567 // Default is dwarf-2 for darwin.
2568 if (getToolChain().getTriple().isOSDarwin())
2569 CmdArgs.push_back("-gdwarf-2");
2570 else
2571 CmdArgs.push_back("-g");
2572 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002573 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002574
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002575 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2576 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002577 if (Args.hasArg(options::OPT_gcolumn_info))
2578 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002579
Eric Christopher138c32b2013-09-13 22:37:55 +00002580 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002581 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2582 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002583 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002584 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002585 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002586 CmdArgs.push_back("-g");
2587 CmdArgs.push_back("-backend-option");
2588 CmdArgs.push_back("-split-dwarf=Enable");
2589 }
2590
Eric Christopher138c32b2013-09-13 22:37:55 +00002591 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2592 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2593 CmdArgs.push_back("-backend-option");
2594 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2595 }
Eric Christophereec89c22013-06-18 00:03:50 +00002596
2597 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2598
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002599 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2600 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2601
Chris Lattner3c77a352010-06-22 00:03:40 +00002602 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2603
Nick Lewycky207bce32011-04-21 23:44:07 +00002604 if (Args.hasArg(options::OPT_ftest_coverage) ||
2605 Args.hasArg(options::OPT_coverage))
2606 CmdArgs.push_back("-femit-coverage-notes");
2607 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2608 Args.hasArg(options::OPT_coverage))
2609 CmdArgs.push_back("-femit-coverage-data");
2610
Nick Lewycky480cb992011-05-04 20:46:58 +00002611 if (C.getArgs().hasArg(options::OPT_c) ||
2612 C.getArgs().hasArg(options::OPT_S)) {
2613 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002614 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002615 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002616 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002617 SmallString<128> Pwd;
2618 if (!llvm::sys::fs::current_path(Pwd)) {
2619 llvm::sys::path::append(Pwd, CoverageFilename.str());
2620 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002621 }
2622 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002623 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002624 }
2625 }
2626
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002627 // Pass options for controlling the default header search paths.
2628 if (Args.hasArg(options::OPT_nostdinc)) {
2629 CmdArgs.push_back("-nostdsysteminc");
2630 CmdArgs.push_back("-nobuiltininc");
2631 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002632 if (Args.hasArg(options::OPT_nostdlibinc))
2633 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002634 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2635 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2636 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002637
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002638 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002639 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002640 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002641
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002642 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2643
Ted Kremenekf7639e12012-03-06 20:06:33 +00002644 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002645 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002646 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002647 options::OPT_ccc_arcmt_modify,
2648 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002649 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002650 switch (A->getOption().getID()) {
2651 default:
2652 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002653 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002654 CmdArgs.push_back("-arcmt-check");
2655 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002656 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002657 CmdArgs.push_back("-arcmt-modify");
2658 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002659 case options::OPT_ccc_arcmt_migrate:
2660 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002661 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002662 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002663
2664 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2665 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002666 break;
John McCalld70fb982011-06-15 23:25:17 +00002667 }
2668 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002669 } else {
2670 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2671 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2672 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002673 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002674
Ted Kremenekf7639e12012-03-06 20:06:33 +00002675 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2676 if (ARCMTEnabled) {
2677 D.Diag(diag::err_drv_argument_not_allowed_with)
2678 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2679 }
2680 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002681 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002682
2683 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002684 options::OPT_objcmt_migrate_subscripting,
2685 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002686 // None specified, means enable them all.
2687 CmdArgs.push_back("-objcmt-migrate-literals");
2688 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002689 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002690 } else {
2691 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2692 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002693 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002694 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002695 } else {
2696 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2697 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2698 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2699 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2700 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2701 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2702 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2703 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2704 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2705 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2706 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2707 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2708 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002709 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002710 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002711 }
2712
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002713 // Add preprocessing options like -I, -D, etc. if we are using the
2714 // preprocessor.
2715 //
2716 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002717 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002718 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002719
Rafael Espindolaa7431922011-07-21 23:40:37 +00002720 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2721 // that "The compiler can only warn and ignore the option if not recognized".
2722 // When building with ccache, it will pass -D options to clang even on
2723 // preprocessed inputs and configure concludes that -fPIC is not supported.
2724 Args.ClaimAllArgs(options::OPT_D);
2725
Alp Toker7874bdc2013-11-15 20:40:58 +00002726 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002727 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2728 if (A->getOption().matches(options::OPT_O4)) {
2729 CmdArgs.push_back("-O3");
2730 D.Diag(diag::warn_O4_is_O3);
2731 } else {
2732 A->render(Args, CmdArgs);
2733 }
2734 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002735
Chad Rosier86b82082012-12-12 20:06:31 +00002736 // Don't warn about unused -flto. This can happen when we're preprocessing or
2737 // precompiling.
2738 Args.ClaimAllArgs(options::OPT_flto);
2739
Daniel Dunbar945577c2009-10-29 02:24:45 +00002740 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002741 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2742 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002743 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002744 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002745
2746 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002747 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002748 //
2749 // If a std is supplied, only add -trigraphs if it follows the
2750 // option.
2751 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2752 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002753 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002754 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002755 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002756 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002757 else
2758 Std->render(Args, CmdArgs);
2759
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002760 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2761 options::OPT_trigraphs))
2762 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002763 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002764 } else {
2765 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002766 //
2767 // FIXME: Clang doesn't correctly handle -std= when the input language
2768 // doesn't match. For the time being just ignore this for C++ inputs;
2769 // eventually we want to do all the standard defaulting here instead of
2770 // splitting it between the driver and clang -cc1.
2771 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002772 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2773 "-std=", /*Joined=*/true);
2774 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2775 CmdArgs.push_back("-std=c++11");
2776
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002777 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002778 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002779
Richard Smith282b4492013-09-04 22:50:31 +00002780 // GCC's behavior for -Wwrite-strings is a bit strange:
2781 // * In C, this "warning flag" changes the types of string literals from
2782 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2783 // for the discarded qualifier.
2784 // * In C++, this is just a normal warning flag.
2785 //
2786 // Implementing this warning correctly in C is hard, so we follow GCC's
2787 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2788 // a non-const char* in C, rather than using this crude hack.
2789 if (!types::isCXX(InputType)) {
Rafael Espindola0df9e162013-11-05 21:43:54 +00002790 DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel(
2791 diag::warn_deprecated_string_literal_conversion_c, SourceLocation());
2792 if (DiagLevel > DiagnosticsEngine::Ignored)
Richard Smith282b4492013-09-04 22:50:31 +00002793 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002794 }
2795
Chandler Carruth61fbf622011-04-23 09:27:53 +00002796 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002797 // during C++ compilation, which it is by default. GCC keeps this define even
2798 // in the presence of '-w', match this behavior bug-for-bug.
2799 if (types::isCXX(InputType) &&
2800 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2801 true)) {
2802 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002803 }
2804
Chandler Carruthe0391482010-05-22 02:21:53 +00002805 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2806 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2807 if (Asm->getOption().matches(options::OPT_fasm))
2808 CmdArgs.push_back("-fgnu-keywords");
2809 else
2810 CmdArgs.push_back("-fno-gnu-keywords");
2811 }
2812
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002813 if (ShouldDisableCFI(Args, getToolChain()))
2814 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002815
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002816 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2817 CmdArgs.push_back("-fno-dwarf-directory-asm");
2818
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002819 if (ShouldDisableAutolink(Args, getToolChain()))
2820 CmdArgs.push_back("-fno-autolink");
2821
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002822 // Add in -fdebug-compilation-dir if necessary.
2823 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002824
Richard Smith9a568822011-11-21 19:36:32 +00002825 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2826 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002827 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002828 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002829 }
2830
Richard Smith79c927b2013-11-06 19:31:51 +00002831 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2832 CmdArgs.push_back("-foperator-arrow-depth");
2833 CmdArgs.push_back(A->getValue());
2834 }
2835
Richard Smith9a568822011-11-21 19:36:32 +00002836 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2837 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002838 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002839 }
2840
Richard Smitha3d3bd22013-05-08 02:12:03 +00002841 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2842 CmdArgs.push_back("-fconstexpr-steps");
2843 CmdArgs.push_back(A->getValue());
2844 }
2845
Richard Smithb3a14522013-02-22 01:59:51 +00002846 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2847 CmdArgs.push_back("-fbracket-depth");
2848 CmdArgs.push_back(A->getValue());
2849 }
2850
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002851 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2852 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002853 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002854 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002855 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2856 } else
2857 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002858 }
2859
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002860
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002861 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002862 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002863
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002864 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2865 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002866 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002867 }
David Chisnall5778fce2009-08-31 16:41:57 +00002868
Chris Lattnere23003d2010-01-09 21:54:33 +00002869 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2870 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002871 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002872 }
2873
Chris Lattnerb35583d2010-04-07 20:49:23 +00002874 CmdArgs.push_back("-ferror-limit");
2875 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002876 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002877 else
2878 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002879
Chandler Carrutha77a7272010-05-06 04:55:18 +00002880 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2881 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002882 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002883 }
2884
2885 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2886 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002887 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002888 }
2889
Richard Smithf6f003a2011-12-16 19:06:07 +00002890 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2891 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002892 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002893 }
2894
Daniel Dunbar2c978472009-11-04 06:24:47 +00002895 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002896 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002897 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002898 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002899 } else {
2900 // If -fmessage-length=N was not specified, determine whether this is a
2901 // terminal and, if so, implicitly define -fmessage-length appropriately.
2902 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002903 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002904 }
2905
John McCallb4a99d32013-02-19 01:57:35 +00002906 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2907 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2908 options::OPT_fvisibility_ms_compat)) {
2909 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2910 CmdArgs.push_back("-fvisibility");
2911 CmdArgs.push_back(A->getValue());
2912 } else {
2913 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2914 CmdArgs.push_back("-fvisibility");
2915 CmdArgs.push_back("hidden");
2916 CmdArgs.push_back("-ftype-visibility");
2917 CmdArgs.push_back("default");
2918 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002919 }
2920
Douglas Gregor08329632010-06-15 17:05:35 +00002921 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002922
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002923 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2924
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002925 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002926 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2927 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002928 CmdArgs.push_back("-ffreestanding");
2929
Daniel Dunbare357d562009-12-03 18:42:11 +00002930 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002931 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002932 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002933 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002934 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002935 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002936 // AltiVec language extensions aren't relevant for assembling.
2937 if (!isa<PreprocessJobAction>(JA) ||
2938 Output.getType() != types::TY_PP_Asm)
2939 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002940 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2941 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002942
Peter Collingbourne32701642013-11-01 18:16:25 +00002943 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
2944 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002945
Will Dietz3676d562012-12-30 20:53:28 +00002946 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2947 options::OPT_fno_sanitize_recover,
2948 true))
2949 CmdArgs.push_back("-fno-sanitize-recover");
2950
Chad Rosierae229d52013-01-29 23:31:22 +00002951 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2952 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2953 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2954 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2955
Eric Christopher459d2712013-02-19 06:16:53 +00002956 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002957 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002958 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002959 getToolChain().getArch() == llvm::Triple::ppc64 ||
2960 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002961 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002962 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002963
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002964 if (getToolChain().SupportsProfiling())
2965 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002966
2967 // -flax-vector-conversions is default.
2968 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2969 options::OPT_fno_lax_vector_conversions))
2970 CmdArgs.push_back("-fno-lax-vector-conversions");
2971
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002972 if (Args.getLastArg(options::OPT_fapple_kext))
2973 CmdArgs.push_back("-fapple-kext");
2974
David Blaikie690f21e2012-06-14 18:55:27 +00002975 if (Args.hasFlag(options::OPT_frewrite_includes,
2976 options::OPT_fno_rewrite_includes, false))
2977 CmdArgs.push_back("-frewrite-includes");
2978
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002979 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002980 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002981 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002982 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2983 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002984
2985 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2986 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002987 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002988 }
2989
Bob Wilson14adb362012-02-03 06:27:22 +00002990 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002991
Chandler Carruth6e501032011-03-27 00:04:55 +00002992 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2993 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2994 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2995 options::OPT_fno_wrapv)) {
2996 if (A->getOption().matches(options::OPT_fwrapv))
2997 CmdArgs.push_back("-fwrapv");
2998 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2999 options::OPT_fno_strict_overflow)) {
3000 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3001 CmdArgs.push_back("-fwrapv");
3002 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003003
3004 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3005 options::OPT_fno_reroll_loops))
3006 if (A->getOption().matches(options::OPT_freroll_loops))
3007 CmdArgs.push_back("-freroll-loops");
3008
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003009 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003010 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3011 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003012
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003013 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3014
Mahesha S6a682be42012-10-27 07:47:56 +00003015
Daniel Dunbar4930e332009-11-17 08:07:36 +00003016 // -stack-protector=0 is default.
3017 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003018 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3019 options::OPT_fstack_protector_all,
3020 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003021 if (A->getOption().matches(options::OPT_fstack_protector))
3022 StackProtectorLevel = 1;
3023 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3024 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00003025 } else {
3026 StackProtectorLevel =
3027 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3028 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003029 if (StackProtectorLevel) {
3030 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003031 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003032 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003033
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003034 // --param ssp-buffer-size=
3035 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3036 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003037 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003038 if (Str.startswith("ssp-buffer-size=")) {
3039 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003040 CmdArgs.push_back("-stack-protector-buffer-size");
3041 // FIXME: Verify the argument is a valid integer.
3042 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003043 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003044 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003045 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003046 }
3047
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003048 // Translate -mstackrealign
3049 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3050 false)) {
3051 CmdArgs.push_back("-backend-option");
3052 CmdArgs.push_back("-force-align-stack");
3053 }
3054 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3055 false)) {
3056 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3057 }
3058
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003059 if (Args.hasArg(options::OPT_mstack_alignment)) {
3060 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3061 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003062 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003063 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003064 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003065 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3066 options::OPT_munaligned_access)) {
3067 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3068 CmdArgs.push_back("-backend-option");
3069 CmdArgs.push_back("-arm-strict-align");
3070 } else {
3071 CmdArgs.push_back("-backend-option");
3072 CmdArgs.push_back("-arm-no-strict-align");
3073 }
Renato Golina146a482013-08-24 14:44:41 +00003074 }
Chad Rosier60027022012-11-09 17:29:19 +00003075 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003076
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003077 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3078 options::OPT_mno_restrict_it)) {
3079 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3080 CmdArgs.push_back("-backend-option");
3081 CmdArgs.push_back("-arm-restrict-it");
3082 } else {
3083 CmdArgs.push_back("-backend-option");
3084 CmdArgs.push_back("-arm-no-restrict-it");
3085 }
3086 }
3087
Daniel Dunbard18049a2009-04-07 21:16:11 +00003088 // Forward -f options with positive and negative forms; we translate
3089 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003090 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3091 StringRef fname = A->getValue();
3092 if (!llvm::sys::fs::exists(fname))
3093 D.Diag(diag::err_drv_no_such_file) << fname;
3094 else
3095 A->render(Args, CmdArgs);
3096 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003097
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003098 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003099 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003100 CmdArgs.push_back("-fapple-kext");
3101 if (!Args.hasArg(options::OPT_fbuiltin))
3102 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003103 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003104 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003105 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003106 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003107 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003108
Nuno Lopes13c88c72009-12-16 16:59:22 +00003109 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3110 options::OPT_fno_assume_sane_operator_new))
3111 CmdArgs.push_back("-fno-assume-sane-operator-new");
3112
Daniel Dunbar4930e332009-11-17 08:07:36 +00003113 // -fblocks=0 is default.
3114 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003115 getToolChain().IsBlocksDefault()) ||
3116 (Args.hasArg(options::OPT_fgnu_runtime) &&
3117 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3118 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003119 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003120
3121 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3122 !getToolChain().hasBlocksRuntime())
3123 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003124 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003125
Douglas Gregor226173a2012-01-18 15:19:58 +00003126 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3127 // users must also pass -fcxx-modules. The latter flag will disappear once the
3128 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003129 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003130 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3131 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3132 options::OPT_fno_cxx_modules,
3133 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003134 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003135 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003136 HaveModules = true;
3137 }
3138 }
3139
Daniel Jasper07e6c402013-08-05 20:26:17 +00003140 // -fmodule-maps enables module map processing (off by default) for header
3141 // checking. It is implied by -fmodules.
3142 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3143 false)) {
3144 CmdArgs.push_back("-fmodule-maps");
3145 }
3146
Daniel Jasperac42b752013-10-21 06:34:34 +00003147 // -fmodules-decluse checks that modules used are declared so (off by
3148 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003149 if (Args.hasFlag(options::OPT_fmodules_decluse,
3150 options::OPT_fno_modules_decluse,
3151 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003152 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003153 }
3154
Daniel Jasperac42b752013-10-21 06:34:34 +00003155 // -fmodule-name specifies the module that is currently being built (or
3156 // used for header checking by -fmodule-maps).
3157 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3158 A->claim();
3159 A->render(Args, CmdArgs);
3160 }
3161
3162 // -fmodule-map-file can be used to specify a file containing module
3163 // definitions.
3164 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3165 A->claim();
3166 A->render(Args, CmdArgs);
3167 }
3168
Douglas Gregor35b04d62013-02-07 19:01:24 +00003169 // If a module path was provided, pass it along. Otherwise, use a temporary
3170 // directory.
3171 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3172 A->claim();
3173 if (HaveModules) {
3174 A->render(Args, CmdArgs);
3175 }
3176 } else if (HaveModules) {
3177 SmallString<128> DefaultModuleCache;
3178 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3179 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003180 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3181 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003182 const char Arg[] = "-fmodules-cache-path=";
3183 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3184 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003185 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3186 }
3187
3188 // Pass through all -fmodules-ignore-macro arguments.
3189 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003190 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3191 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003192
John McCalldfea9982010-04-09 19:12:06 +00003193 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003194 if (Args.hasFlag(options::OPT_fno_access_control,
3195 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003196 false))
John McCall3155f572010-04-09 19:03:51 +00003197 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003198
Anders Carlssond470fef2010-11-21 00:09:52 +00003199 // -felide-constructors is the default.
3200 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3201 options::OPT_felide_constructors,
3202 false))
3203 CmdArgs.push_back("-fno-elide-constructors");
3204
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003205 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003206 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003207 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003208 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003209
Richard Smith52be6192012-11-05 22:04:41 +00003210 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003211 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003212 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003213 Args.getLastArg(options::OPT_mkernel,
3214 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003215 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003216 D.Diag(diag::err_drv_argument_not_allowed_with)
3217 << "-fsanitize=vptr" << NoRttiArg;
3218 }
3219 }
3220
Tony Linthicum76329bf2011-12-12 21:14:55 +00003221 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003222 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003223 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003224 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003225 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003226 CmdArgs.push_back("-fshort-enums");
3227
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003228 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003229 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003230 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003231 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003232
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003233 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003234 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003235 options::OPT_fno_threadsafe_statics))
3236 CmdArgs.push_back("-fno-threadsafe-statics");
3237
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003238 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003239 if (!Args.hasFlag(
3240 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3241 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3242 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Robert Lytton6b1deb42013-11-12 10:09:22 +00003243 getToolChain().getArch() != llvm::Triple::hexagon &&
3244 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003245 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003246 CmdArgs.push_back("-fno-use-cxa-atexit");
3247
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003248 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003249 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003250 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3251 CmdArgs.push_back("-fms-extensions");
3252
Francois Pichet1b4f1632011-09-17 04:32:15 +00003253 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003254 if (Args.hasFlag(options::OPT_fms_compatibility,
3255 options::OPT_fno_ms_compatibility,
3256 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3257 Args.hasFlag(options::OPT_fms_extensions,
3258 options::OPT_fno_ms_extensions,
3259 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003260 CmdArgs.push_back("-fms-compatibility");
3261
Reid Klecknerc106fda2013-09-18 00:33:59 +00003262 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003263 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3264 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3265 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003266 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003267 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003268 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003269 else
3270 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3271 }
3272
3273
Eric Christopher5ecce122013-02-18 00:38:31 +00003274 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003275 if (Args.hasFlag(options::OPT_fborland_extensions,
3276 options::OPT_fno_borland_extensions, false))
3277 CmdArgs.push_back("-fborland-extensions");
3278
Francois Pichet02744872011-09-01 16:38:08 +00003279 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3280 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003281 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3282 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003283 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003284 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003285
Chandler Carruthe03aa552010-04-17 20:17:31 +00003286 // -fgnu-keywords default varies depending on language; only pass if
3287 // specified.
3288 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003289 options::OPT_fno_gnu_keywords))
3290 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003291
Rafael Espindola922a6242011-06-02 17:30:53 +00003292 if (Args.hasFlag(options::OPT_fgnu89_inline,
3293 options::OPT_fno_gnu89_inline,
3294 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003295 CmdArgs.push_back("-fgnu89-inline");
3296
Chad Rosier9c76d242012-03-15 22:31:42 +00003297 if (Args.hasArg(options::OPT_fno_inline))
3298 CmdArgs.push_back("-fno-inline");
3299
Chad Rosier64d6be92012-03-06 21:17:19 +00003300 if (Args.hasArg(options::OPT_fno_inline_functions))
3301 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003302
John McCall5fb5df92012-06-20 06:18:46 +00003303 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003304
John McCall5fb5df92012-06-20 06:18:46 +00003305 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003306 // legacy is the default. Next runtime is always legacy dispatch and
3307 // -fno-objc-legacy-dispatch gets ignored silently.
3308 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003309 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3310 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003311 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003312 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003313 if (getToolChain().UseObjCMixedDispatch())
3314 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3315 else
3316 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3317 }
3318 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003319
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003320 // When ObjectiveC legacy runtime is in effect on MacOSX,
3321 // turn on the option to do Array/Dictionary subscripting
3322 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003323 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3324 getToolChain().getTriple().isMacOSX() &&
3325 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3326 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003327 objcRuntime.isNeXTFamily())
3328 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3329
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003330 // -fencode-extended-block-signature=1 is default.
3331 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3332 CmdArgs.push_back("-fencode-extended-block-signature");
3333 }
3334
John McCall24fc0de2011-07-06 00:26:06 +00003335 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3336 // NOTE: This logic is duplicated in ToolChains.cpp.
3337 bool ARC = isObjCAutoRefCount(Args);
3338 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003339 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003340
John McCall24fc0de2011-07-06 00:26:06 +00003341 CmdArgs.push_back("-fobjc-arc");
3342
Chandler Carruth491db322011-11-04 07:34:47 +00003343 // FIXME: It seems like this entire block, and several around it should be
3344 // wrapped in isObjC, but for now we just use it here as this is where it
3345 // was being used previously.
3346 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3347 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3348 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3349 else
3350 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3351 }
3352
John McCall24fc0de2011-07-06 00:26:06 +00003353 // Allow the user to enable full exceptions code emission.
3354 // We define off for Objective-CC, on for Objective-C++.
3355 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3356 options::OPT_fno_objc_arc_exceptions,
3357 /*default*/ types::isCXX(InputType)))
3358 CmdArgs.push_back("-fobjc-arc-exceptions");
3359 }
3360
3361 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3362 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003363 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003364 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003365
John McCall24fc0de2011-07-06 00:26:06 +00003366 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3367 // takes precedence.
3368 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3369 if (!GCArg)
3370 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3371 if (GCArg) {
3372 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003373 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003374 << GCArg->getAsString(Args);
3375 } else if (getToolChain().SupportsObjCGC()) {
3376 GCArg->render(Args, CmdArgs);
3377 } else {
3378 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003379 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003380 << GCArg->getAsString(Args);
3381 }
3382 }
3383
John McCallb5f652e2011-06-22 00:53:57 +00003384 // Add exception args.
3385 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003386 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003387
3388 if (getToolChain().UseSjLjExceptions())
3389 CmdArgs.push_back("-fsjlj-exceptions");
3390
3391 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003392 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3393 options::OPT_fno_assume_sane_operator_new))
3394 CmdArgs.push_back("-fno-assume-sane-operator-new");
3395
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003396 // -fconstant-cfstrings is default, and may be subject to argument translation
3397 // on Darwin.
3398 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3399 options::OPT_fno_constant_cfstrings) ||
3400 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3401 options::OPT_mno_constant_cfstrings))
3402 CmdArgs.push_back("-fno-constant-cfstrings");
3403
John Thompsoned4e2952009-11-05 20:14:16 +00003404 // -fshort-wchar default varies depending on platform; only
3405 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003406 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3407 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003408
Hans Wennborg28c96312013-07-31 23:39:13 +00003409 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003410 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003411 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003412 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003413 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003414
Daniel Dunbar096ed292011-10-05 21:04:55 +00003415 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3416 // -fno-pack-struct doesn't apply to -fpack-struct=.
3417 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003418 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003419 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003420 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003421 } else if (Args.hasFlag(options::OPT_fpack_struct,
3422 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003423 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003424 }
3425
Robert Lytton0e076492013-08-13 09:43:10 +00003426 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003427 if (!Args.hasArg(options::OPT_fcommon))
3428 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003429 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003430 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003431
Daniel Dunbard18049a2009-04-07 21:16:11 +00003432 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003433 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003434 CmdArgs.push_back("-fno-common");
3435
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003436 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003437 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003438 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003439 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003440 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003441 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3442
Daniel Dunbar6358d682010-10-15 22:30:42 +00003443 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3444 if (!Args.hasFlag(options::OPT_ffor_scope,
3445 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003446 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003447 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3448
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003449 // -fcaret-diagnostics is default.
3450 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3451 options::OPT_fno_caret_diagnostics, true))
3452 CmdArgs.push_back("-fno-caret-diagnostics");
3453
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003454 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003455 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003456 options::OPT_fno_diagnostics_fixit_info))
3457 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003458
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003459 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003460 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003461 options::OPT_fno_diagnostics_show_option))
3462 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003463
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003464 if (const Arg *A =
3465 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3466 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003467 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003468 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003469
Douglas Gregor643c9222011-05-21 17:07:29 +00003470 if (const Arg *A =
3471 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3472 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003473 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003474 }
3475
Chandler Carruthb6766f02011-03-27 01:50:55 +00003476 if (Arg *A = Args.getLastArg(
3477 options::OPT_fdiagnostics_show_note_include_stack,
3478 options::OPT_fno_diagnostics_show_note_include_stack)) {
3479 if (A->getOption().matches(
3480 options::OPT_fdiagnostics_show_note_include_stack))
3481 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3482 else
3483 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3484 }
3485
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003486 // Color diagnostics are the default, unless the terminal doesn't support
3487 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003488 // Support both clang's -f[no-]color-diagnostics and gcc's
3489 // -f[no-]diagnostics-colors[=never|always|auto].
3490 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3491 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3492 it != ie; ++it) {
3493 const Option &O = (*it)->getOption();
3494 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3495 !O.matches(options::OPT_fdiagnostics_color) &&
3496 !O.matches(options::OPT_fno_color_diagnostics) &&
3497 !O.matches(options::OPT_fno_diagnostics_color) &&
3498 !O.matches(options::OPT_fdiagnostics_color_EQ))
3499 continue;
3500
3501 (*it)->claim();
3502 if (O.matches(options::OPT_fcolor_diagnostics) ||
3503 O.matches(options::OPT_fdiagnostics_color)) {
3504 ShowColors = Colors_On;
3505 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3506 O.matches(options::OPT_fno_diagnostics_color)) {
3507 ShowColors = Colors_Off;
3508 } else {
3509 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3510 StringRef value((*it)->getValue());
3511 if (value == "always")
3512 ShowColors = Colors_On;
3513 else if (value == "never")
3514 ShowColors = Colors_Off;
3515 else if (value == "auto")
3516 ShowColors = Colors_Auto;
3517 else
3518 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3519 << ("-fdiagnostics-color=" + value).str();
3520 }
3521 }
3522 if (ShowColors == Colors_On ||
3523 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003524 CmdArgs.push_back("-fcolor-diagnostics");
3525
Nico Rieck7857d462013-09-11 00:38:02 +00003526 if (Args.hasArg(options::OPT_fansi_escape_codes))
3527 CmdArgs.push_back("-fansi-escape-codes");
3528
Daniel Dunbardb097022009-06-08 21:13:54 +00003529 if (!Args.hasFlag(options::OPT_fshow_source_location,
3530 options::OPT_fno_show_source_location))
3531 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003532
Douglas Gregor643c9222011-05-21 17:07:29 +00003533 if (!Args.hasFlag(options::OPT_fshow_column,
3534 options::OPT_fno_show_column,
3535 true))
3536 CmdArgs.push_back("-fno-show-column");
3537
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003538 if (!Args.hasFlag(options::OPT_fspell_checking,
3539 options::OPT_fno_spell_checking))
3540 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003541
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003542
Chad Rosierc8e56e82012-12-05 21:08:21 +00003543 // -fno-asm-blocks is default.
3544 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3545 false))
3546 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003547
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003548 // Enable vectorization per default according to the optimization level
3549 // selected. For optimization levels that want vectorization we use the alias
3550 // option to simplify the hasFlag logic.
3551 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3552 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003553 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003554 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003555 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003556 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003557
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003558 // -fslp-vectorize is default.
3559 if (Args.hasFlag(options::OPT_fslp_vectorize,
3560 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003561 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003562
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003563 // -fno-slp-vectorize-aggressive is default.
3564 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003565 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003566 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003567
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003568 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3569 A->render(Args, CmdArgs);
3570
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003571 // -fdollars-in-identifiers default varies depending on platform and
3572 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003573 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003574 options::OPT_fno_dollars_in_identifiers)) {
3575 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003576 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003577 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003578 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003579 }
3580
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003581 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3582 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003583 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003584 options::OPT_fno_unit_at_a_time)) {
3585 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003586 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003587 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003588
Eli Friedman055c9702011-11-02 01:53:16 +00003589 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3590 options::OPT_fno_apple_pragma_pack, false))
3591 CmdArgs.push_back("-fapple-pragma-pack");
3592
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003593 // le32-specific flags:
3594 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3595 // by default.
3596 if (getToolChain().getArch() == llvm::Triple::le32) {
3597 CmdArgs.push_back("-fno-math-builtin");
3598 }
3599
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003600 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003601 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003602 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003603#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003604 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003605 (getToolChain().getArch() == llvm::Triple::arm ||
3606 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003607 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3608 CmdArgs.push_back("-fno-builtin-strcat");
3609 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3610 CmdArgs.push_back("-fno-builtin-strcpy");
3611 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003612#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003613
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003614 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003615 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003616 options::OPT_traditional_cpp)) {
3617 if (isa<PreprocessJobAction>(JA))
3618 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003619 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003620 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003621 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003622
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003623 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003624 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003625
3626 // Handle serialized diagnostics.
3627 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3628 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003629 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003630 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003631
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003632 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3633 CmdArgs.push_back("-fretain-comments-from-system-headers");
3634
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003635 // Forward -fcomment-block-commands to -cc1.
3636 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003637 // Forward -fparse-all-comments to -cc1.
3638 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003639
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003640 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3641 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003642 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003643 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3644 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003645 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003646
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003647 // We translate this by hand to the -cc1 argument, since nightly test uses
3648 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003649 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003650 CmdArgs.push_back("-disable-llvm-optzns");
3651 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003652 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003653 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003654
Daniel Dunbard67a3222009-03-30 06:36:42 +00003655 if (Output.getType() == types::TY_Dependencies) {
3656 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003657 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003658 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003659 CmdArgs.push_back(Output.getFilename());
3660 } else {
3661 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003662 }
3663
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003664 for (InputInfoList::const_iterator
3665 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3666 const InputInfo &II = *it;
3667 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003668 if (Args.hasArg(options::OPT_rewrite_objc))
3669 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3670 else
3671 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003672 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003673 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003674 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003675 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003676 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003677
Chris Lattnere9d7d782009-11-03 19:50:27 +00003678 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3679
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003680 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003681
3682 // Optionally embed the -cc1 level arguments into the debug info, for build
3683 // analysis.
3684 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003685 ArgStringList OriginalArgs;
3686 for (ArgList::const_iterator it = Args.begin(),
3687 ie = Args.end(); it != ie; ++it)
3688 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003689
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003690 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003691 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003692 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003693 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003694 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003695 }
3696 CmdArgs.push_back("-dwarf-debug-flags");
3697 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3698 }
3699
Eric Christopherd3804002013-02-22 20:12:52 +00003700 // Add the split debug info name to the command lines here so we
3701 // can propagate it to the backend.
3702 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003703 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003704 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003705 const char *SplitDwarfOut;
3706 if (SplitDwarf) {
3707 CmdArgs.push_back("-split-dwarf-file");
3708 SplitDwarfOut = SplitDebugName(Args, Inputs);
3709 CmdArgs.push_back(SplitDwarfOut);
3710 }
3711
3712 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003713 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3714 tools::visualstudio::Compile CL(getToolChain());
3715 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3716 LinkingOutput);
3717 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3718 } else {
3719 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3720 }
3721
Daniel Dunbar17731772009-03-23 19:03:36 +00003722
Eric Christopherf1545832013-02-22 23:50:16 +00003723 // Handle the debug info splitting at object creation time if we're
3724 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003725 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003726 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003727 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003728
Roman Divacky178e01602011-02-10 16:52:03 +00003729 if (Arg *A = Args.getLastArg(options::OPT_pg))
3730 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003731 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003732 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003733
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003734 // Claim some arguments which clang supports automatically.
3735
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003736 // -fpch-preprocess is used with gcc to add a special marker in the output to
3737 // include the PCH file. Clang's PTH solution is completely transparent, so we
3738 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003739 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003740
Daniel Dunbar17731772009-03-23 19:03:36 +00003741 // Claim some arguments which clang doesn't support, but we don't
3742 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003743 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3744 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003745
Rafael Espindolab0092d72013-09-04 19:37:35 +00003746 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003747 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003748}
3749
John McCall5fb5df92012-06-20 06:18:46 +00003750/// Add options related to the Objective-C runtime/ABI.
3751///
3752/// Returns true if the runtime is non-fragile.
3753ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3754 ArgStringList &cmdArgs,
3755 RewriteKind rewriteKind) const {
3756 // Look for the controlling runtime option.
3757 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3758 options::OPT_fgnu_runtime,
3759 options::OPT_fobjc_runtime_EQ);
3760
3761 // Just forward -fobjc-runtime= to the frontend. This supercedes
3762 // options about fragility.
3763 if (runtimeArg &&
3764 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3765 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003766 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003767 if (runtime.tryParse(value)) {
3768 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3769 << value;
3770 }
3771
3772 runtimeArg->render(args, cmdArgs);
3773 return runtime;
3774 }
3775
3776 // Otherwise, we'll need the ABI "version". Version numbers are
3777 // slightly confusing for historical reasons:
3778 // 1 - Traditional "fragile" ABI
3779 // 2 - Non-fragile ABI, version 1
3780 // 3 - Non-fragile ABI, version 2
3781 unsigned objcABIVersion = 1;
3782 // If -fobjc-abi-version= is present, use that to set the version.
3783 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003784 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003785 if (value == "1")
3786 objcABIVersion = 1;
3787 else if (value == "2")
3788 objcABIVersion = 2;
3789 else if (value == "3")
3790 objcABIVersion = 3;
3791 else
3792 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3793 << value;
3794 } else {
3795 // Otherwise, determine if we are using the non-fragile ABI.
3796 bool nonFragileABIIsDefault =
3797 (rewriteKind == RK_NonFragile ||
3798 (rewriteKind == RK_None &&
3799 getToolChain().IsObjCNonFragileABIDefault()));
3800 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3801 options::OPT_fno_objc_nonfragile_abi,
3802 nonFragileABIIsDefault)) {
3803 // Determine the non-fragile ABI version to use.
3804#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3805 unsigned nonFragileABIVersion = 1;
3806#else
3807 unsigned nonFragileABIVersion = 2;
3808#endif
3809
3810 if (Arg *abiArg = args.getLastArg(
3811 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003812 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003813 if (value == "1")
3814 nonFragileABIVersion = 1;
3815 else if (value == "2")
3816 nonFragileABIVersion = 2;
3817 else
3818 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3819 << value;
3820 }
3821
3822 objcABIVersion = 1 + nonFragileABIVersion;
3823 } else {
3824 objcABIVersion = 1;
3825 }
3826 }
3827
3828 // We don't actually care about the ABI version other than whether
3829 // it's non-fragile.
3830 bool isNonFragile = objcABIVersion != 1;
3831
3832 // If we have no runtime argument, ask the toolchain for its default runtime.
3833 // However, the rewriter only really supports the Mac runtime, so assume that.
3834 ObjCRuntime runtime;
3835 if (!runtimeArg) {
3836 switch (rewriteKind) {
3837 case RK_None:
3838 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3839 break;
3840 case RK_Fragile:
3841 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3842 break;
3843 case RK_NonFragile:
3844 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3845 break;
3846 }
3847
3848 // -fnext-runtime
3849 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3850 // On Darwin, make this use the default behavior for the toolchain.
3851 if (getToolChain().getTriple().isOSDarwin()) {
3852 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3853
3854 // Otherwise, build for a generic macosx port.
3855 } else {
3856 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3857 }
3858
3859 // -fgnu-runtime
3860 } else {
3861 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003862 // Legacy behaviour is to target the gnustep runtime if we are i
3863 // non-fragile mode or the GCC runtime in fragile mode.
3864 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003865 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003866 else
3867 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003868 }
3869
3870 cmdArgs.push_back(args.MakeArgString(
3871 "-fobjc-runtime=" + runtime.getAsString()));
3872 return runtime;
3873}
3874
Hans Wennborg75958c42013-08-08 00:17:41 +00003875void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3876 unsigned RTOptionID = options::OPT__SLASH_MT;
3877
Hans Wennborgf1a74252013-09-10 20:18:04 +00003878 if (Args.hasArg(options::OPT__SLASH_LDd))
3879 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3880 // but defining _DEBUG is sticky.
3881 RTOptionID = options::OPT__SLASH_MTd;
3882
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003883 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003884 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003885
Hans Wennborg75958c42013-08-08 00:17:41 +00003886 switch(RTOptionID) {
3887 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003888 if (Args.hasArg(options::OPT__SLASH_LDd))
3889 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003890 CmdArgs.push_back("-D_MT");
3891 CmdArgs.push_back("-D_DLL");
3892 CmdArgs.push_back("--dependent-lib=msvcrt");
3893 break;
3894 case options::OPT__SLASH_MDd:
3895 CmdArgs.push_back("-D_DEBUG");
3896 CmdArgs.push_back("-D_MT");
3897 CmdArgs.push_back("-D_DLL");
3898 CmdArgs.push_back("--dependent-lib=msvcrtd");
3899 break;
3900 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003901 if (Args.hasArg(options::OPT__SLASH_LDd))
3902 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003903 CmdArgs.push_back("-D_MT");
3904 CmdArgs.push_back("--dependent-lib=libcmt");
3905 break;
3906 case options::OPT__SLASH_MTd:
3907 CmdArgs.push_back("-D_DEBUG");
3908 CmdArgs.push_back("-D_MT");
3909 CmdArgs.push_back("--dependent-lib=libcmtd");
3910 break;
3911 default:
3912 llvm_unreachable("Unexpected option ID.");
3913 }
3914
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003915 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3916 // users want. The /Za flag to cl.exe turns this off, but it's not
3917 // implemented in clang.
3918 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003919
3920 // FIXME: Make this default for the win32 triple.
3921 CmdArgs.push_back("-cxx-abi");
3922 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00003923
3924 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3925 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003926
3927 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3928 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003929 if (Args.hasArg(options::OPT__SLASH_fallback))
3930 CmdArgs.push_back("msvc-fallback");
3931 else
3932 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003933 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003934}
3935
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003936void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003937 const InputInfo &Output,
3938 const InputInfoList &Inputs,
3939 const ArgList &Args,
3940 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003941 ArgStringList CmdArgs;
3942
3943 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3944 const InputInfo &Input = Inputs[0];
3945
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003946 // Don't warn about "clang -w -c foo.s"
3947 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003948 // and "clang -emit-llvm -c foo.s"
3949 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003950
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003951 // Invoke ourselves in -cc1as mode.
3952 //
3953 // FIXME: Implement custom jobs for internal actions.
3954 CmdArgs.push_back("-cc1as");
3955
3956 // Add the "effective" target triple.
3957 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003958 std::string TripleStr =
3959 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003960 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3961
3962 // Set the output mode, we currently only expect to be used as a real
3963 // assembler.
3964 CmdArgs.push_back("-filetype");
3965 CmdArgs.push_back("obj");
3966
Eric Christopher45f2e712012-12-18 00:31:10 +00003967 // Set the main file name, so that debug info works even with
3968 // -save-temps or preprocessed assembly.
3969 CmdArgs.push_back("-main-file-name");
3970 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3971
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003972 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003973 const llvm::Triple &Triple = getToolChain().getTriple();
3974 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003975 if (!CPU.empty()) {
3976 CmdArgs.push_back("-target-cpu");
3977 CmdArgs.push_back(Args.MakeArgString(CPU));
3978 }
3979
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003980 // Add the target features
3981 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003982 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00003983
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003984 // Ignore explicit -force_cpusubtype_ALL option.
3985 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003986
Eric Christopherfc3ee562012-01-10 00:38:01 +00003987 // Determine the original source input.
3988 const Action *SourceAction = &JA;
3989 while (SourceAction->getKind() != Action::InputClass) {
3990 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3991 SourceAction = SourceAction->getInputs()[0];
3992 }
3993
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003994 // Forward -g and handle debug info related flags, assuming we are dealing
3995 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003996 if (SourceAction->getType() == types::TY_Asm ||
3997 SourceAction->getType() == types::TY_PP_Asm) {
3998 Args.ClaimAllArgs(options::OPT_g_Group);
3999 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4000 if (!A->getOption().matches(options::OPT_g0))
4001 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004002
4003 // Add the -fdebug-compilation-dir flag if needed.
4004 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004005
4006 // Set the AT_producer to the clang version when using the integrated
4007 // assembler on assembly source files.
4008 CmdArgs.push_back("-dwarf-debug-producer");
4009 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004010 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004011
4012 // Optionally embed the -cc1as level arguments into the debug info, for build
4013 // analysis.
4014 if (getToolChain().UseDwarfDebugFlags()) {
4015 ArgStringList OriginalArgs;
4016 for (ArgList::const_iterator it = Args.begin(),
4017 ie = Args.end(); it != ie; ++it)
4018 (*it)->render(Args, OriginalArgs);
4019
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004020 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004021 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4022 Flags += Exec;
4023 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4024 Flags += " ";
4025 Flags += OriginalArgs[i];
4026 }
4027 CmdArgs.push_back("-dwarf-debug-flags");
4028 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4029 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004030
4031 // FIXME: Add -static support, once we have it.
4032
David Blaikie9260ed62013-07-25 21:19:01 +00004033 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4034 getToolChain().getDriver());
4035
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004036 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004037
4038 assert(Output.isFilename() && "Unexpected lipo output.");
4039 CmdArgs.push_back("-o");
4040 CmdArgs.push_back(Output.getFilename());
4041
Daniel Dunbarb440f562010-08-02 02:38:21 +00004042 assert(Input.isFilename() && "Invalid input.");
4043 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004044
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004045 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004046 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004047
4048 // Handle the debug info splitting at object creation time if we're
4049 // creating an object.
4050 // TODO: Currently only works on linux with newer objcopy.
4051 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004052 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004053 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4054 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004055}
4056
Daniel Dunbara3246a02009-03-18 08:07:30 +00004057void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004058 const InputInfo &Output,
4059 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004060 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004061 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004062 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004063 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004064
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004065 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004066 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004067 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004068 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004069 // Don't forward any -g arguments to assembly steps.
4070 if (isa<AssembleJobAction>(JA) &&
4071 A->getOption().matches(options::OPT_g_Group))
4072 continue;
4073
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004074 // Don't forward any -W arguments to assembly and link steps.
4075 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4076 A->getOption().matches(options::OPT_W_Group))
4077 continue;
4078
Daniel Dunbar2da02722009-03-19 07:55:12 +00004079 // It is unfortunate that we have to claim here, as this means
4080 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004081 // platforms using a generic gcc, even if we are just using gcc
4082 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004083 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004084 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004085 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004086 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004087
Daniel Dunbar4e295052010-01-25 22:35:08 +00004088 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004089
4090 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004091 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004092 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004093 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004094
4095 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004096 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004097 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004098 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004099 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004100 else if (Arch == llvm::Triple::ppc64le)
4101 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004102 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004103 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004104 }
4105
Daniel Dunbar5716d872009-05-02 21:41:52 +00004106 // Try to force gcc to match the tool chain we want, if we recognize
4107 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004108 //
4109 // FIXME: The triple class should directly provide the information we want
4110 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004111 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004112 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004113 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4114 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004115 CmdArgs.push_back("-m64");
4116
Daniel Dunbarb440f562010-08-02 02:38:21 +00004117 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004118 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004119 CmdArgs.push_back(Output.getFilename());
4120 } else {
4121 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004122 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004123 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004124
Tony Linthicum76329bf2011-12-12 21:14:55 +00004125 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4126 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004127
4128 // Only pass -x if gcc will understand it; otherwise hope gcc
4129 // understands the suffix correctly. The main use case this would go
4130 // wrong in is for linker inputs if they happened to have an odd
4131 // suffix; really the only way to get this to happen is a command
4132 // like '-x foobar a.c' which will treat a.c like a linker input.
4133 //
4134 // FIXME: For the linker case specifically, can we safely convert
4135 // inputs into '-Wl,' options?
4136 for (InputInfoList::const_iterator
4137 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4138 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004139
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004140 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004141 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4142 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004143 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004144 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004145 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004146 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004147 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004148 else if (II.getType() == types::TY_ModuleFile)
4149 D.Diag(diag::err_drv_no_module_support)
4150 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004151
Daniel Dunbara3246a02009-03-18 08:07:30 +00004152 if (types::canTypeBeUserSpecified(II.getType())) {
4153 CmdArgs.push_back("-x");
4154 CmdArgs.push_back(types::getTypeName(II.getType()));
4155 }
4156
Daniel Dunbarb440f562010-08-02 02:38:21 +00004157 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004158 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004159 else {
4160 const Arg &A = II.getInputArg();
4161
4162 // Reverse translate some rewritten options.
4163 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4164 CmdArgs.push_back("-lstdc++");
4165 continue;
4166 }
4167
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004168 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004169 A.render(Args, CmdArgs);
4170 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004171 }
4172
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004173 const std::string customGCCName = D.getCCCGenericGCCName();
4174 const char *GCCName;
4175 if (!customGCCName.empty())
4176 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004177 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004178 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004179 } else
4180 GCCName = "gcc";
4181
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004182 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004183 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004184 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004185}
4186
Daniel Dunbar4e295052010-01-25 22:35:08 +00004187void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4188 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004189 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004190}
4191
Daniel Dunbar4e295052010-01-25 22:35:08 +00004192void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4193 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004194 const Driver &D = getToolChain().getDriver();
4195
Daniel Dunbar4e295052010-01-25 22:35:08 +00004196 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004197 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4198 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004199 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004200 else {
4201 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004202 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004203 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004204
Daniel Dunbar4e295052010-01-25 22:35:08 +00004205 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004206 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004207}
4208
Daniel Dunbar4e295052010-01-25 22:35:08 +00004209void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4210 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004211 // The types are (hopefully) good enough.
4212}
4213
Tony Linthicum76329bf2011-12-12 21:14:55 +00004214// Hexagon tools start.
4215void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4216 ArgStringList &CmdArgs) const {
4217
4218}
4219void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4220 const InputInfo &Output,
4221 const InputInfoList &Inputs,
4222 const ArgList &Args,
4223 const char *LinkingOutput) const {
4224
4225 const Driver &D = getToolChain().getDriver();
4226 ArgStringList CmdArgs;
4227
4228 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004229 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004230 CmdArgs.push_back(Args.MakeArgString(MarchString));
4231
4232 RenderExtraToolArgs(JA, CmdArgs);
4233
4234 if (Output.isFilename()) {
4235 CmdArgs.push_back("-o");
4236 CmdArgs.push_back(Output.getFilename());
4237 } else {
4238 assert(Output.isNothing() && "Unexpected output");
4239 CmdArgs.push_back("-fsyntax-only");
4240 }
4241
Matthew Curtise8f80a12012-12-06 17:49:03 +00004242 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4243 if (!SmallDataThreshold.empty())
4244 CmdArgs.push_back(
4245 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004246
Matthew Curtise5df3812012-12-07 17:23:04 +00004247 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4248 options::OPT_Xassembler);
4249
Tony Linthicum76329bf2011-12-12 21:14:55 +00004250 // Only pass -x if gcc will understand it; otherwise hope gcc
4251 // understands the suffix correctly. The main use case this would go
4252 // wrong in is for linker inputs if they happened to have an odd
4253 // suffix; really the only way to get this to happen is a command
4254 // like '-x foobar a.c' which will treat a.c like a linker input.
4255 //
4256 // FIXME: For the linker case specifically, can we safely convert
4257 // inputs into '-Wl,' options?
4258 for (InputInfoList::const_iterator
4259 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4260 const InputInfo &II = *it;
4261
4262 // Don't try to pass LLVM or AST inputs to a generic gcc.
4263 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4264 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4265 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4266 << getToolChain().getTripleString();
4267 else if (II.getType() == types::TY_AST)
4268 D.Diag(clang::diag::err_drv_no_ast_support)
4269 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004270 else if (II.getType() == types::TY_ModuleFile)
4271 D.Diag(diag::err_drv_no_module_support)
4272 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004273
4274 if (II.isFilename())
4275 CmdArgs.push_back(II.getFilename());
4276 else
4277 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4278 II.getInputArg().render(Args, CmdArgs);
4279 }
4280
4281 const char *GCCName = "hexagon-as";
4282 const char *Exec =
4283 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4284 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4285
4286}
4287void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4288 ArgStringList &CmdArgs) const {
4289 // The types are (hopefully) good enough.
4290}
4291
4292void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4293 const InputInfo &Output,
4294 const InputInfoList &Inputs,
4295 const ArgList &Args,
4296 const char *LinkingOutput) const {
4297
Matthew Curtise689b052012-12-06 15:46:07 +00004298 const toolchains::Hexagon_TC& ToolChain =
4299 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4300 const Driver &D = ToolChain.getDriver();
4301
Tony Linthicum76329bf2011-12-12 21:14:55 +00004302 ArgStringList CmdArgs;
4303
Matthew Curtise689b052012-12-06 15:46:07 +00004304 //----------------------------------------------------------------------------
4305 //
4306 //----------------------------------------------------------------------------
4307 bool hasStaticArg = Args.hasArg(options::OPT_static);
4308 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004309 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004310 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4311 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4312 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4313 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004314
Matthew Curtise689b052012-12-06 15:46:07 +00004315 //----------------------------------------------------------------------------
4316 // Silence warnings for various options
4317 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004318
Matthew Curtise689b052012-12-06 15:46:07 +00004319 Args.ClaimAllArgs(options::OPT_g_Group);
4320 Args.ClaimAllArgs(options::OPT_emit_llvm);
4321 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4322 // handled somewhere else.
4323 Args.ClaimAllArgs(options::OPT_static_libgcc);
4324
4325 //----------------------------------------------------------------------------
4326 //
4327 //----------------------------------------------------------------------------
4328 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4329 e = ToolChain.ExtraOpts.end();
4330 i != e; ++i)
4331 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004332
Matthew Curtisf10a5952012-12-06 14:16:43 +00004333 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4334 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004335
Matthew Curtise689b052012-12-06 15:46:07 +00004336 if (buildingLib) {
4337 CmdArgs.push_back("-shared");
4338 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4339 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004340 }
4341
Matthew Curtise689b052012-12-06 15:46:07 +00004342 if (hasStaticArg)
4343 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004344
Matthew Curtise8f80a12012-12-06 17:49:03 +00004345 if (buildPIE && !buildingLib)
4346 CmdArgs.push_back("-pie");
4347
4348 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4349 if (!SmallDataThreshold.empty()) {
4350 CmdArgs.push_back(
4351 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4352 }
4353
Matthew Curtise689b052012-12-06 15:46:07 +00004354 //----------------------------------------------------------------------------
4355 //
4356 //----------------------------------------------------------------------------
4357 CmdArgs.push_back("-o");
4358 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004359
Matthew Curtise689b052012-12-06 15:46:07 +00004360 const std::string MarchSuffix = "/" + MarchString;
4361 const std::string G0Suffix = "/G0";
4362 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4363 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4364 + "/";
4365 const std::string StartFilesDir = RootDir
4366 + "hexagon/lib"
4367 + (buildingLib
4368 ? MarchG0Suffix : MarchSuffix);
4369
4370 //----------------------------------------------------------------------------
4371 // moslib
4372 //----------------------------------------------------------------------------
4373 std::vector<std::string> oslibs;
4374 bool hasStandalone= false;
4375
4376 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4377 ie = Args.filtered_end(); it != ie; ++it) {
4378 (*it)->claim();
4379 oslibs.push_back((*it)->getValue());
4380 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004381 }
Matthew Curtise689b052012-12-06 15:46:07 +00004382 if (oslibs.empty()) {
4383 oslibs.push_back("standalone");
4384 hasStandalone = true;
4385 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004386
Matthew Curtise689b052012-12-06 15:46:07 +00004387 //----------------------------------------------------------------------------
4388 // Start Files
4389 //----------------------------------------------------------------------------
4390 if (incStdLib && incStartFiles) {
4391
4392 if (!buildingLib) {
4393 if (hasStandalone) {
4394 CmdArgs.push_back(
4395 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4396 }
4397 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4398 }
4399 std::string initObj = useShared ? "/initS.o" : "/init.o";
4400 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4401 }
4402
4403 //----------------------------------------------------------------------------
4404 // Library Search Paths
4405 //----------------------------------------------------------------------------
4406 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4407 for (ToolChain::path_list::const_iterator
4408 i = LibPaths.begin(),
4409 e = LibPaths.end();
4410 i != e;
4411 ++i)
4412 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4413
4414 //----------------------------------------------------------------------------
4415 //
4416 //----------------------------------------------------------------------------
4417 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4418 Args.AddAllArgs(CmdArgs, options::OPT_e);
4419 Args.AddAllArgs(CmdArgs, options::OPT_s);
4420 Args.AddAllArgs(CmdArgs, options::OPT_t);
4421 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4422
4423 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4424
4425 //----------------------------------------------------------------------------
4426 // Libraries
4427 //----------------------------------------------------------------------------
4428 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004429 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004430 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4431 CmdArgs.push_back("-lm");
4432 }
4433
4434 CmdArgs.push_back("--start-group");
4435
4436 if (!buildingLib) {
4437 for(std::vector<std::string>::iterator i = oslibs.begin(),
4438 e = oslibs.end(); i != e; ++i)
4439 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4440 CmdArgs.push_back("-lc");
4441 }
4442 CmdArgs.push_back("-lgcc");
4443
4444 CmdArgs.push_back("--end-group");
4445 }
4446
4447 //----------------------------------------------------------------------------
4448 // End files
4449 //----------------------------------------------------------------------------
4450 if (incStdLib && incStartFiles) {
4451 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4452 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4453 }
4454
4455 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004456 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004457}
4458// Hexagon tools end.
4459
Bernard Ogden31561762013-12-12 13:27:11 +00004460/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4461//
4462// FIXME: tblgen this.
4463const char *arm::getARMCPUForMArch(const ArgList &Args,
4464 const llvm::Triple &Triple) {
4465 StringRef MArch;
4466 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4467 // Otherwise, if we have -march= choose the base CPU for that arch.
4468 MArch = A->getValue();
4469 } else {
4470 // Otherwise, use the Arch from the triple.
4471 MArch = Triple.getArchName();
4472 }
4473
4474 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004475 if (MArch == "native") {
4476 std::string CPU = llvm::sys::getHostCPUName();
4477 if (CPU != "generic") {
4478 // Translate the native cpu into the architecture. The switch below will
4479 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004480 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004481 }
4482 }
4483
4484 if (Triple.getOS() == llvm::Triple::NetBSD) {
4485 if (MArch == "armv6")
4486 return "arm1176jzf-s";
4487 }
4488
4489 const char *result = llvm::StringSwitch<const char *>(MArch)
4490 .Cases("armv2", "armv2a","arm2")
4491 .Case("armv3", "arm6")
4492 .Case("armv3m", "arm7m")
4493 .Case("armv4", "strongarm")
4494 .Case("armv4t", "arm7tdmi")
4495 .Case("thumbv4t", "arm7tdmi")
4496 .Cases("armv5", "armv5t", "arm10tdmi")
4497 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4498 .Cases("armv5e", "armv5te", "arm1022e")
4499 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4500 .Case("armv5tej", "arm926ej-s")
4501 .Case("thumbv5tej", "arm926ej-s")
4502 .Cases("armv6", "armv6k", "arm1136jf-s")
4503 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4504 .Case("armv6j", "arm1136j-s")
4505 .Case("thumbv6j", "arm1136j-s")
4506 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4507 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4508 .Case("armv6t2", "arm1156t2-s")
4509 .Case("thumbv6t2", "arm1156t2-s")
4510 .Cases("armv6m", "armv6-m", "cortex-m0")
4511 .Case("thumbv6m", "cortex-m0")
4512 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
4513 .Cases("thumbv7", "thumbv7a", "cortex-a8")
4514 .Cases("armv7l", "armv7-l", "cortex-a8")
4515 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
4516 .Cases("armv7s", "armv7-s", "swift")
4517 .Cases("armv7r", "armv7-r", "cortex-r4")
4518 .Case("thumbv7r", "cortex-r4")
4519 .Cases("armv7m", "armv7-m", "cortex-m3")
4520 .Case("thumbv7m", "cortex-m3")
4521 .Cases("armv7em", "armv7e-m", "cortex-m4")
4522 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
4523 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
4524 .Cases("thumbv8", "thumbv8a", "cortex-a53")
4525 .Case("ep9312", "ep9312")
4526 .Case("iwmmxt", "iwmmxt")
4527 .Case("xscale", "xscale")
4528 // If all else failed, return the most base CPU with thumb interworking
4529 // supported by LLVM.
4530 .Default(0);
4531
4532 if (result)
4533 return result;
4534
4535 return
4536 Triple.getEnvironment() == llvm::Triple::GNUEABIHF
4537 ? "arm1176jzf-s"
4538 : "arm7tdmi";
4539}
4540
4541/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004542StringRef arm::getARMTargetCPU(const ArgList &Args,
4543 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004544 // FIXME: Warn on inconsistent use of -mcpu and -march.
4545 // If we have -mcpu=, use that.
4546 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4547 StringRef MCPU = A->getValue();
4548 // Handle -mcpu=native.
4549 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004550 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004551 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004552 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004553 }
4554
4555 return getARMCPUForMArch(Args, Triple);
4556}
4557
4558/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4559/// CPU.
4560//
4561// FIXME: This is redundant with -mcpu, why does LLVM use this.
4562// FIXME: tblgen this, or kill it!
4563const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4564 return llvm::StringSwitch<const char *>(CPU)
4565 .Case("strongarm", "v4")
4566 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4567 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4568 .Cases("arm920", "arm920t", "arm922t", "v4t")
4569 .Cases("arm940t", "ep9312","v4t")
4570 .Cases("arm10tdmi", "arm1020t", "v5")
4571 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4572 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4573 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4574 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4575 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4576 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
4577 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
4578 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4579 .Cases("cortex-r4", "cortex-r5", "v7r")
4580 .Case("cortex-m0", "v6m")
4581 .Case("cortex-m3", "v7m")
4582 .Case("cortex-m4", "v7em")
4583 .Case("cortex-a9-mp", "v7f")
4584 .Case("swift", "v7s")
4585 .Cases("cortex-a53", "cortex-a57", "v8")
4586 .Default("");
4587}
4588
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004589llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4590 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4591 // archs which Darwin doesn't use.
4592
4593 // The matching this routine does is fairly pointless, since it is neither the
4594 // complete architecture list, nor a reasonable subset. The problem is that
4595 // historically the driver driver accepts this and also ties its -march=
4596 // handling to the architecture name, so we need to be careful before removing
4597 // support for it.
4598
4599 // This code must be kept in sync with Clang's Darwin specific argument
4600 // translation.
4601
4602 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4603 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4604 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4605 .Case("ppc64", llvm::Triple::ppc64)
4606 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4607 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4608 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004609 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004610 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004611 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4612 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4613 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004614 .Case("r600", llvm::Triple::r600)
4615 .Case("nvptx", llvm::Triple::nvptx)
4616 .Case("nvptx64", llvm::Triple::nvptx64)
4617 .Case("amdil", llvm::Triple::amdil)
4618 .Case("spir", llvm::Triple::spir)
4619 .Default(llvm::Triple::UnknownArch);
4620}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004621
Bob Wilsondecc03e2012-11-23 06:14:39 +00004622const char *Clang::getBaseInputName(const ArgList &Args,
4623 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004624 return Args.MakeArgString(
4625 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004626}
4627
Bob Wilsondecc03e2012-11-23 06:14:39 +00004628const char *Clang::getBaseInputStem(const ArgList &Args,
4629 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004630 const char *Str = getBaseInputName(Args, Inputs);
4631
Chris Lattner906bb902011-01-16 08:14:11 +00004632 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004633 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004634
4635 return Str;
4636}
4637
Bob Wilsondecc03e2012-11-23 06:14:39 +00004638const char *Clang::getDependencyFileName(const ArgList &Args,
4639 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004640 // FIXME: Think about this more.
4641 std::string Res;
4642
4643 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004644 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004645 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004646 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004647 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004648 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004649 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004650}
4651
Daniel Dunbarbe220842009-03-20 16:06:39 +00004652void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004653 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004654 const InputInfoList &Inputs,
4655 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004656 const char *LinkingOutput) const {
4657 ArgStringList CmdArgs;
4658
4659 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4660 const InputInfo &Input = Inputs[0];
4661
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004662 // Determine the original source input.
4663 const Action *SourceAction = &JA;
4664 while (SourceAction->getKind() != Action::InputClass) {
4665 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4666 SourceAction = SourceAction->getInputs()[0];
4667 }
4668
Kevin Enderby319baa42013-11-18 23:30:29 +00004669 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4670 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004671 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4672 // FIXME: at run-time detect assembler capabilities or rely on version
4673 // information forwarded by -target-assembler-version (future)
4674 if (Args.hasArg(options::OPT_no_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004675 const llvm::Triple &T(getToolChain().getTriple());
4676 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004677 CmdArgs.push_back("-Q");
4678 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004679
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004680 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004681 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004682 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004683 if (Args.hasArg(options::OPT_gstabs))
4684 CmdArgs.push_back("--gstabs");
4685 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004686 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004687 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004688
Daniel Dunbarbe220842009-03-20 16:06:39 +00004689 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004690 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004691
Daniel Dunbar6d484762010-07-22 01:47:22 +00004692 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004693 if (getToolChain().getArch() == llvm::Triple::x86 ||
4694 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004695 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4696 CmdArgs.push_back("-force_cpusubtype_ALL");
4697
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004698 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004699 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004700 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004701 (!getDarwinToolChain().isTargetIPhoneOS() ||
4702 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4703 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004704 CmdArgs.push_back("-static");
4705
Daniel Dunbarbe220842009-03-20 16:06:39 +00004706 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4707 options::OPT_Xassembler);
4708
4709 assert(Output.isFilename() && "Unexpected lipo output.");
4710 CmdArgs.push_back("-o");
4711 CmdArgs.push_back(Output.getFilename());
4712
Daniel Dunbarb440f562010-08-02 02:38:21 +00004713 assert(Input.isFilename() && "Invalid input.");
4714 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004715
4716 // asm_final spec is empty.
4717
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004718 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004719 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004720 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004721}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004722
David Blaikie68e081d2011-12-20 02:48:34 +00004723void darwin::DarwinTool::anchor() {}
4724
Daniel Dunbare9ded432009-09-09 18:36:20 +00004725void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4726 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004727 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004728
Daniel Dunbarc1964212009-03-26 16:23:12 +00004729 // Derived from darwin_arch spec.
4730 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004731 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004732
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004733 // FIXME: Is this needed anymore?
4734 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004735 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004736}
4737
Bill Wendling3b2000f2012-10-02 18:02:50 +00004738bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4739 // We only need to generate a temp path for LTO if we aren't compiling object
4740 // files. When compiling source files, we run 'dsymutil' after linking. We
4741 // don't run 'dsymutil' when compiling object files.
4742 for (InputInfoList::const_iterator
4743 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4744 if (it->getType() != types::TY_Object)
4745 return true;
4746
4747 return false;
4748}
4749
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004750void darwin::Link::AddLinkArgs(Compilation &C,
4751 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004752 ArgStringList &CmdArgs,
4753 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004754 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004755 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004756
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004757 unsigned Version[3] = { 0, 0, 0 };
4758 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4759 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004760 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004761 Version[1], Version[2], HadExtra) ||
4762 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004763 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004764 << A->getAsString(Args);
4765 }
4766
4767 // Newer linkers support -demangle, pass it if supported and not disabled by
4768 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004769 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004770 // Don't pass -demangle to ld_classic.
4771 //
4772 // FIXME: This is a temporary workaround, ld should be handling this.
4773 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4774 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004775 if (getToolChain().getArch() == llvm::Triple::x86) {
4776 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4777 options::OPT_Wl_COMMA),
4778 ie = Args.filtered_end(); it != ie; ++it) {
4779 const Arg *A = *it;
4780 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004781 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004782 UsesLdClassic = true;
4783 }
4784 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004785 if (!UsesLdClassic)
4786 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004787 }
4788
Bob Wilson3d27dad2013-08-02 22:25:34 +00004789 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4790 CmdArgs.push_back("-export_dynamic");
4791
Bill Wendling313b6bf2012-11-16 23:03:00 +00004792 // If we are using LTO, then automatically create a temporary file path for
4793 // the linker to use, so that it's lifetime will extend past a possible
4794 // dsymutil step.
4795 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4796 const char *TmpPath = C.getArgs().MakeArgString(
4797 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4798 C.addTempFile(TmpPath);
4799 CmdArgs.push_back("-object_path_lto");
4800 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004801 }
4802
Daniel Dunbarc1964212009-03-26 16:23:12 +00004803 // Derived from the "link" spec.
4804 Args.AddAllArgs(CmdArgs, options::OPT_static);
4805 if (!Args.hasArg(options::OPT_static))
4806 CmdArgs.push_back("-dynamic");
4807 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4808 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4809 // here. How do we wish to handle such things?
4810 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004811
Daniel Dunbarc1964212009-03-26 16:23:12 +00004812 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004813 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004814 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004815 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004816
4817 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4818 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4819 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4820
4821 Arg *A;
4822 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4823 (A = Args.getLastArg(options::OPT_current__version)) ||
4824 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004825 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004826 << A->getAsString(Args) << "-dynamiclib";
4827
4828 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4829 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4830 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4831 } else {
4832 CmdArgs.push_back("-dylib");
4833
4834 Arg *A;
4835 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4836 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4837 (A = Args.getLastArg(options::OPT_client__name)) ||
4838 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4839 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4840 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004841 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004842 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004843
Daniel Dunbarc1964212009-03-26 16:23:12 +00004844 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4845 "-dylib_compatibility_version");
4846 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4847 "-dylib_current_version");
4848
Daniel Dunbara48823f2010-01-22 02:04:52 +00004849 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004850
4851 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4852 "-dylib_install_name");
4853 }
4854
4855 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4856 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4857 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover9c7e0352013-12-12 11:55:52 +00004858 if (DarwinTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004859 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004860 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4861 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4862 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4863 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4864 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4865 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004866 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004867 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4868 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4869 Args.AddAllArgs(CmdArgs, options::OPT_init);
4870
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004871 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004872 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004873
4874 // If we had an explicit -mios-simulator-version-min argument, honor that,
4875 // otherwise use the traditional deployment targets. We can't just check the
4876 // is-sim attribute because existing code follows this path, and the linker
4877 // may not handle the argument.
4878 //
4879 // FIXME: We may be able to remove this, once we can verify no one depends on
4880 // it.
Tim Northover9c7e0352013-12-12 11:55:52 +00004881 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004882 CmdArgs.push_back("-ios_simulator_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004883 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4884 } else if (DarwinTC.isTargetIOSBased()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004885 CmdArgs.push_back("-iphoneos_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004886 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4887 } else if (DarwinTC.isTargetMacOS()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004888 CmdArgs.push_back("-macosx_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004889 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4890 }
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004891
Daniel Dunbarc1964212009-03-26 16:23:12 +00004892 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4893 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4894 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4895 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4896 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004897
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004898 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4899 options::OPT_fno_pie,
4900 options::OPT_fno_PIE)) {
4901 if (A->getOption().matches(options::OPT_fpie) ||
4902 A->getOption().matches(options::OPT_fPIE))
4903 CmdArgs.push_back("-pie");
4904 else
4905 CmdArgs.push_back("-no_pie");
4906 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004907
4908 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4909 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4910 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4911 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4912 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4913 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4914 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4915 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4916 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4917 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4918 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4919 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4920 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4921 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4922 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4923 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004924
Daniel Dunbar84384642011-05-02 21:03:47 +00004925 // Give --sysroot= preference, over the Apple specific behavior to also use
4926 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004927 StringRef sysroot = C.getSysRoot();
4928 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004929 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004930 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004931 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4932 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004933 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004934 }
4935
Daniel Dunbarc1964212009-03-26 16:23:12 +00004936 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4937 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4938 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4939 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4940 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004941 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004942 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4943 Args.AddAllArgs(CmdArgs, options::OPT_y);
4944 Args.AddLastArg(CmdArgs, options::OPT_w);
4945 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4946 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4947 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4948 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4949 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4950 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4951 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4952 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4953 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4954 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4955 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4956 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4957}
4958
4959void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004960 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004961 const InputInfoList &Inputs,
4962 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004963 const char *LinkingOutput) const {
4964 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004965
Daniel Dunbarc1964212009-03-26 16:23:12 +00004966 // The logic here is derived from gcc's behavior; most of which
4967 // comes from specs (starting with link_command). Consult gcc for
4968 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004969 ArgStringList CmdArgs;
4970
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004971 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4972 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4973 options::OPT_ccc_arcmt_migrate)) {
4974 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4975 (*I)->claim();
4976 const char *Exec =
4977 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4978 CmdArgs.push_back(Output.getFilename());
4979 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4980 return;
4981 }
4982
Daniel Dunbarc1964212009-03-26 16:23:12 +00004983 // I'm not sure why this particular decomposition exists in gcc, but
4984 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004985 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004986
Daniel Dunbarc1964212009-03-26 16:23:12 +00004987 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4988 Args.AddAllArgs(CmdArgs, options::OPT_s);
4989 Args.AddAllArgs(CmdArgs, options::OPT_t);
4990 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4991 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004992 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004993 Args.AddAllArgs(CmdArgs, options::OPT_r);
4994
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004995 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4996 // members of static archive libraries which implement Objective-C classes or
4997 // categories.
4998 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4999 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005000
Daniel Dunbarc1964212009-03-26 16:23:12 +00005001 CmdArgs.push_back("-o");
5002 CmdArgs.push_back(Output.getFilename());
5003
Chad Rosier06fd3c62012-05-16 23:45:12 +00005004 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005005 !Args.hasArg(options::OPT_nostartfiles)) {
5006 // Derived from startfile spec.
5007 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005008 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00005009 if (getDarwinToolChain().isTargetIOSSimulator()) {
5010 // The simulator doesn't have a versioned crt1 file.
5011 CmdArgs.push_back("-ldylib1.o");
5012 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005013 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5014 CmdArgs.push_back("-ldylib1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005015 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005016 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00005017 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005018 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005019 CmdArgs.push_back("-ldylib1.10.5.o");
5020 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005021 } else {
5022 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005023 if (!Args.hasArg(options::OPT_static)) {
5024 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00005025 if (getDarwinToolChain().isTargetIOSSimulator()) {
5026 // The simulator doesn't have a versioned crt1 file.
5027 CmdArgs.push_back("-lbundle1.o");
5028 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005029 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5030 CmdArgs.push_back("-lbundle1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005031 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005032 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005033 CmdArgs.push_back("-lbundle1.o");
5034 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005035 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005036 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00005037 if (Args.hasArg(options::OPT_pg) &&
5038 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00005039 if (Args.hasArg(options::OPT_static) ||
5040 Args.hasArg(options::OPT_object) ||
5041 Args.hasArg(options::OPT_preload)) {
5042 CmdArgs.push_back("-lgcrt0.o");
5043 } else {
5044 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005045
Daniel Dunbarc1964212009-03-26 16:23:12 +00005046 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005047 }
Bob Wilsonef285b42012-07-04 00:18:41 +00005048 // By default on OS X 10.8 and later, we don't link with a crt1.o
5049 // file and the linker knows to use _main as the entry point. But,
5050 // when compiling with -pg, we need to link with the gcrt1.o file,
5051 // so pass the -no_new_main option to tell the linker to use the
5052 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00005053 if (getDarwinToolChain().isTargetMacOS() &&
5054 !getDarwinToolChain().isMacosxVersionLT(10, 8))
5055 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005056 } else {
5057 if (Args.hasArg(options::OPT_static) ||
5058 Args.hasArg(options::OPT_object) ||
5059 Args.hasArg(options::OPT_preload)) {
5060 CmdArgs.push_back("-lcrt0.o");
5061 } else {
5062 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00005063 if (getDarwinToolChain().isTargetIOSSimulator()) {
5064 // The simulator doesn't have a versioned crt1 file.
5065 CmdArgs.push_back("-lcrt1.o");
5066 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005067 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5068 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005069 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00005070 CmdArgs.push_back("-lcrt1.3.1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005071 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005072 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
5073 CmdArgs.push_back("-lcrt1.o");
5074 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
5075 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005076 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005077 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005078
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005079 // darwin_crt2 spec is empty.
5080 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005081 }
5082 }
5083 }
5084 }
5085
Tim Northover9c7e0352013-12-12 11:55:52 +00005086 if (getDarwinToolChain().isTargetMacOS() &&
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005087 Args.hasArg(options::OPT_shared_libgcc) &&
5088 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005089 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005090 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005091 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005092 }
5093 }
5094
5095 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005096
Daniel Dunbarc1964212009-03-26 16:23:12 +00005097 if (Args.hasArg(options::OPT_fopenmp))
5098 // This is more complicated in gcc...
5099 CmdArgs.push_back("-lgomp");
5100
Douglas Gregor9295df02012-05-15 21:00:27 +00005101 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5102
Bob Wilson16d93952012-05-15 18:57:39 +00005103 if (isObjCRuntimeLinked(Args) &&
5104 !Args.hasArg(options::OPT_nostdlib) &&
5105 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005106 // Avoid linking compatibility stubs on i386 mac.
5107 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005108 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005109 // If we don't have ARC or subscripting runtime support, link in the
5110 // runtime stubs. We have to do this *before* adding any of the normal
5111 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00005112 ObjCRuntime runtime =
5113 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005114 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00005115 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00005116 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00005117 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005118 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005119 CmdArgs.push_back("-framework");
5120 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005121 // Link libobj.
5122 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005123 }
John McCall31168b02011-06-15 23:02:42 +00005124
Daniel Dunbarc1964212009-03-26 16:23:12 +00005125 if (LinkingOutput) {
5126 CmdArgs.push_back("-arch_multiple");
5127 CmdArgs.push_back("-final_output");
5128 CmdArgs.push_back(LinkingOutput);
5129 }
5130
Daniel Dunbarc1964212009-03-26 16:23:12 +00005131 if (Args.hasArg(options::OPT_fnested_functions))
5132 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005133
Daniel Dunbarc1964212009-03-26 16:23:12 +00005134 if (!Args.hasArg(options::OPT_nostdlib) &&
5135 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005136 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005137 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005138
Daniel Dunbarc1964212009-03-26 16:23:12 +00005139 // link_ssp spec is empty.
5140
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005141 // Let the tool chain choose which runtime library to link.
5142 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005143 }
5144
Chad Rosier06fd3c62012-05-16 23:45:12 +00005145 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005146 !Args.hasArg(options::OPT_nostartfiles)) {
5147 // endfile_spec is empty.
5148 }
5149
5150 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5151 Args.AddAllArgs(CmdArgs, options::OPT_F);
5152
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005153 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005154 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005155 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005156}
5157
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005158void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005159 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005160 const InputInfoList &Inputs,
5161 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005162 const char *LinkingOutput) const {
5163 ArgStringList CmdArgs;
5164
5165 CmdArgs.push_back("-create");
5166 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005167
5168 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005169 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005170
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005171 for (InputInfoList::const_iterator
5172 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5173 const InputInfo &II = *it;
5174 assert(II.isFilename() && "Unexpected lipo input.");
5175 CmdArgs.push_back(II.getFilename());
5176 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005177 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005178 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005179 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005180}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005181
Daniel Dunbar88299622010-06-04 18:28:36 +00005182void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005183 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005184 const InputInfoList &Inputs,
5185 const ArgList &Args,
5186 const char *LinkingOutput) const {
5187 ArgStringList CmdArgs;
5188
Daniel Dunbareb86b042011-05-09 17:23:16 +00005189 CmdArgs.push_back("-o");
5190 CmdArgs.push_back(Output.getFilename());
5191
Daniel Dunbar88299622010-06-04 18:28:36 +00005192 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5193 const InputInfo &Input = Inputs[0];
5194 assert(Input.isFilename() && "Unexpected dsymutil input.");
5195 CmdArgs.push_back(Input.getFilename());
5196
Daniel Dunbar88299622010-06-04 18:28:36 +00005197 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005198 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005199 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005200}
5201
Eric Christopher551ef452011-08-23 17:56:55 +00005202void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005203 const InputInfo &Output,
5204 const InputInfoList &Inputs,
5205 const ArgList &Args,
5206 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005207 ArgStringList CmdArgs;
5208 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005209 CmdArgs.push_back("--debug-info");
5210 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005211 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005212
5213 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5214 const InputInfo &Input = Inputs[0];
5215 assert(Input.isFilename() && "Unexpected verify input");
5216
5217 // Grabbing the output of the earlier dsymutil run.
5218 CmdArgs.push_back(Input.getFilename());
5219
5220 const char *Exec =
5221 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5222 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5223}
5224
David Chisnallf571cde2012-02-15 13:39:01 +00005225void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5226 const InputInfo &Output,
5227 const InputInfoList &Inputs,
5228 const ArgList &Args,
5229 const char *LinkingOutput) const {
5230 ArgStringList CmdArgs;
5231
5232 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5233 options::OPT_Xassembler);
5234
5235 CmdArgs.push_back("-o");
5236 CmdArgs.push_back(Output.getFilename());
5237
5238 for (InputInfoList::const_iterator
5239 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5240 const InputInfo &II = *it;
5241 CmdArgs.push_back(II.getFilename());
5242 }
5243
5244 const char *Exec =
5245 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5246 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5247}
5248
5249
5250void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5251 const InputInfo &Output,
5252 const InputInfoList &Inputs,
5253 const ArgList &Args,
5254 const char *LinkingOutput) const {
5255 // FIXME: Find a real GCC, don't hard-code versions here
5256 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5257 const llvm::Triple &T = getToolChain().getTriple();
5258 std::string LibPath = "/usr/lib/";
5259 llvm::Triple::ArchType Arch = T.getArch();
5260 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005261 case llvm::Triple::x86:
5262 GCCLibPath +=
5263 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5264 break;
5265 case llvm::Triple::x86_64:
5266 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5267 GCCLibPath += "/4.5.2/amd64/";
5268 LibPath += "amd64/";
5269 break;
5270 default:
5271 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005272 }
5273
5274 ArgStringList CmdArgs;
5275
David Chisnall272a0712012-02-29 15:06:12 +00005276 // Demangle C++ names in errors
5277 CmdArgs.push_back("-C");
5278
David Chisnallf571cde2012-02-15 13:39:01 +00005279 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5280 (!Args.hasArg(options::OPT_shared))) {
5281 CmdArgs.push_back("-e");
5282 CmdArgs.push_back("_start");
5283 }
5284
5285 if (Args.hasArg(options::OPT_static)) {
5286 CmdArgs.push_back("-Bstatic");
5287 CmdArgs.push_back("-dn");
5288 } else {
5289 CmdArgs.push_back("-Bdynamic");
5290 if (Args.hasArg(options::OPT_shared)) {
5291 CmdArgs.push_back("-shared");
5292 } else {
5293 CmdArgs.push_back("--dynamic-linker");
5294 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5295 }
5296 }
5297
5298 if (Output.isFilename()) {
5299 CmdArgs.push_back("-o");
5300 CmdArgs.push_back(Output.getFilename());
5301 } else {
5302 assert(Output.isNothing() && "Invalid output.");
5303 }
5304
5305 if (!Args.hasArg(options::OPT_nostdlib) &&
5306 !Args.hasArg(options::OPT_nostartfiles)) {
5307 if (!Args.hasArg(options::OPT_shared)) {
5308 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5309 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005310 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005311 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5312 } else {
5313 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005314 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5315 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005316 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005317 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005318 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005319 }
5320
5321 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5322
5323 Args.AddAllArgs(CmdArgs, options::OPT_L);
5324 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5325 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005326 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005327
5328 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5329
5330 if (!Args.hasArg(options::OPT_nostdlib) &&
5331 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005332 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005333 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005334 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005335 if (!Args.hasArg(options::OPT_shared)) {
5336 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005337 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005338 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005339 }
David Chisnallf571cde2012-02-15 13:39:01 +00005340 }
5341
5342 if (!Args.hasArg(options::OPT_nostdlib) &&
5343 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005344 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005345 }
David Chisnall96de9932012-02-16 16:00:47 +00005346 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005347
5348 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5349
5350 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005351 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005352 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5353}
5354
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005355void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005356 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005357 const InputInfoList &Inputs,
5358 const ArgList &Args,
5359 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005360 ArgStringList CmdArgs;
5361
5362 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5363 options::OPT_Xassembler);
5364
5365 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005366 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005367
5368 for (InputInfoList::const_iterator
5369 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5370 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005371 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005372 }
5373
5374 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005375 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005376 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005377}
5378
5379void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005380 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005381 const InputInfoList &Inputs,
5382 const ArgList &Args,
5383 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005384 ArgStringList CmdArgs;
5385
5386 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005387 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005388 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005389 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005390 }
5391
5392 if (Args.hasArg(options::OPT_static)) {
5393 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005394 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005395 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005396// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005397 CmdArgs.push_back("-Bdynamic");
5398 if (Args.hasArg(options::OPT_shared)) {
5399 CmdArgs.push_back("-shared");
5400 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005401 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005402 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5403 }
5404 }
5405
Daniel Dunbarb440f562010-08-02 02:38:21 +00005406 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005407 CmdArgs.push_back("-o");
5408 CmdArgs.push_back(Output.getFilename());
5409 } else {
5410 assert(Output.isNothing() && "Invalid output.");
5411 }
5412
5413 if (!Args.hasArg(options::OPT_nostdlib) &&
5414 !Args.hasArg(options::OPT_nostartfiles)) {
5415 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005416 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005417 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005418 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005419 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005420 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005421 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005422 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005423 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005424 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005425 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005426 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005427 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005428 }
5429
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005430 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5431 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005432 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005433
5434 Args.AddAllArgs(CmdArgs, options::OPT_L);
5435 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5436 Args.AddAllArgs(CmdArgs, options::OPT_e);
5437
Daniel Dunbar54423b22010-09-17 00:24:54 +00005438 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005439
5440 if (!Args.hasArg(options::OPT_nostdlib) &&
5441 !Args.hasArg(options::OPT_nodefaultlibs)) {
5442 // FIXME: For some reason GCC passes -lgcc before adding
5443 // the default system libraries. Just mimic this for now.
5444 CmdArgs.push_back("-lgcc");
5445
5446 if (Args.hasArg(options::OPT_pthread))
5447 CmdArgs.push_back("-pthread");
5448 if (!Args.hasArg(options::OPT_shared))
5449 CmdArgs.push_back("-lc");
5450 CmdArgs.push_back("-lgcc");
5451 }
5452
5453 if (!Args.hasArg(options::OPT_nostdlib) &&
5454 !Args.hasArg(options::OPT_nostartfiles)) {
5455 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005456 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005457 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005458 }
5459
Bill Wendling08760582011-06-27 19:15:03 +00005460 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005461
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005462 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005463 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005464 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005465}
5466
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005467void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005468 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005469 const InputInfoList &Inputs,
5470 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005471 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005472 ArgStringList CmdArgs;
5473
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005474 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5475 // instruct as in the base system to assemble 32-bit code.
5476 if (getToolChain().getArch() == llvm::Triple::x86)
5477 CmdArgs.push_back("--32");
5478 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5479 CmdArgs.push_back("-mppc");
5480 CmdArgs.push_back("-many");
5481 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5482 getToolChain().getArch() == llvm::Triple::mips64el) {
5483 StringRef CPUName;
5484 StringRef ABIName;
5485 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5486
5487 CmdArgs.push_back("-mabi");
5488 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5489
5490 if (getToolChain().getArch() == llvm::Triple::mips64)
5491 CmdArgs.push_back("-EB");
5492 else
5493 CmdArgs.push_back("-EL");
5494
5495 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5496 options::OPT_fpic, options::OPT_fno_pic,
5497 options::OPT_fPIE, options::OPT_fno_PIE,
5498 options::OPT_fpie, options::OPT_fno_pie);
5499 if (LastPICArg &&
5500 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5501 LastPICArg->getOption().matches(options::OPT_fpic) ||
5502 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5503 LastPICArg->getOption().matches(options::OPT_fpie))) {
5504 CmdArgs.push_back("-KPIC");
5505 }
5506 }
5507
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005508 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5509 options::OPT_Xassembler);
5510
5511 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005512 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005513
5514 for (InputInfoList::const_iterator
5515 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5516 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005517 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005518 }
5519
5520 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005521 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005522 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005523}
5524
5525void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005526 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005527 const InputInfoList &Inputs,
5528 const ArgList &Args,
5529 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005530 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005531 ArgStringList CmdArgs;
5532
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005533 // Silence warning for "clang -g foo.o -o foo"
5534 Args.ClaimAllArgs(options::OPT_g_Group);
5535 // and "clang -emit-llvm foo.o -o foo"
5536 Args.ClaimAllArgs(options::OPT_emit_llvm);
5537 // and for "clang -w foo.o -o foo". Other warning options are already
5538 // handled somewhere else.
5539 Args.ClaimAllArgs(options::OPT_w);
5540
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005541 if (getToolChain().getArch() == llvm::Triple::mips64)
5542 CmdArgs.push_back("-EB");
5543 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5544 CmdArgs.push_back("-EL");
5545
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005546 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005547 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005548 CmdArgs.push_back("-e");
5549 CmdArgs.push_back("__start");
5550 }
5551
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005552 if (Args.hasArg(options::OPT_static)) {
5553 CmdArgs.push_back("-Bstatic");
5554 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005555 if (Args.hasArg(options::OPT_rdynamic))
5556 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005557 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005558 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005559 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005560 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005561 } else {
5562 CmdArgs.push_back("-dynamic-linker");
5563 CmdArgs.push_back("/usr/libexec/ld.so");
5564 }
5565 }
5566
Rafael Espindola044f7832013-06-05 04:28:55 +00005567 if (Args.hasArg(options::OPT_nopie))
5568 CmdArgs.push_back("-nopie");
5569
Daniel Dunbarb440f562010-08-02 02:38:21 +00005570 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005571 CmdArgs.push_back("-o");
5572 CmdArgs.push_back(Output.getFilename());
5573 } else {
5574 assert(Output.isNothing() && "Invalid output.");
5575 }
5576
5577 if (!Args.hasArg(options::OPT_nostdlib) &&
5578 !Args.hasArg(options::OPT_nostartfiles)) {
5579 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005580 if (Args.hasArg(options::OPT_pg))
5581 CmdArgs.push_back(Args.MakeArgString(
5582 getToolChain().GetFilePath("gcrt0.o")));
5583 else
5584 CmdArgs.push_back(Args.MakeArgString(
5585 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005586 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005587 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005588 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005589 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005590 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005591 }
5592 }
5593
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005594 std::string Triple = getToolChain().getTripleString();
5595 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005596 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005597 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005598 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005599
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005600 Args.AddAllArgs(CmdArgs, options::OPT_L);
5601 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5602 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005603 Args.AddAllArgs(CmdArgs, options::OPT_s);
5604 Args.AddAllArgs(CmdArgs, options::OPT_t);
5605 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5606 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005607
Daniel Dunbar54423b22010-09-17 00:24:54 +00005608 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005609
5610 if (!Args.hasArg(options::OPT_nostdlib) &&
5611 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005612 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005613 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005614 if (Args.hasArg(options::OPT_pg))
5615 CmdArgs.push_back("-lm_p");
5616 else
5617 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005618 }
5619
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005620 // FIXME: For some reason GCC passes -lgcc before adding
5621 // the default system libraries. Just mimic this for now.
5622 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005623
Eric Christopher17674ec2012-09-13 06:32:34 +00005624 if (Args.hasArg(options::OPT_pthread)) {
5625 if (!Args.hasArg(options::OPT_shared) &&
5626 Args.hasArg(options::OPT_pg))
5627 CmdArgs.push_back("-lpthread_p");
5628 else
5629 CmdArgs.push_back("-lpthread");
5630 }
5631
Chandler Carruth45661652011-12-17 22:32:42 +00005632 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005633 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005634 CmdArgs.push_back("-lc_p");
5635 else
5636 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005637 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005638
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005639 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005640 }
5641
5642 if (!Args.hasArg(options::OPT_nostdlib) &&
5643 !Args.hasArg(options::OPT_nostartfiles)) {
5644 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005645 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005646 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005647 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005648 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005649 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005650 }
5651
5652 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005653 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005654 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005655}
Ed Schoutene33194b2009-04-02 19:13:12 +00005656
Eli Friedman9fa28852012-08-08 23:57:20 +00005657void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5658 const InputInfo &Output,
5659 const InputInfoList &Inputs,
5660 const ArgList &Args,
5661 const char *LinkingOutput) const {
5662 ArgStringList CmdArgs;
5663
5664 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5665 options::OPT_Xassembler);
5666
5667 CmdArgs.push_back("-o");
5668 CmdArgs.push_back(Output.getFilename());
5669
5670 for (InputInfoList::const_iterator
5671 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5672 const InputInfo &II = *it;
5673 CmdArgs.push_back(II.getFilename());
5674 }
5675
5676 const char *Exec =
5677 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5678 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5679}
5680
5681void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5682 const InputInfo &Output,
5683 const InputInfoList &Inputs,
5684 const ArgList &Args,
5685 const char *LinkingOutput) const {
5686 const Driver &D = getToolChain().getDriver();
5687 ArgStringList CmdArgs;
5688
5689 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5690 (!Args.hasArg(options::OPT_shared))) {
5691 CmdArgs.push_back("-e");
5692 CmdArgs.push_back("__start");
5693 }
5694
5695 if (Args.hasArg(options::OPT_static)) {
5696 CmdArgs.push_back("-Bstatic");
5697 } else {
5698 if (Args.hasArg(options::OPT_rdynamic))
5699 CmdArgs.push_back("-export-dynamic");
5700 CmdArgs.push_back("--eh-frame-hdr");
5701 CmdArgs.push_back("-Bdynamic");
5702 if (Args.hasArg(options::OPT_shared)) {
5703 CmdArgs.push_back("-shared");
5704 } else {
5705 CmdArgs.push_back("-dynamic-linker");
5706 CmdArgs.push_back("/usr/libexec/ld.so");
5707 }
5708 }
5709
5710 if (Output.isFilename()) {
5711 CmdArgs.push_back("-o");
5712 CmdArgs.push_back(Output.getFilename());
5713 } else {
5714 assert(Output.isNothing() && "Invalid output.");
5715 }
5716
5717 if (!Args.hasArg(options::OPT_nostdlib) &&
5718 !Args.hasArg(options::OPT_nostartfiles)) {
5719 if (!Args.hasArg(options::OPT_shared)) {
5720 if (Args.hasArg(options::OPT_pg))
5721 CmdArgs.push_back(Args.MakeArgString(
5722 getToolChain().GetFilePath("gcrt0.o")));
5723 else
5724 CmdArgs.push_back(Args.MakeArgString(
5725 getToolChain().GetFilePath("crt0.o")));
5726 CmdArgs.push_back(Args.MakeArgString(
5727 getToolChain().GetFilePath("crtbegin.o")));
5728 } else {
5729 CmdArgs.push_back(Args.MakeArgString(
5730 getToolChain().GetFilePath("crtbeginS.o")));
5731 }
5732 }
5733
5734 Args.AddAllArgs(CmdArgs, options::OPT_L);
5735 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5736 Args.AddAllArgs(CmdArgs, options::OPT_e);
5737
5738 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5739
5740 if (!Args.hasArg(options::OPT_nostdlib) &&
5741 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005742 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005743 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5744 if (Args.hasArg(options::OPT_pg))
5745 CmdArgs.push_back("-lm_p");
5746 else
5747 CmdArgs.push_back("-lm");
5748 }
5749
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005750 if (Args.hasArg(options::OPT_pthread)) {
5751 if (!Args.hasArg(options::OPT_shared) &&
5752 Args.hasArg(options::OPT_pg))
5753 CmdArgs.push_back("-lpthread_p");
5754 else
5755 CmdArgs.push_back("-lpthread");
5756 }
5757
Eli Friedman9fa28852012-08-08 23:57:20 +00005758 if (!Args.hasArg(options::OPT_shared)) {
5759 if (Args.hasArg(options::OPT_pg))
5760 CmdArgs.push_back("-lc_p");
5761 else
5762 CmdArgs.push_back("-lc");
5763 }
5764
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005765 StringRef MyArch;
5766 switch (getToolChain().getTriple().getArch()) {
5767 case llvm::Triple::arm:
5768 MyArch = "arm";
5769 break;
5770 case llvm::Triple::x86:
5771 MyArch = "i386";
5772 break;
5773 case llvm::Triple::x86_64:
5774 MyArch = "amd64";
5775 break;
5776 default:
5777 llvm_unreachable("Unsupported architecture");
5778 }
5779 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005780 }
5781
5782 if (!Args.hasArg(options::OPT_nostdlib) &&
5783 !Args.hasArg(options::OPT_nostartfiles)) {
5784 if (!Args.hasArg(options::OPT_shared))
5785 CmdArgs.push_back(Args.MakeArgString(
5786 getToolChain().GetFilePath("crtend.o")));
5787 else
5788 CmdArgs.push_back(Args.MakeArgString(
5789 getToolChain().GetFilePath("crtendS.o")));
5790 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005791
5792 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005793 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005794 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005795}
5796
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005797void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005798 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005799 const InputInfoList &Inputs,
5800 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005801 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005802 ArgStringList CmdArgs;
5803
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005804 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5805 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005806 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005807 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005808 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005809 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005810 else if (getToolChain().getArch() == llvm::Triple::mips ||
5811 getToolChain().getArch() == llvm::Triple::mipsel ||
5812 getToolChain().getArch() == llvm::Triple::mips64 ||
5813 getToolChain().getArch() == llvm::Triple::mips64el) {
5814 StringRef CPUName;
5815 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005816 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005817
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005818 CmdArgs.push_back("-march");
5819 CmdArgs.push_back(CPUName.data());
5820
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005821 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005822 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005823
5824 if (getToolChain().getArch() == llvm::Triple::mips ||
5825 getToolChain().getArch() == llvm::Triple::mips64)
5826 CmdArgs.push_back("-EB");
5827 else
5828 CmdArgs.push_back("-EL");
5829
5830 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5831 options::OPT_fpic, options::OPT_fno_pic,
5832 options::OPT_fPIE, options::OPT_fno_PIE,
5833 options::OPT_fpie, options::OPT_fno_pie);
5834 if (LastPICArg &&
5835 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5836 LastPICArg->getOption().matches(options::OPT_fpic) ||
5837 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5838 LastPICArg->getOption().matches(options::OPT_fpie))) {
5839 CmdArgs.push_back("-KPIC");
5840 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005841 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5842 getToolChain().getArch() == llvm::Triple::thumb) {
5843 CmdArgs.push_back("-mfpu=softvfp");
5844 switch(getToolChain().getTriple().getEnvironment()) {
5845 case llvm::Triple::GNUEABI:
5846 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005847 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005848 break;
5849
5850 default:
5851 CmdArgs.push_back("-matpcs");
5852 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005853 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005854
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005855 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5856 options::OPT_Xassembler);
5857
5858 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005859 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005860
5861 for (InputInfoList::const_iterator
5862 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5863 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005864 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005865 }
5866
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005867 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005868 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005869 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005870}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005871
5872void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005873 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005874 const InputInfoList &Inputs,
5875 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005876 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005877 const toolchains::FreeBSD& ToolChain =
5878 static_cast<const toolchains::FreeBSD&>(getToolChain());
5879 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005880 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005881
5882 // Silence warning for "clang -g foo.o -o foo"
5883 Args.ClaimAllArgs(options::OPT_g_Group);
5884 // and "clang -emit-llvm foo.o -o foo"
5885 Args.ClaimAllArgs(options::OPT_emit_llvm);
5886 // and for "clang -w foo.o -o foo". Other warning options are already
5887 // handled somewhere else.
5888 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005889
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005890 if (!D.SysRoot.empty())
5891 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5892
Roman Divackyafe2f232012-08-28 15:09:03 +00005893 if (Args.hasArg(options::OPT_pie))
5894 CmdArgs.push_back("-pie");
5895
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005896 if (Args.hasArg(options::OPT_static)) {
5897 CmdArgs.push_back("-Bstatic");
5898 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005899 if (Args.hasArg(options::OPT_rdynamic))
5900 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005901 CmdArgs.push_back("--eh-frame-hdr");
5902 if (Args.hasArg(options::OPT_shared)) {
5903 CmdArgs.push_back("-Bshareable");
5904 } else {
5905 CmdArgs.push_back("-dynamic-linker");
5906 CmdArgs.push_back("/libexec/ld-elf.so.1");
5907 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005908 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5909 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005910 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5911 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5912 CmdArgs.push_back("--hash-style=both");
5913 }
5914 }
5915 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005916 }
5917
5918 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5919 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005920 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005921 CmdArgs.push_back("-m");
5922 CmdArgs.push_back("elf_i386_fbsd");
5923 }
5924
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005925 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005926 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005927 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005928 }
5929
Daniel Dunbarb440f562010-08-02 02:38:21 +00005930 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005931 CmdArgs.push_back("-o");
5932 CmdArgs.push_back(Output.getFilename());
5933 } else {
5934 assert(Output.isNothing() && "Invalid output.");
5935 }
5936
5937 if (!Args.hasArg(options::OPT_nostdlib) &&
5938 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005939 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005940 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005941 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005942 crt1 = "gcrt1.o";
5943 else if (Args.hasArg(options::OPT_pie))
5944 crt1 = "Scrt1.o";
5945 else
5946 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005947 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005948 if (crt1)
5949 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5950
5951 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5952
5953 const char *crtbegin = NULL;
5954 if (Args.hasArg(options::OPT_static))
5955 crtbegin = "crtbeginT.o";
5956 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5957 crtbegin = "crtbeginS.o";
5958 else
5959 crtbegin = "crtbegin.o";
5960
5961 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005962 }
5963
5964 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005965 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005966 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5967 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005968 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005969 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5970 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005971 Args.AddAllArgs(CmdArgs, options::OPT_s);
5972 Args.AddAllArgs(CmdArgs, options::OPT_t);
5973 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5974 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005975
Alp Tokerce365ca2013-12-02 12:43:03 +00005976 if (D.IsUsingLTO(Args))
5977 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00005978
Roman Divackyafe2f232012-08-28 15:09:03 +00005979 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005980
5981 if (!Args.hasArg(options::OPT_nostdlib) &&
5982 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005983 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005984 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005985 if (Args.hasArg(options::OPT_pg))
5986 CmdArgs.push_back("-lm_p");
5987 else
5988 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005989 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005990 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5991 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005992 if (Args.hasArg(options::OPT_pg))
5993 CmdArgs.push_back("-lgcc_p");
5994 else
5995 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005996 if (Args.hasArg(options::OPT_static)) {
5997 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005998 } else if (Args.hasArg(options::OPT_pg)) {
5999 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006000 } else {
6001 CmdArgs.push_back("--as-needed");
6002 CmdArgs.push_back("-lgcc_s");
6003 CmdArgs.push_back("--no-as-needed");
6004 }
6005
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006006 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006007 if (Args.hasArg(options::OPT_pg))
6008 CmdArgs.push_back("-lpthread_p");
6009 else
6010 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006011 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006012
Roman Divacky66f22762011-02-10 16:59:40 +00006013 if (Args.hasArg(options::OPT_pg)) {
6014 if (Args.hasArg(options::OPT_shared))
6015 CmdArgs.push_back("-lc");
6016 else
6017 CmdArgs.push_back("-lc_p");
6018 CmdArgs.push_back("-lgcc_p");
6019 } else {
6020 CmdArgs.push_back("-lc");
6021 CmdArgs.push_back("-lgcc");
6022 }
6023
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006024 if (Args.hasArg(options::OPT_static)) {
6025 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006026 } else if (Args.hasArg(options::OPT_pg)) {
6027 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006028 } else {
6029 CmdArgs.push_back("--as-needed");
6030 CmdArgs.push_back("-lgcc_s");
6031 CmdArgs.push_back("--no-as-needed");
6032 }
6033 }
6034
6035 if (!Args.hasArg(options::OPT_nostdlib) &&
6036 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00006037 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00006038 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006039 else
6040 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006041 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006042 }
6043
Roman Divackyafe2f232012-08-28 15:09:03 +00006044 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006045
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006046 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006047 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006048 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006049}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006050
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006051void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6052 const InputInfo &Output,
6053 const InputInfoList &Inputs,
6054 const ArgList &Args,
6055 const char *LinkingOutput) const {
6056 ArgStringList CmdArgs;
6057
6058 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6059 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006060 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006061 CmdArgs.push_back("--32");
6062
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006063 // Pass the target CPU to GNU as for ARM, since the source code might
6064 // not have the correct .cpu annotation.
6065 if (getToolChain().getArch() == llvm::Triple::arm) {
Bernard Ogden31561762013-12-12 13:27:11 +00006066 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006067 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6068 }
6069
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006070 if (getToolChain().getArch() == llvm::Triple::mips ||
6071 getToolChain().getArch() == llvm::Triple::mipsel ||
6072 getToolChain().getArch() == llvm::Triple::mips64 ||
6073 getToolChain().getArch() == llvm::Triple::mips64el) {
6074 StringRef CPUName;
6075 StringRef ABIName;
6076 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6077
6078 CmdArgs.push_back("-march");
6079 CmdArgs.push_back(CPUName.data());
6080
6081 CmdArgs.push_back("-mabi");
6082 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6083
6084 if (getToolChain().getArch() == llvm::Triple::mips ||
6085 getToolChain().getArch() == llvm::Triple::mips64)
6086 CmdArgs.push_back("-EB");
6087 else
6088 CmdArgs.push_back("-EL");
6089
6090 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6091 options::OPT_fpic, options::OPT_fno_pic,
6092 options::OPT_fPIE, options::OPT_fno_PIE,
6093 options::OPT_fpie, options::OPT_fno_pie);
6094 if (LastPICArg &&
6095 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6096 LastPICArg->getOption().matches(options::OPT_fpic) ||
6097 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6098 LastPICArg->getOption().matches(options::OPT_fpie))) {
6099 CmdArgs.push_back("-KPIC");
6100 }
6101 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006102
6103 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6104 options::OPT_Xassembler);
6105
6106 CmdArgs.push_back("-o");
6107 CmdArgs.push_back(Output.getFilename());
6108
6109 for (InputInfoList::const_iterator
6110 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6111 const InputInfo &II = *it;
6112 CmdArgs.push_back(II.getFilename());
6113 }
6114
David Chisnallddbd68f2011-09-27 22:03:18 +00006115 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006116 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6117}
6118
6119void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6120 const InputInfo &Output,
6121 const InputInfoList &Inputs,
6122 const ArgList &Args,
6123 const char *LinkingOutput) const {
6124 const Driver &D = getToolChain().getDriver();
6125 ArgStringList CmdArgs;
6126
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006127 if (!D.SysRoot.empty())
6128 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6129
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006130 if (Args.hasArg(options::OPT_static)) {
6131 CmdArgs.push_back("-Bstatic");
6132 } else {
6133 if (Args.hasArg(options::OPT_rdynamic))
6134 CmdArgs.push_back("-export-dynamic");
6135 CmdArgs.push_back("--eh-frame-hdr");
6136 if (Args.hasArg(options::OPT_shared)) {
6137 CmdArgs.push_back("-Bshareable");
6138 } else {
6139 CmdArgs.push_back("-dynamic-linker");
6140 CmdArgs.push_back("/libexec/ld.elf_so");
6141 }
6142 }
6143
6144 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6145 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006146 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006147 CmdArgs.push_back("-m");
6148 CmdArgs.push_back("elf_i386");
6149 }
6150
6151 if (Output.isFilename()) {
6152 CmdArgs.push_back("-o");
6153 CmdArgs.push_back(Output.getFilename());
6154 } else {
6155 assert(Output.isNothing() && "Invalid output.");
6156 }
6157
6158 if (!Args.hasArg(options::OPT_nostdlib) &&
6159 !Args.hasArg(options::OPT_nostartfiles)) {
6160 if (!Args.hasArg(options::OPT_shared)) {
6161 CmdArgs.push_back(Args.MakeArgString(
6162 getToolChain().GetFilePath("crt0.o")));
6163 CmdArgs.push_back(Args.MakeArgString(
6164 getToolChain().GetFilePath("crti.o")));
6165 CmdArgs.push_back(Args.MakeArgString(
6166 getToolChain().GetFilePath("crtbegin.o")));
6167 } else {
6168 CmdArgs.push_back(Args.MakeArgString(
6169 getToolChain().GetFilePath("crti.o")));
6170 CmdArgs.push_back(Args.MakeArgString(
6171 getToolChain().GetFilePath("crtbeginS.o")));
6172 }
6173 }
6174
6175 Args.AddAllArgs(CmdArgs, options::OPT_L);
6176 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6177 Args.AddAllArgs(CmdArgs, options::OPT_e);
6178 Args.AddAllArgs(CmdArgs, options::OPT_s);
6179 Args.AddAllArgs(CmdArgs, options::OPT_t);
6180 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6181 Args.AddAllArgs(CmdArgs, options::OPT_r);
6182
6183 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6184
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006185 unsigned Major, Minor, Micro;
6186 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6187 bool useLibgcc = true;
6188 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
6189 if (getToolChain().getArch() == llvm::Triple::x86 ||
6190 getToolChain().getArch() == llvm::Triple::x86_64)
6191 useLibgcc = false;
6192 }
6193
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006194 if (!Args.hasArg(options::OPT_nostdlib) &&
6195 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006196 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006197 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6198 CmdArgs.push_back("-lm");
6199 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006200 if (Args.hasArg(options::OPT_pthread))
6201 CmdArgs.push_back("-lpthread");
6202 CmdArgs.push_back("-lc");
6203
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006204 if (useLibgcc) {
6205 if (Args.hasArg(options::OPT_static)) {
6206 // libgcc_eh depends on libc, so resolve as much as possible,
6207 // pull in any new requirements from libc and then get the rest
6208 // of libgcc.
6209 CmdArgs.push_back("-lgcc_eh");
6210 CmdArgs.push_back("-lc");
6211 CmdArgs.push_back("-lgcc");
6212 } else {
6213 CmdArgs.push_back("-lgcc");
6214 CmdArgs.push_back("--as-needed");
6215 CmdArgs.push_back("-lgcc_s");
6216 CmdArgs.push_back("--no-as-needed");
6217 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006218 }
6219 }
6220
6221 if (!Args.hasArg(options::OPT_nostdlib) &&
6222 !Args.hasArg(options::OPT_nostartfiles)) {
6223 if (!Args.hasArg(options::OPT_shared))
6224 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6225 "crtend.o")));
6226 else
6227 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6228 "crtendS.o")));
6229 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6230 "crtn.o")));
6231 }
6232
Bill Wendling08760582011-06-27 19:15:03 +00006233 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006234
Rafael Espindola236db462013-11-09 20:07:19 +00006235 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006236 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6237}
6238
Thomas Schwinge4e555262013-03-28 19:04:25 +00006239void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6240 const InputInfo &Output,
6241 const InputInfoList &Inputs,
6242 const ArgList &Args,
6243 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006244 ArgStringList CmdArgs;
6245
6246 // Add --32/--64 to make sure we get the format we want.
6247 // This is incomplete
6248 if (getToolChain().getArch() == llvm::Triple::x86) {
6249 CmdArgs.push_back("--32");
6250 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6251 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006252 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6253 CmdArgs.push_back("-a32");
6254 CmdArgs.push_back("-mppc");
6255 CmdArgs.push_back("-many");
6256 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6257 CmdArgs.push_back("-a64");
6258 CmdArgs.push_back("-mppc64");
6259 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006260 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6261 CmdArgs.push_back("-a64");
6262 CmdArgs.push_back("-mppc64le");
6263 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00006264 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006265 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006266 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6267 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006268 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6269 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006270
Tim Northover9c7e0352013-12-12 11:55:52 +00006271 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6272 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006273 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006274
6275 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006276
6277 // FIXME: remove krait check when GNU tools support krait cpu
6278 // for now replace it with -march=armv7-a to avoid a lower
6279 // march from being picked in the absence of a cpu flag.
6280 Arg *A;
6281 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6282 StringRef(A->getValue()) == "krait")
6283 CmdArgs.push_back("-march=armv7-a");
6284 else
6285 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006286 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006287 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6288 getToolChain().getArch() == llvm::Triple::mipsel ||
6289 getToolChain().getArch() == llvm::Triple::mips64 ||
6290 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006291 StringRef CPUName;
6292 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006293 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006294
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006295 CmdArgs.push_back("-march");
6296 CmdArgs.push_back(CPUName.data());
6297
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006298 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006299 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006300
6301 if (getToolChain().getArch() == llvm::Triple::mips ||
6302 getToolChain().getArch() == llvm::Triple::mips64)
6303 CmdArgs.push_back("-EB");
6304 else
6305 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006306
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006307 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6308 if (StringRef(A->getValue()) == "2008")
6309 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6310 }
6311
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006312 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006313 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6314 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6315 options::OPT_mno_micromips);
6316 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6317 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6318
Simon Atanasyanbd986632013-11-26 11:58:04 +00006319 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6320 // Do not use AddLastArg because not all versions of MIPS assembler
6321 // support -mmsa / -mno-msa options.
6322 if (A->getOption().matches(options::OPT_mmsa))
6323 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6324 }
6325
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006326 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6327 options::OPT_fpic, options::OPT_fno_pic,
6328 options::OPT_fPIE, options::OPT_fno_PIE,
6329 options::OPT_fpie, options::OPT_fno_pie);
6330 if (LastPICArg &&
6331 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6332 LastPICArg->getOption().matches(options::OPT_fpic) ||
6333 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6334 LastPICArg->getOption().matches(options::OPT_fpie))) {
6335 CmdArgs.push_back("-KPIC");
6336 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006337 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006338 // Always pass an -march option, since our default of z10 is later
6339 // than the GNU assembler's default.
6340 StringRef CPUName = getSystemZTargetCPU(Args);
6341 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006342 }
6343
6344 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6345 options::OPT_Xassembler);
6346
6347 CmdArgs.push_back("-o");
6348 CmdArgs.push_back(Output.getFilename());
6349
6350 for (InputInfoList::const_iterator
6351 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6352 const InputInfo &II = *it;
6353 CmdArgs.push_back(II.getFilename());
6354 }
6355
6356 const char *Exec =
6357 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6358 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006359
6360 // Handle the debug info splitting at object creation time if we're
6361 // creating an object.
6362 // TODO: Currently only works on linux with newer objcopy.
6363 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006364 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006365 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6366 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006367}
6368
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006369static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6370 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006371 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006372 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6373 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006374 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006375 CmdArgs.push_back("-lgcc");
6376
Logan Chien3d3373c2012-11-19 12:04:11 +00006377 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006378 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006379 CmdArgs.push_back("-lgcc");
6380 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006381 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006382 CmdArgs.push_back("--as-needed");
6383 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006384 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006385 CmdArgs.push_back("--no-as-needed");
6386 }
6387
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006388 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006389 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006390 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006391 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006392
6393 // According to Android ABI, we have to link with libdl if we are
6394 // linking with non-static libgcc.
6395 //
6396 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6397 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6398 if (isAndroid && !StaticLibgcc)
6399 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006400}
6401
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006402static bool hasMipsN32ABIArg(const ArgList &Args) {
6403 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006404 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006405}
6406
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006407static StringRef getLinuxDynamicLinker(const ArgList &Args,
6408 const toolchains::Linux &ToolChain) {
6409 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6410 return "/system/bin/linker";
6411 else if (ToolChain.getArch() == llvm::Triple::x86)
6412 return "/lib/ld-linux.so.2";
6413 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6414 return "/lib/ld-linux-aarch64.so.1";
6415 else if (ToolChain.getArch() == llvm::Triple::arm ||
6416 ToolChain.getArch() == llvm::Triple::thumb) {
6417 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6418 return "/lib/ld-linux-armhf.so.3";
6419 else
6420 return "/lib/ld-linux.so.3";
6421 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6422 ToolChain.getArch() == llvm::Triple::mipsel)
6423 return "/lib/ld.so.1";
6424 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6425 ToolChain.getArch() == llvm::Triple::mips64el) {
6426 if (hasMipsN32ABIArg(Args))
6427 return "/lib32/ld.so.1";
6428 else
6429 return "/lib64/ld.so.1";
6430 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6431 return "/lib/ld.so.1";
6432 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006433 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006434 ToolChain.getArch() == llvm::Triple::systemz)
6435 return "/lib64/ld64.so.1";
6436 else
6437 return "/lib64/ld-linux-x86-64.so.2";
6438}
6439
Thomas Schwinge4e555262013-03-28 19:04:25 +00006440void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6441 const InputInfo &Output,
6442 const InputInfoList &Inputs,
6443 const ArgList &Args,
6444 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006445 const toolchains::Linux& ToolChain =
6446 static_cast<const toolchains::Linux&>(getToolChain());
6447 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006448 const bool isAndroid =
6449 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006450 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006451 const bool IsPIE =
6452 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006453 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006454
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006455 ArgStringList CmdArgs;
6456
Rafael Espindolad1002f62010-11-15 18:28:16 +00006457 // Silence warning for "clang -g foo.o -o foo"
6458 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006459 // and "clang -emit-llvm foo.o -o foo"
6460 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006461 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006462 // handled somewhere else.
6463 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006464
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006465 if (!D.SysRoot.empty())
6466 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006467
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006468 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006469 CmdArgs.push_back("-pie");
6470
Rafael Espindola1c76c592010-11-07 22:57:16 +00006471 if (Args.hasArg(options::OPT_rdynamic))
6472 CmdArgs.push_back("-export-dynamic");
6473
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006474 if (Args.hasArg(options::OPT_s))
6475 CmdArgs.push_back("-s");
6476
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006477 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6478 e = ToolChain.ExtraOpts.end();
6479 i != e; ++i)
6480 CmdArgs.push_back(i->c_str());
6481
6482 if (!Args.hasArg(options::OPT_static)) {
6483 CmdArgs.push_back("--eh-frame-hdr");
6484 }
6485
6486 CmdArgs.push_back("-m");
6487 if (ToolChain.getArch() == llvm::Triple::x86)
6488 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006489 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6490 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006491 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006492 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006493 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006494 else if (ToolChain.getArch() == llvm::Triple::ppc)
6495 CmdArgs.push_back("elf32ppclinux");
6496 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6497 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006498 else if (ToolChain.getArch() == llvm::Triple::mips)
6499 CmdArgs.push_back("elf32btsmip");
6500 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6501 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006502 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6503 if (hasMipsN32ABIArg(Args))
6504 CmdArgs.push_back("elf32btsmipn32");
6505 else
6506 CmdArgs.push_back("elf64btsmip");
6507 }
6508 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6509 if (hasMipsN32ABIArg(Args))
6510 CmdArgs.push_back("elf32ltsmipn32");
6511 else
6512 CmdArgs.push_back("elf64ltsmip");
6513 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006514 else if (ToolChain.getArch() == llvm::Triple::systemz)
6515 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006516 else
6517 CmdArgs.push_back("elf_x86_64");
6518
6519 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006520 if (ToolChain.getArch() == llvm::Triple::arm
6521 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006522 CmdArgs.push_back("-Bstatic");
6523 else
6524 CmdArgs.push_back("-static");
6525 } else if (Args.hasArg(options::OPT_shared)) {
6526 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006527 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006528 CmdArgs.push_back("-Bsymbolic");
6529 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006530 }
6531
6532 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006533 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006534 (!Args.hasArg(options::OPT_static) &&
6535 !Args.hasArg(options::OPT_shared))) {
6536 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006537 CmdArgs.push_back(Args.MakeArgString(
6538 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006539 }
6540
6541 CmdArgs.push_back("-o");
6542 CmdArgs.push_back(Output.getFilename());
6543
Rafael Espindola81937ec2010-12-01 01:52:43 +00006544 if (!Args.hasArg(options::OPT_nostdlib) &&
6545 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006546 if (!isAndroid) {
6547 const char *crt1 = NULL;
6548 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006549 if (Args.hasArg(options::OPT_pg))
6550 crt1 = "gcrt1.o";
6551 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006552 crt1 = "Scrt1.o";
6553 else
6554 crt1 = "crt1.o";
6555 }
6556 if (crt1)
6557 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006558
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006559 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6560 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006561
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006562 const char *crtbegin;
6563 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006564 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006565 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006566 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006567 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006568 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006569 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006570 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006571 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006572
6573 // Add crtfastmath.o if available and fast math is enabled.
6574 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006575 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006576
6577 Args.AddAllArgs(CmdArgs, options::OPT_L);
6578
6579 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6580
Roman Divackyee8188a2011-03-01 17:53:14 +00006581 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6582 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006583 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006584
Alp Tokerce365ca2013-12-02 12:43:03 +00006585 if (D.IsUsingLTO(Args))
6586 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006587
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006588 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6589 CmdArgs.push_back("--no-demangle");
6590
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006591 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6592
Eric Christopher04997782012-11-29 18:51:05 +00006593 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006594 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006595 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006596 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006597 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006598 if (Sanitize.needsAsanRt())
6599 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6600 if (Sanitize.needsTsanRt())
6601 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006602 if (Sanitize.needsMsanRt())
6603 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006604 if (Sanitize.needsLsanRt())
6605 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006606 if (Sanitize.needsDfsanRt())
6607 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006608
Chandler Carruthe4458b32013-06-24 09:38:45 +00006609 // The profile runtime also needs access to system libraries.
6610 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6611
Hans Wennborg70850d82013-07-18 20:29:38 +00006612 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006613 !Args.hasArg(options::OPT_nostdlib) &&
6614 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006615 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6616 !Args.hasArg(options::OPT_static);
6617 if (OnlyLibstdcxxStatic)
6618 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006619 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006620 if (OnlyLibstdcxxStatic)
6621 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006622 CmdArgs.push_back("-lm");
6623 }
6624
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006625 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006626 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6627 if (Args.hasArg(options::OPT_static))
6628 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006629
Chandler Carruth01538002013-01-17 13:19:29 +00006630 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6631 if (OpenMP) {
6632 CmdArgs.push_back("-lgomp");
6633
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006634 // FIXME: Exclude this for platforms with libgomp that don't require
6635 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006636 CmdArgs.push_back("-lrt");
6637 }
6638
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006639 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006640
Chandler Carruth94a32012012-05-14 18:31:18 +00006641 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006642 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006643 CmdArgs.push_back("-lpthread");
6644
6645 CmdArgs.push_back("-lc");
6646
6647 if (Args.hasArg(options::OPT_static))
6648 CmdArgs.push_back("--end-group");
6649 else
6650 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6651 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006652
Rafael Espindola81937ec2010-12-01 01:52:43 +00006653 if (!Args.hasArg(options::OPT_nostartfiles)) {
6654 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006655 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006656 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006657 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006658 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006659 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006660 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006661
Rafael Espindola81937ec2010-12-01 01:52:43 +00006662 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006663 if (!isAndroid)
6664 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006665 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006666 }
6667
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006668 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6669}
Rafael Espindola92b00932010-08-10 00:25:48 +00006670
Chris Lattner3e2ee142010-07-07 16:01:42 +00006671void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006672 const InputInfo &Output,
6673 const InputInfoList &Inputs,
6674 const ArgList &Args,
6675 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006676 ArgStringList CmdArgs;
6677
6678 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6679 options::OPT_Xassembler);
6680
6681 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006682 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006683
6684 for (InputInfoList::const_iterator
6685 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6686 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006687 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006688 }
6689
6690 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006691 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006692 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006693}
6694
6695void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006696 const InputInfo &Output,
6697 const InputInfoList &Inputs,
6698 const ArgList &Args,
6699 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006700 const Driver &D = getToolChain().getDriver();
6701 ArgStringList CmdArgs;
6702
Daniel Dunbarb440f562010-08-02 02:38:21 +00006703 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006704 CmdArgs.push_back("-o");
6705 CmdArgs.push_back(Output.getFilename());
6706 } else {
6707 assert(Output.isNothing() && "Invalid output.");
6708 }
6709
6710 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006711 !Args.hasArg(options::OPT_nostartfiles)) {
6712 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6713 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6714 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6715 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6716 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006717
6718 Args.AddAllArgs(CmdArgs, options::OPT_L);
6719 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6720 Args.AddAllArgs(CmdArgs, options::OPT_e);
6721
Daniel Dunbar54423b22010-09-17 00:24:54 +00006722 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006723
Eli Friedman83de5132011-12-08 23:54:21 +00006724 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6725
Chris Lattner3e2ee142010-07-07 16:01:42 +00006726 if (!Args.hasArg(options::OPT_nostdlib) &&
6727 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006728 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006729 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006730 CmdArgs.push_back("-lm");
6731 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006732 }
6733
6734 if (!Args.hasArg(options::OPT_nostdlib) &&
6735 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006736 if (Args.hasArg(options::OPT_pthread))
6737 CmdArgs.push_back("-lpthread");
6738 CmdArgs.push_back("-lc");
6739 CmdArgs.push_back("-lCompilerRT-Generic");
6740 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6741 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006742 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006743 }
6744
Rafael Espindola236db462013-11-09 20:07:19 +00006745 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006746 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006747}
6748
Daniel Dunbarcc912342009-05-02 18:28:39 +00006749/// DragonFly Tools
6750
6751// For now, DragonFly Assemble does just about the same as for
6752// FreeBSD, but this may change soon.
6753void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006754 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006755 const InputInfoList &Inputs,
6756 const ArgList &Args,
6757 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006758 ArgStringList CmdArgs;
6759
6760 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6761 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006762 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006763 CmdArgs.push_back("--32");
6764
6765 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6766 options::OPT_Xassembler);
6767
6768 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006769 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006770
6771 for (InputInfoList::const_iterator
6772 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6773 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006774 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006775 }
6776
6777 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006778 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006779 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006780}
6781
6782void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006783 const InputInfo &Output,
6784 const InputInfoList &Inputs,
6785 const ArgList &Args,
6786 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006787 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006788 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006789 ArgStringList CmdArgs;
6790
John McCall65b8da02013-04-11 22:55:55 +00006791 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6792 UseGCC47 = false;
6793
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006794 if (!D.SysRoot.empty())
6795 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6796
John McCall65b8da02013-04-11 22:55:55 +00006797 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006798 if (Args.hasArg(options::OPT_static)) {
6799 CmdArgs.push_back("-Bstatic");
6800 } else {
John McCall65b8da02013-04-11 22:55:55 +00006801 if (Args.hasArg(options::OPT_rdynamic))
6802 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006803 if (Args.hasArg(options::OPT_shared))
6804 CmdArgs.push_back("-Bshareable");
6805 else {
6806 CmdArgs.push_back("-dynamic-linker");
6807 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6808 }
John McCall65b8da02013-04-11 22:55:55 +00006809 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006810 }
6811
6812 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6813 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006814 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006815 CmdArgs.push_back("-m");
6816 CmdArgs.push_back("elf_i386");
6817 }
6818
Daniel Dunbarb440f562010-08-02 02:38:21 +00006819 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006820 CmdArgs.push_back("-o");
6821 CmdArgs.push_back(Output.getFilename());
6822 } else {
6823 assert(Output.isNothing() && "Invalid output.");
6824 }
6825
6826 if (!Args.hasArg(options::OPT_nostdlib) &&
6827 !Args.hasArg(options::OPT_nostartfiles)) {
6828 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006829 if (Args.hasArg(options::OPT_pg))
6830 CmdArgs.push_back(Args.MakeArgString(
6831 getToolChain().GetFilePath("gcrt1.o")));
6832 else {
6833 if (Args.hasArg(options::OPT_pie))
6834 CmdArgs.push_back(Args.MakeArgString(
6835 getToolChain().GetFilePath("Scrt1.o")));
6836 else
6837 CmdArgs.push_back(Args.MakeArgString(
6838 getToolChain().GetFilePath("crt1.o")));
6839 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006840 }
John McCall65b8da02013-04-11 22:55:55 +00006841 CmdArgs.push_back(Args.MakeArgString(
6842 getToolChain().GetFilePath("crti.o")));
6843 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6844 CmdArgs.push_back(Args.MakeArgString(
6845 getToolChain().GetFilePath("crtbeginS.o")));
6846 else
6847 CmdArgs.push_back(Args.MakeArgString(
6848 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006849 }
6850
6851 Args.AddAllArgs(CmdArgs, options::OPT_L);
6852 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6853 Args.AddAllArgs(CmdArgs, options::OPT_e);
6854
Daniel Dunbar54423b22010-09-17 00:24:54 +00006855 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006856
6857 if (!Args.hasArg(options::OPT_nostdlib) &&
6858 !Args.hasArg(options::OPT_nodefaultlibs)) {
6859 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6860 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006861 if (UseGCC47)
6862 CmdArgs.push_back("-L/usr/lib/gcc47");
6863 else
6864 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006865
6866 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006867 if (UseGCC47) {
6868 CmdArgs.push_back("-rpath");
6869 CmdArgs.push_back("/usr/lib/gcc47");
6870 } else {
6871 CmdArgs.push_back("-rpath");
6872 CmdArgs.push_back("/usr/lib/gcc44");
6873 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006874 }
6875
Hans Wennborg70850d82013-07-18 20:29:38 +00006876 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006877 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006878 CmdArgs.push_back("-lm");
6879 }
6880
Daniel Dunbarcc912342009-05-02 18:28:39 +00006881 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006882 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006883
6884 if (!Args.hasArg(options::OPT_nolibc)) {
6885 CmdArgs.push_back("-lc");
6886 }
6887
John McCall65b8da02013-04-11 22:55:55 +00006888 if (UseGCC47) {
6889 if (Args.hasArg(options::OPT_static) ||
6890 Args.hasArg(options::OPT_static_libgcc)) {
6891 CmdArgs.push_back("-lgcc");
6892 CmdArgs.push_back("-lgcc_eh");
6893 } else {
6894 if (Args.hasArg(options::OPT_shared_libgcc)) {
6895 CmdArgs.push_back("-lgcc_pic");
6896 if (!Args.hasArg(options::OPT_shared))
6897 CmdArgs.push_back("-lgcc");
6898 } else {
6899 CmdArgs.push_back("-lgcc");
6900 CmdArgs.push_back("--as-needed");
6901 CmdArgs.push_back("-lgcc_pic");
6902 CmdArgs.push_back("--no-as-needed");
6903 }
6904 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006905 } else {
John McCall65b8da02013-04-11 22:55:55 +00006906 if (Args.hasArg(options::OPT_shared)) {
6907 CmdArgs.push_back("-lgcc_pic");
6908 } else {
6909 CmdArgs.push_back("-lgcc");
6910 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006911 }
6912 }
6913
6914 if (!Args.hasArg(options::OPT_nostdlib) &&
6915 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006916 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006917 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006918 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006919 else
6920 CmdArgs.push_back(Args.MakeArgString(
6921 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006922 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006923 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006924 }
6925
Bill Wendling08760582011-06-27 19:15:03 +00006926 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006927
Daniel Dunbarcc912342009-05-02 18:28:39 +00006928 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006929 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006930 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006931}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006932
6933void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6934 const InputInfo &Output,
6935 const InputInfoList &Inputs,
6936 const ArgList &Args,
6937 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006938 ArgStringList CmdArgs;
6939
6940 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006941 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6942 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006943 } else {
6944 assert(Output.isNothing() && "Invalid output.");
6945 }
6946
6947 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006948 !Args.hasArg(options::OPT_nostartfiles) &&
6949 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006950 CmdArgs.push_back("-defaultlib:libcmt");
6951 }
6952
6953 CmdArgs.push_back("-nologo");
6954
Hans Wennborgf1a74252013-09-10 20:18:04 +00006955 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6956
6957 if (DLL) {
6958 CmdArgs.push_back(Args.MakeArgString("-dll"));
6959
6960 SmallString<128> ImplibName(Output.getFilename());
6961 llvm::sys::path::replace_extension(ImplibName, "lib");
6962 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6963 ImplibName.str()));
6964 }
6965
Peter Collingbourne32701642013-11-01 18:16:25 +00006966 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006967 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006968 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006969 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006970 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6971 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006972 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006973 } else {
6974 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6975 }
6976 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006977 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6978 }
6979
Michael J. Spencere2f49362012-06-18 16:56:04 +00006980 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006981 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006982
6983 // Add filenames immediately.
6984 for (InputInfoList::const_iterator
6985 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6986 if (it->isFilename())
6987 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006988 else
6989 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006990 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006991
6992 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006993 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006994 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6995}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006996
6997void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6998 const InputInfo &Output,
6999 const InputInfoList &Inputs,
7000 const ArgList &Args,
7001 const char *LinkingOutput) const {
7002 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7003}
7004
Hans Wennborg188382e2013-09-20 18:16:35 +00007005// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7006// If one cannot be found, return FallbackName.
7007// We do this special search to prevent clang-cl from falling back onto itself
7008// if it's available as cl.exe on the path.
7009static std::string FindFallback(const char *FallbackName,
7010 const char *ClangProgramPath) {
7011 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7012 if (!OptPath.hasValue())
7013 return FallbackName;
7014
7015#ifdef LLVM_ON_WIN32
7016 const StringRef PathSeparators = ";";
7017#else
7018 const StringRef PathSeparators = ":";
7019#endif
7020
7021 SmallVector<StringRef, 8> PathSegments;
7022 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7023
7024 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7025 const StringRef &PathSegment = PathSegments[i];
7026 if (PathSegment.empty())
7027 continue;
7028
7029 SmallString<128> FilePath(PathSegment);
7030 llvm::sys::path::append(FilePath, FallbackName);
7031 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7032 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7033 return FilePath.str();
7034 }
7035
7036 return FallbackName;
7037}
7038
Hans Wennborg87cfa712013-09-19 20:32:16 +00007039Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7040 const InputInfo &Output,
7041 const InputInfoList &Inputs,
7042 const ArgList &Args,
7043 const char *LinkingOutput) const {
7044 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007045 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007046 CmdArgs.push_back("/c"); // Compile only.
7047 CmdArgs.push_back("/W0"); // No warnings.
7048
7049 // The goal is to be able to invoke this tool correctly based on
7050 // any flag accepted by clang-cl.
7051
7052 // These are spelled the same way in clang and cl.exe,.
7053 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7054 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007055
7056 // Optimization level.
7057 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7058 if (A->getOption().getID() == options::OPT_O0) {
7059 CmdArgs.push_back("/Od");
7060 } else {
7061 StringRef OptLevel = A->getValue();
7062 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7063 A->render(Args, CmdArgs);
7064 else if (OptLevel == "3")
7065 CmdArgs.push_back("/Ox");
7066 }
7067 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007068
7069 // Flags for which clang-cl have an alias.
7070 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7071
7072 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7073 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7074 : "/GR-");
7075 if (Args.hasArg(options::OPT_fsyntax_only))
7076 CmdArgs.push_back("/Zs");
7077
Hans Wennborg260ff402013-09-27 17:54:18 +00007078 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7079 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7080 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7081
Hans Wennborg87cfa712013-09-19 20:32:16 +00007082 // Flags that can simply be passed through.
7083 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7084 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7085
7086 // The order of these flags is relevant, so pick the last one.
7087 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7088 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7089 A->render(Args, CmdArgs);
7090
7091
7092 // Input filename.
7093 assert(Inputs.size() == 1);
7094 const InputInfo &II = Inputs[0];
7095 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7096 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7097 if (II.isFilename())
7098 CmdArgs.push_back(II.getFilename());
7099 else
7100 II.getInputArg().renderAsInput(Args, CmdArgs);
7101
7102 // Output filename.
7103 assert(Output.getType() == types::TY_Object);
7104 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7105 Output.getFilename());
7106 CmdArgs.push_back(Fo);
7107
Hans Wennborg188382e2013-09-20 18:16:35 +00007108 const Driver &D = getToolChain().getDriver();
7109 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007110
Hans Wennborg188382e2013-09-20 18:16:35 +00007111 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007112}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007113
7114
7115/// XCore Tools
7116// We pass assemble and link construction to the xcc tool.
7117
7118void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7119 const InputInfo &Output,
7120 const InputInfoList &Inputs,
7121 const ArgList &Args,
7122 const char *LinkingOutput) const {
7123 ArgStringList CmdArgs;
7124
7125 CmdArgs.push_back("-o");
7126 CmdArgs.push_back(Output.getFilename());
7127
7128 CmdArgs.push_back("-c");
7129
7130 if (Args.hasArg(options::OPT_g_Group)) {
7131 CmdArgs.push_back("-g");
7132 }
7133
7134 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7135 options::OPT_Xassembler);
7136
7137 for (InputInfoList::const_iterator
7138 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7139 const InputInfo &II = *it;
7140 CmdArgs.push_back(II.getFilename());
7141 }
7142
7143 const char *Exec =
7144 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7145 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7146}
7147
7148void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7149 const InputInfo &Output,
7150 const InputInfoList &Inputs,
7151 const ArgList &Args,
7152 const char *LinkingOutput) const {
7153 ArgStringList CmdArgs;
7154
7155 if (Output.isFilename()) {
7156 CmdArgs.push_back("-o");
7157 CmdArgs.push_back(Output.getFilename());
7158 } else {
7159 assert(Output.isNothing() && "Invalid output.");
7160 }
7161
7162 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7163
7164 const char *Exec =
7165 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7166 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7167}