blob: a3a385d1cf13fef3dee8c4855607cf2d6a669dea [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"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000037#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000038#include "llvm/Support/Program.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) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +0000218 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Bill Wendling08760582011-06-27 19:15:03 +0000219 Args.hasArg(options::OPT_fcreate_profile) ||
220 Args.hasArg(options::OPT_coverage)))
221 return;
222
223 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
224 // the link line. We cannot do the same thing because unlike gcov there is a
225 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
226 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000227 std::string ProfileRT =
228 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000229
Bill Wendling08760582011-06-27 19:15:03 +0000230 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000231}
232
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000233static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000234 // Don't forward inputs from the original command line. They are added from
235 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000236 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000237 !O.hasFlag(options::DriverOption) &&
238 !O.hasFlag(options::LinkerInput);
239}
240
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000241void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000242 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000243 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000244 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000245 ArgStringList &CmdArgs,
246 const InputInfo &Output,
247 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000248 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000249
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000250 CheckPreprocessingOptions(D, Args);
251
252 Args.AddLastArg(CmdArgs, options::OPT_C);
253 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000254
255 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000256 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000257 (A = Args.getLastArg(options::OPT_MD)) ||
258 (A = Args.getLastArg(options::OPT_MMD))) {
259 // Determine the output location.
260 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000261 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000262 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000263 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000264 } else if (Output.getType() == types::TY_Dependencies) {
265 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000266 } else if (A->getOption().matches(options::OPT_M) ||
267 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000268 DepFile = "-";
269 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000270 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000271 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 }
273 CmdArgs.push_back("-dependency-file");
274 CmdArgs.push_back(DepFile);
275
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000276 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000277 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
278 const char *DepTarget;
279
280 // If user provided -o, that is the dependency target, except
281 // when we are only generating a dependency file.
282 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
283 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000284 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000285 } else {
286 // Otherwise derive from the base input.
287 //
288 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000289 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000290 llvm::sys::path::replace_extension(P, "o");
291 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 }
293
294 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000295 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000296 QuoteTarget(DepTarget, Quoted);
297 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000298 }
299
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000300 if (A->getOption().matches(options::OPT_M) ||
301 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 CmdArgs.push_back("-sys-header-deps");
303 }
304
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000305 if (Args.hasArg(options::OPT_MG)) {
306 if (!A || A->getOption().matches(options::OPT_MD) ||
307 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000308 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000309 CmdArgs.push_back("-MG");
310 }
311
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000312 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000313
314 // Convert all -MQ <target> args to -MT <quoted target>
315 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
316 options::OPT_MQ),
317 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000318 const Arg *A = *it;
319 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320
Daniel Dunbara442fd52010-06-11 22:00:13 +0000321 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000323 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000324 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 CmdArgs.push_back(Args.MakeArgString(Quoted));
326
327 // -MT flag - no change
328 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000329 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000330 }
331 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332
Douglas Gregor111af7d2009-04-18 00:34:01 +0000333 // Add -i* options, and automatically translate to
334 // -include-pch/-include-pth for transparent PCH support. It's
335 // wonky, but we include looking for .gch so we can support seamless
336 // replacement into a build system already set up to be generating
337 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000338 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000339 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
340 ie = Args.filtered_end(); it != ie; ++it) {
341 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000342
343 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
345 RenderedImplicitInclude = true;
346
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000347 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000348 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000349
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000350 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000351 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000352 SmallString<128> P(A->getValue());
353 // We want the files to have a name like foo.h.pch. Add a dummy extension
354 // so that replace_extension does the right thing.
355 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000356 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000357 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000358 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000359 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000360 }
361
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000363 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000364 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000366 }
367
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000369 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000370 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000371 FoundPCH = UsePCH;
372 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000373 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000374 }
375
376 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000377 if (IsFirstImplicitInclude) {
378 A->claim();
379 if (UsePCH)
380 CmdArgs.push_back("-include-pch");
381 else
382 CmdArgs.push_back("-include-pth");
383 CmdArgs.push_back(Args.MakeArgString(P.str()));
384 continue;
385 } else {
386 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000387 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000388 << P.str() << A->getAsString(Args);
389 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391 }
392
393 // Not translated, render as usual.
394 A->claim();
395 A->render(Args, CmdArgs);
396 }
397
398 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000399 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
400 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000401
402 // Add -Wp, and -Xassembler if using the preprocessor.
403
404 // FIXME: There is a very unfortunate problem here, some troubled
405 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
406 // really support that we would have to parse and then translate
407 // those options. :(
408 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
409 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000410
411 // -I- is a deprecated GCC feature, reject it.
412 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000413 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000414
415 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
416 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000417 StringRef sysroot = C.getSysRoot();
418 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000419 if (!Args.hasArg(options::OPT_isysroot)) {
420 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000421 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 }
423 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000424
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000425 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000426 // FIXME: We should probably sink the logic for handling these from the
427 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // CPATH - included following the user specified includes (but prior to
429 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000433 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000436 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000437 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000438 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000439
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000440 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000441 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000442 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000443
444 // Add system include arguments.
445 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000446}
447
Amara Emerson703da2e2013-10-31 09:32:33 +0000448/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
449//
450// FIXME: tblgen this.
451static std::string getAArch64TargetCPU(const ArgList &Args,
452 const llvm::Triple &Triple) {
453 // FIXME: Warn on inconsistent use of -mcpu and -march.
454
455 // If we have -mcpu=, use that.
456 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
457 StringRef MCPU = A->getValue();
458 // Handle -mcpu=native.
459 if (MCPU == "native")
460 return llvm::sys::getHostCPUName();
461 else
462 return MCPU;
463 }
464
465 return "generic";
466}
467
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000468// FIXME: Move to target hook.
469static bool isSignedCharDefault(const llvm::Triple &Triple) {
470 switch (Triple.getArch()) {
471 default:
472 return true;
473
Tim Northover9bb857a2013-01-31 12:13:10 +0000474 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000475 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000476 case llvm::Triple::ppc:
477 case llvm::Triple::ppc64:
Tim Northover157d9112014-01-16 08:48:16 +0000478 if (Triple.isOSBinFormatMachO())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000479 return true;
480 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000481
Bill Schmidt778d3872013-07-26 01:36:11 +0000482 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000483 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000484 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000485 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000486 }
487}
488
Robert Lytton0e076492013-08-13 09:43:10 +0000489static bool isNoCommonDefault(const llvm::Triple &Triple) {
490 switch (Triple.getArch()) {
491 default:
492 return false;
493
494 case llvm::Triple::xcore:
495 return true;
496 }
497}
498
Chad Rosiercfbfc582012-04-04 20:51:35 +0000499// Handle -mfpu=.
500//
501// FIXME: Centralize feature selection, defaulting shouldn't be also in the
502// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000503static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
504 const ArgList &Args,
505 std::vector<const char *> &Features) {
506 StringRef FPU = A->getValue();
507 if (FPU == "fp-armv8") {
508 Features.push_back("+fp-armv8");
509 } else if (FPU == "neon-fp-armv8") {
510 Features.push_back("+fp-armv8");
511 Features.push_back("+neon");
512 } else if (FPU == "crypto-neon-fp-armv8") {
513 Features.push_back("+fp-armv8");
514 Features.push_back("+neon");
515 Features.push_back("+crypto");
516 } else if (FPU == "neon") {
517 Features.push_back("+neon");
518 } else if (FPU == "none") {
519 Features.push_back("-fp-armv8");
520 Features.push_back("-crypto");
521 Features.push_back("-neon");
522 } else
523 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
524}
525
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000526// Handle -mhwdiv=.
527static void getARMHWDivFeatures(const Driver &D, const Arg *A,
528 const ArgList &Args,
529 std::vector<const char *> &Features) {
530 StringRef HWDiv = A->getValue();
531 if (HWDiv == "arm") {
532 Features.push_back("+hwdiv-arm");
533 Features.push_back("-hwdiv");
534 } else if (HWDiv == "thumb") {
535 Features.push_back("-hwdiv-arm");
536 Features.push_back("+hwdiv");
537 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
538 Features.push_back("+hwdiv-arm");
539 Features.push_back("+hwdiv");
540 } else if (HWDiv == "none") {
541 Features.push_back("-hwdiv-arm");
542 Features.push_back("-hwdiv");
543 } else
544 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
545}
546
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000547// Handle -mfpu=.
548//
549// FIXME: Centralize feature selection, defaulting shouldn't be also in the
550// frontend target.
551static void getARMFPUFeatures(const Driver &D, const Arg *A,
552 const ArgList &Args,
553 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000554 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000555
556 // Set the target features based on the FPU.
557 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
558 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000559 Features.push_back("-vfp2");
560 Features.push_back("-vfp3");
561 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000562 } else if (FPU == "vfp") {
563 Features.push_back("+vfp2");
564 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000565 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000566 Features.push_back("+vfp3");
567 Features.push_back("+d16");
568 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000569 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000570 Features.push_back("+vfp3");
571 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000572 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
573 Features.push_back("+vfp4");
574 Features.push_back("+d16");
575 Features.push_back("-neon");
576 } else if (FPU == "vfp4" || FPU == "vfpv4") {
577 Features.push_back("+vfp4");
578 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000579 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000580 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000581 Features.push_back("-neon");
582 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000583 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000584 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000585 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000586 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000587 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000588 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000589 Features.push_back("+neon");
590 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000591 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000592 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000593 } else if (FPU == "none") {
594 Features.push_back("-vfp2");
595 Features.push_back("-vfp3");
596 Features.push_back("-vfp4");
597 Features.push_back("-fp-armv8");
598 Features.push_back("-crypto");
599 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000600 } else
601 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
602}
603
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000604// Select the float ABI as determined by -msoft-float, -mhard-float, and
605// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000606StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
607 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000608 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
610 options::OPT_mhard_float,
611 options::OPT_mfloat_abi_EQ)) {
612 if (A->getOption().matches(options::OPT_msoft_float))
613 FloatABI = "soft";
614 else if (A->getOption().matches(options::OPT_mhard_float))
615 FloatABI = "hard";
616 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000617 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000618 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000619 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000620 << A->getAsString(Args);
621 FloatABI = "soft";
622 }
623 }
624 }
625
626 // If unspecified, choose the default based on the platform.
627 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000628 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000629 case llvm::Triple::Darwin:
630 case llvm::Triple::MacOSX:
631 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000632 // Darwin defaults to "softfp" for v6 and v7.
633 //
634 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000635 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000636 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000637 if (StringRef(ArchName).startswith("v6") ||
638 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 FloatABI = "softfp";
640 else
641 FloatABI = "soft";
642 break;
643 }
644
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000645 case llvm::Triple::FreeBSD:
646 // FreeBSD defaults to soft float
647 FloatABI = "soft";
648 break;
649
Daniel Dunbar78485922009-09-10 23:00:09 +0000650 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000651 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000652 case llvm::Triple::GNUEABIHF:
653 FloatABI = "hard";
654 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000655 case llvm::Triple::GNUEABI:
656 FloatABI = "softfp";
657 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000658 case llvm::Triple::EABIHF:
659 FloatABI = "hard";
660 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000661 case llvm::Triple::EABI:
662 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
663 FloatABI = "softfp";
664 break;
Tim Northover5a68c4b2014-01-23 15:00:01 +0000665 case llvm::Triple::MachO: {
666 FloatABI = "soft";
667 break;
668 }
Logan Chienc6fd8202012-09-02 09:30:11 +0000669 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000670 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000671 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000672 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000673 FloatABI = "softfp";
674 else
675 FloatABI = "soft";
676 break;
677 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000678 default:
679 // Assume "soft", but warn the user we are guessing.
680 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000681 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000682 break;
683 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000684 }
685 }
686
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000687 return FloatABI;
688}
689
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000690static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
691 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000692 std::vector<const char *> &Features,
693 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000694 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000695 if (!ForAS) {
696 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
697 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
698 // stripped out by the ARM target. We should probably pass this a new
699 // -target-option, which is handled by the -cc1/-cc1as invocation.
700 //
701 // FIXME2: For consistency, it would be ideal if we set up the target
702 // machine state the same when using the frontend or the assembler. We don't
703 // currently do that for the assembler, we pass the options directly to the
704 // backend and never even instantiate the frontend TargetInfo. If we did,
705 // and used its handleTargetFeatures hook, then we could ensure the
706 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000707
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000708 // Use software floating point operations?
709 if (FloatABI == "soft")
710 Features.push_back("+soft-float");
711
712 // Use software floating point argument passing?
713 if (FloatABI != "hard")
714 Features.push_back("+soft-float-abi");
715 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000716
717 // Honor -mfpu=.
718 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000719 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000720 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
721 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000722
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000723 // Setting -msoft-float effectively disables NEON because of the GCC
724 // implementation, although the same isn't true of VFP or VFP3.
725 if (FloatABI == "soft")
726 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000727
728 // En/disable crc
729 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
730 options::OPT_mnocrc)) {
731 if (A->getOption().matches(options::OPT_mcrc))
732 Features.push_back("+crc");
733 else
734 Features.push_back("-crc");
735 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000736}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000737
738void Clang::AddARMTargetArgs(const ArgList &Args,
739 ArgStringList &CmdArgs,
740 bool KernelOrKext) const {
741 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000742 // Get the effective triple, which takes into account the deployment target.
743 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
744 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000745 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000746
747 // Select the ABI to use.
748 //
749 // FIXME: Support -meabi.
750 const char *ABIName = 0;
751 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000752 ABIName = A->getValue();
Tim Northover157d9112014-01-16 08:48:16 +0000753 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000754 // The backend is hardwired to assume AAPCS for M-class processors, ensure
755 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000756 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Tim Northover157d9112014-01-16 08:48:16 +0000757 Triple.getEnvironment() == llvm::Triple::MachO ||
Tim Northovere66c9462013-10-03 14:23:28 +0000758 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000759 ABIName = "aapcs";
760 } else {
761 ABIName = "apcs-gnu";
762 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000763 } else {
764 // Select the default based on the platform.
765 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000766 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000767 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000768 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000769 ABIName = "aapcs-linux";
770 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000771 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000772 case llvm::Triple::EABI:
773 ABIName = "aapcs";
774 break;
775 default:
776 ABIName = "apcs-gnu";
777 }
778 }
779 CmdArgs.push_back("-target-abi");
780 CmdArgs.push_back(ABIName);
781
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000782 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000783 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000784 if (FloatABI == "soft") {
785 // Floating point operations and argument passing are soft.
786 //
787 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000788 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000789 CmdArgs.push_back("-mfloat-abi");
790 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000791 } else if (FloatABI == "softfp") {
792 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000793 CmdArgs.push_back("-mfloat-abi");
794 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000795 } else {
796 // Floating point operations and argument passing are hard.
797 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000798 CmdArgs.push_back("-mfloat-abi");
799 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000800 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000801
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000802 // Kernel code has more strict alignment requirements.
803 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000804 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000805 CmdArgs.push_back("-backend-option");
806 CmdArgs.push_back("-arm-long-calls");
807 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000808
Daniel Dunbar12100e22011-03-22 16:48:17 +0000809 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000810 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000811
812 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000813 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000814 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000815 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000816
817 // Setting -mno-global-merge disables the codegen global merge pass. Setting
818 // -mglobal-merge has no effect as the pass is enabled by default.
819 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
820 options::OPT_mno_global_merge)) {
821 if (A->getOption().matches(options::OPT_mno_global_merge))
822 CmdArgs.push_back("-mno-global-merge");
823 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000824
Bob Wilson9c8af452013-04-11 18:53:25 +0000825 if (!Args.hasFlag(options::OPT_mimplicit_float,
826 options::OPT_mno_implicit_float,
827 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000828 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000829
830 // llvm does not support reserving registers in general. There is support
831 // for reserving r9 on ARM though (defined as a platform-specific register
832 // in ARM EABI).
833 if (Args.hasArg(options::OPT_ffixed_r9)) {
834 CmdArgs.push_back("-backend-option");
835 CmdArgs.push_back("-arm-reserve-r9");
836 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000837}
838
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000839// Get CPU and ABI names. They are not independent
840// so we have to calculate them together.
841static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000842 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000843 StringRef &CPUName,
844 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000845 const char *DefMips32CPU = "mips32";
846 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000847
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000848 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000849 options::OPT_mcpu_EQ))
850 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000851
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000852 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000853 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000854 // Convert a GNU style Mips ABI name to the name
855 // accepted by LLVM Mips backend.
856 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
857 .Case("32", "o32")
858 .Case("64", "n64")
859 .Default(ABIName);
860 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000861
862 // Setup default CPU and ABI names.
863 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000864 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000865 default:
866 llvm_unreachable("Unexpected triple arch name");
867 case llvm::Triple::mips:
868 case llvm::Triple::mipsel:
869 CPUName = DefMips32CPU;
870 break;
871 case llvm::Triple::mips64:
872 case llvm::Triple::mips64el:
873 CPUName = DefMips64CPU;
874 break;
875 }
876 }
877
878 if (!ABIName.empty()) {
879 // Deduce CPU name from ABI name.
880 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000881 .Cases("32", "o32", "eabi", DefMips32CPU)
882 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000883 .Default("");
884 }
885 else if (!CPUName.empty()) {
886 // Deduce ABI name from CPU name.
887 ABIName = llvm::StringSwitch<const char *>(CPUName)
888 .Cases("mips32", "mips32r2", "o32")
889 .Cases("mips64", "mips64r2", "n64")
890 .Default("");
891 }
892
893 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000894}
895
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000896// Convert ABI name to the GNU tools acceptable variant.
897static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
898 return llvm::StringSwitch<llvm::StringRef>(ABI)
899 .Case("o32", "32")
900 .Case("n64", "64")
901 .Default(ABI);
902}
903
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000904// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
905// and -mfloat-abi=.
906static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000907 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000908 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000909 options::OPT_mhard_float,
910 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000911 if (A->getOption().matches(options::OPT_msoft_float))
912 FloatABI = "soft";
913 else if (A->getOption().matches(options::OPT_mhard_float))
914 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000915 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000916 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000917 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000918 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000919 FloatABI = "hard";
920 }
921 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000922 }
923
924 // If unspecified, choose the default based on the platform.
925 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000926 // Assume "hard", because it's a default value used by gcc.
927 // When we start to recognize specific target MIPS processors,
928 // we will be able to select the default more correctly.
929 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000930 }
931
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000932 return FloatABI;
933}
934
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000935static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000936 std::vector<const char *> &Features,
937 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000938 StringRef FeatureName) {
939 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000940 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000941 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000942 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000943 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000944 }
945}
946
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000947static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
948 std::vector<const char *> &Features) {
949 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000950 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000951 // FIXME: Note, this is a hack. We need to pass the selected float
952 // mode to the MipsTargetInfoBase to define appropriate macros there.
953 // Now it is the only method.
954 Features.push_back("+soft-float");
955 }
956
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000957 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
958 if (StringRef(A->getValue()) == "2008")
959 Features.push_back("+nan2008");
960 }
961
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000962 AddTargetFeature(Args, Features, options::OPT_msingle_float,
963 options::OPT_mdouble_float, "single-float");
964 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
965 "mips16");
966 AddTargetFeature(Args, Features, options::OPT_mmicromips,
967 options::OPT_mno_micromips, "micromips");
968 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
969 "dsp");
970 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
971 "dspr2");
972 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
973 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +0000974 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
975 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000976}
977
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000978void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000979 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000980 const Driver &D = getToolChain().getDriver();
981 StringRef CPUName;
982 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000983 const llvm::Triple &Triple = getToolChain().getTriple();
984 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000985
986 CmdArgs.push_back("-target-abi");
987 CmdArgs.push_back(ABIName.data());
988
989 StringRef FloatABI = getMipsFloatABI(D, Args);
990
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000991 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +0000992 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000993 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000996 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000997 else {
998 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000999 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001000 CmdArgs.push_back("-mfloat-abi");
1001 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001002 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001003
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001004 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1005 if (A->getOption().matches(options::OPT_mxgot)) {
1006 CmdArgs.push_back("-mllvm");
1007 CmdArgs.push_back("-mxgot");
1008 }
1009 }
1010
Simon Atanasyanc580b322013-05-11 06:33:44 +00001011 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1012 options::OPT_mno_ldc1_sdc1)) {
1013 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1014 CmdArgs.push_back("-mllvm");
1015 CmdArgs.push_back("-mno-ldc1-sdc1");
1016 }
1017 }
1018
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001019 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1020 options::OPT_mno_check_zero_division)) {
1021 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1022 CmdArgs.push_back("-mllvm");
1023 CmdArgs.push_back("-mno-check-zero-division");
1024 }
1025 }
1026
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001027 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001028 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001029 CmdArgs.push_back("-mllvm");
1030 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1031 A->claim();
1032 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001033}
1034
Hal Finkel8eb59282012-06-11 22:35:19 +00001035/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1036static std::string getPPCTargetCPU(const ArgList &Args) {
1037 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001038 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001039
1040 if (CPUName == "native") {
1041 std::string CPU = llvm::sys::getHostCPUName();
1042 if (!CPU.empty() && CPU != "generic")
1043 return CPU;
1044 else
1045 return "";
1046 }
1047
1048 return llvm::StringSwitch<const char *>(CPUName)
1049 .Case("common", "generic")
1050 .Case("440", "440")
1051 .Case("440fp", "440")
1052 .Case("450", "450")
1053 .Case("601", "601")
1054 .Case("602", "602")
1055 .Case("603", "603")
1056 .Case("603e", "603e")
1057 .Case("603ev", "603ev")
1058 .Case("604", "604")
1059 .Case("604e", "604e")
1060 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001061 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001062 .Case("G3", "g3")
1063 .Case("7400", "7400")
1064 .Case("G4", "g4")
1065 .Case("7450", "7450")
1066 .Case("G4+", "g4+")
1067 .Case("750", "750")
1068 .Case("970", "970")
1069 .Case("G5", "g5")
1070 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001071 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001072 .Case("e500mc", "e500mc")
1073 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001074 .Case("power3", "pwr3")
1075 .Case("power4", "pwr4")
1076 .Case("power5", "pwr5")
1077 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001078 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001079 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001080 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001081 .Case("pwr3", "pwr3")
1082 .Case("pwr4", "pwr4")
1083 .Case("pwr5", "pwr5")
1084 .Case("pwr5x", "pwr5x")
1085 .Case("pwr6", "pwr6")
1086 .Case("pwr6x", "pwr6x")
1087 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001088 .Case("powerpc", "ppc")
1089 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001090 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001091 .Default("");
1092 }
1093
1094 return "";
1095}
1096
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001097static void getPPCTargetFeatures(const ArgList &Args,
1098 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001099 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1100 ie = Args.filtered_end();
1101 it != ie; ++it) {
1102 StringRef Name = (*it)->getOption().getName();
1103 (*it)->claim();
1104
1105 // Skip over "-m".
1106 assert(Name.startswith("m") && "Invalid feature name.");
1107 Name = Name.substr(1);
1108
1109 bool IsNegative = Name.startswith("no-");
1110 if (IsNegative)
1111 Name = Name.substr(3);
1112
1113 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1114 // pass the correct option to the backend while calling the frontend
1115 // option the same.
1116 // TODO: Change the LLVM backend option maybe?
1117 if (Name == "mfcrf")
1118 Name = "mfocrf";
1119
1120 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1121 }
1122
1123 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001124 AddTargetFeature(Args, Features, options::OPT_faltivec,
1125 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001126}
1127
Tom Stellard6674c702013-04-01 20:56:53 +00001128/// Get the (LLVM) name of the R600 gpu we are targeting.
1129static std::string getR600TargetGPU(const ArgList &Args) {
1130 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001131 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001132 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001133 .Cases("rv630", "rv635", "r600")
1134 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001135 .Case("rv740", "rv770")
1136 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001137 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001138 .Case("hemlock", "cypress")
1139 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001140 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001141 }
1142 return "";
1143}
1144
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001145static void getSparcTargetFeatures(const ArgList &Args,
1146 std::vector<const char *> Features) {
1147 bool SoftFloatABI = true;
1148 if (Arg *A =
1149 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1150 if (A->getOption().matches(options::OPT_mhard_float))
1151 SoftFloatABI = false;
1152 }
1153 if (SoftFloatABI)
1154 Features.push_back("+soft-float");
1155}
1156
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001157void Clang::AddSparcTargetArgs(const ArgList &Args,
1158 ArgStringList &CmdArgs) const {
1159 const Driver &D = getToolChain().getDriver();
1160
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001161 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001162 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001163 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1164 options::OPT_mhard_float)) {
1165 if (A->getOption().matches(options::OPT_msoft_float))
1166 FloatABI = "soft";
1167 else if (A->getOption().matches(options::OPT_mhard_float))
1168 FloatABI = "hard";
1169 }
1170
1171 // If unspecified, choose the default based on the platform.
1172 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001173 // Assume "soft", but warn the user we are guessing.
1174 FloatABI = "soft";
1175 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001176 }
1177
1178 if (FloatABI == "soft") {
1179 // Floating point operations and argument passing are soft.
1180 //
1181 // FIXME: This changes CPP defines, we need -target-soft-float.
1182 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001183 } else {
1184 assert(FloatABI == "hard" && "Invalid float abi!");
1185 CmdArgs.push_back("-mhard-float");
1186 }
1187}
1188
Richard Sandiford4652d892013-07-19 16:51:51 +00001189static const char *getSystemZTargetCPU(const ArgList &Args) {
1190 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1191 return A->getValue();
1192 return "z10";
1193}
1194
Chandler Carruth953fb082013-01-13 11:46:33 +00001195static const char *getX86TargetCPU(const ArgList &Args,
1196 const llvm::Triple &Triple) {
1197 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001198 if (StringRef(A->getValue()) != "native") {
Tim Northover157d9112014-01-16 08:48:16 +00001199 if (Triple.isOSBinFormatMachO() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001200 return "core-avx2";
1201
Chandler Carruth953fb082013-01-13 11:46:33 +00001202 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001203 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001204
1205 // FIXME: Reject attempts to use -march=native unless the target matches
1206 // the host.
1207 //
1208 // FIXME: We should also incorporate the detected target features for use
1209 // with -native.
1210 std::string CPU = llvm::sys::getHostCPUName();
1211 if (!CPU.empty() && CPU != "generic")
1212 return Args.MakeArgString(CPU);
1213 }
1214
1215 // Select the default CPU if none was given (or detection failed).
1216
1217 if (Triple.getArch() != llvm::Triple::x86_64 &&
1218 Triple.getArch() != llvm::Triple::x86)
1219 return 0; // This routine is only handling x86 targets.
1220
1221 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1222
1223 // FIXME: Need target hooks.
Tim Northover157d9112014-01-16 08:48:16 +00001224 if (Triple.isOSBinFormatMachO()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001225 if (Triple.getArchName() == "x86_64h")
1226 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001227 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001228 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001229
Chandler Carruth953fb082013-01-13 11:46:33 +00001230 // All x86 devices running Android have core2 as their common
1231 // denominator. This makes a better choice than pentium4.
1232 if (Triple.getEnvironment() == llvm::Triple::Android)
1233 return "core2";
1234
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001235 // Everything else goes to x86-64 in 64-bit mode.
1236 if (Is64Bit)
1237 return "x86-64";
1238
1239 switch (Triple.getOS()) {
1240 case llvm::Triple::FreeBSD:
1241 case llvm::Triple::NetBSD:
1242 case llvm::Triple::OpenBSD:
1243 return "i486";
1244 case llvm::Triple::Haiku:
1245 return "i586";
1246 case llvm::Triple::Bitrig:
1247 return "i686";
1248 default:
1249 // Fallback to p4.
1250 return "pentium4";
1251 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001252}
1253
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001254static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1255 switch(T.getArch()) {
1256 default:
1257 return "";
1258
Amara Emerson703da2e2013-10-31 09:32:33 +00001259 case llvm::Triple::aarch64:
1260 return getAArch64TargetCPU(Args, T);
1261
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001262 case llvm::Triple::arm:
1263 case llvm::Triple::thumb:
Bernard Ogden31561762013-12-12 13:27:11 +00001264 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001265
1266 case llvm::Triple::mips:
1267 case llvm::Triple::mipsel:
1268 case llvm::Triple::mips64:
1269 case llvm::Triple::mips64el: {
1270 StringRef CPUName;
1271 StringRef ABIName;
1272 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1273 return CPUName;
1274 }
1275
1276 case llvm::Triple::ppc:
1277 case llvm::Triple::ppc64:
1278 case llvm::Triple::ppc64le: {
1279 std::string TargetCPUName = getPPCTargetCPU(Args);
1280 // LLVM may default to generating code for the native CPU,
1281 // but, like gcc, we default to a more generic option for
1282 // each architecture. (except on Darwin)
1283 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1284 if (T.getArch() == llvm::Triple::ppc64)
1285 TargetCPUName = "ppc64";
1286 else if (T.getArch() == llvm::Triple::ppc64le)
1287 TargetCPUName = "ppc64le";
1288 else
1289 TargetCPUName = "ppc";
1290 }
1291 return TargetCPUName;
1292 }
1293
1294 case llvm::Triple::sparc:
1295 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1296 return A->getValue();
1297 return "";
1298
1299 case llvm::Triple::x86:
1300 case llvm::Triple::x86_64:
1301 return getX86TargetCPU(Args, T);
1302
1303 case llvm::Triple::hexagon:
1304 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1305
1306 case llvm::Triple::systemz:
1307 return getSystemZTargetCPU(Args);
1308
1309 case llvm::Triple::r600:
1310 return getR600TargetGPU(Args);
1311 }
1312}
1313
Alp Tokerce365ca2013-12-02 12:43:03 +00001314static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1315 ArgStringList &CmdArgs) {
1316 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1317 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1318 // forward.
1319 CmdArgs.push_back("-plugin");
1320 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1321 CmdArgs.push_back(Args.MakeArgString(Plugin));
1322
1323 // Try to pass driver level flags relevant to LTO code generation down to
1324 // the plugin.
1325
1326 // Handle flags for selecting CPU variants.
1327 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1328 if (!CPU.empty())
1329 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1330}
1331
Jim Grosbach82eee262013-11-16 00:53:35 +00001332static void getX86TargetFeatures(const llvm::Triple &Triple,
1333 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001334 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001335 if (Triple.getArchName() == "x86_64h") {
1336 // x86_64h implies quite a few of the more modern subtarget features
1337 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1338 Features.push_back("-rdrnd");
1339 Features.push_back("-aes");
1340 Features.push_back("-pclmul");
1341 Features.push_back("-rtm");
1342 Features.push_back("-hle");
1343 Features.push_back("-fsgsbase");
1344 }
1345
1346 // Now add any that the user explicitly requested on the command line,
1347 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001348 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1349 ie = Args.filtered_end();
1350 it != ie; ++it) {
1351 StringRef Name = (*it)->getOption().getName();
1352 (*it)->claim();
1353
1354 // Skip over "-m".
1355 assert(Name.startswith("m") && "Invalid feature name.");
1356 Name = Name.substr(1);
1357
1358 bool IsNegative = Name.startswith("no-");
1359 if (IsNegative)
1360 Name = Name.substr(3);
1361
1362 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1363 }
1364}
1365
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001366void Clang::AddX86TargetArgs(const ArgList &Args,
1367 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001368 if (!Args.hasFlag(options::OPT_mred_zone,
1369 options::OPT_mno_red_zone,
1370 true) ||
1371 Args.hasArg(options::OPT_mkernel) ||
1372 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001373 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001374
Bob Wilson2616e2e2013-02-10 16:01:41 +00001375 // Default to avoid implicit floating-point for kernel/kext code, but allow
1376 // that to be overridden with -mno-soft-float.
1377 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1378 Args.hasArg(options::OPT_fapple_kext));
1379 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1380 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001381 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001382 options::OPT_mno_implicit_float)) {
1383 const Option &O = A->getOption();
1384 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1385 O.matches(options::OPT_msoft_float));
1386 }
1387 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001388 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001389}
1390
Matthew Curtise8f80a12012-12-06 17:49:03 +00001391static inline bool HasPICArg(const ArgList &Args) {
1392 return Args.hasArg(options::OPT_fPIC)
1393 || Args.hasArg(options::OPT_fpic);
1394}
1395
1396static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1397 return Args.getLastArg(options::OPT_G,
1398 options::OPT_G_EQ,
1399 options::OPT_msmall_data_threshold_EQ);
1400}
1401
1402static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1403 std::string value;
1404 if (HasPICArg(Args))
1405 value = "0";
1406 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1407 value = A->getValue();
1408 A->claim();
1409 }
1410 return value;
1411}
1412
Tony Linthicum76329bf2011-12-12 21:14:55 +00001413void Clang::AddHexagonTargetArgs(const ArgList &Args,
1414 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001415 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001416 CmdArgs.push_back("-mqdsp6-compat");
1417 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001418
Matthew Curtise8f80a12012-12-06 17:49:03 +00001419 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1420 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001421 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001422 CmdArgs.push_back(Args.MakeArgString(
1423 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001424 }
1425
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001426 if (!Args.hasArg(options::OPT_fno_short_enums))
1427 CmdArgs.push_back("-fshort-enums");
1428 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1429 CmdArgs.push_back ("-mllvm");
1430 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1431 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001432 CmdArgs.push_back ("-mllvm");
1433 CmdArgs.push_back ("-machine-sink-split=0");
1434}
1435
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001436static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1437 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001438 // Honor -mfpu=.
1439 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001440 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001441}
1442
1443static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001444 const ArgList &Args, ArgStringList &CmdArgs,
1445 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001446 std::vector<const char *> Features;
1447 switch (Triple.getArch()) {
1448 default:
1449 break;
1450 case llvm::Triple::mips:
1451 case llvm::Triple::mipsel:
1452 case llvm::Triple::mips64:
1453 case llvm::Triple::mips64el:
1454 getMIPSTargetFeatures(D, Args, Features);
1455 break;
1456
1457 case llvm::Triple::arm:
1458 case llvm::Triple::thumb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001459 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001460 break;
1461
1462 case llvm::Triple::ppc:
1463 case llvm::Triple::ppc64:
1464 case llvm::Triple::ppc64le:
1465 getPPCTargetFeatures(Args, Features);
1466 break;
1467 case llvm::Triple::sparc:
1468 getSparcTargetFeatures(Args, Features);
1469 break;
1470 case llvm::Triple::aarch64:
1471 getAArch64TargetFeatures(D, Args, Features);
1472 break;
1473 case llvm::Triple::x86:
1474 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001475 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001476 break;
1477 }
Rafael Espindola43964802013-08-21 17:34:32 +00001478
1479 // Find the last of each feature.
1480 llvm::StringMap<unsigned> LastOpt;
1481 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1482 const char *Name = Features[I];
1483 assert(Name[0] == '-' || Name[0] == '+');
1484 LastOpt[Name + 1] = I;
1485 }
1486
1487 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1488 // If this feature was overridden, ignore it.
1489 const char *Name = Features[I];
1490 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1491 assert(LastI != LastOpt.end());
1492 unsigned Last = LastI->second;
1493 if (Last != I)
1494 continue;
1495
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001496 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001497 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001498 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001499}
1500
Eric Christopher84fbdb42011-08-19 00:30:14 +00001501static bool
John McCall5fb5df92012-06-20 06:18:46 +00001502shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001503 const llvm::Triple &Triple) {
1504 // We use the zero-cost exception tables for Objective-C if the non-fragile
1505 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1506 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001507 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001508 return true;
1509
Bob Wilson83e723a2013-12-05 19:38:42 +00001510 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001511 return false;
1512
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001513 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001514 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001515 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001516}
1517
Anders Carlssone96ab552011-02-28 02:27:16 +00001518/// addExceptionArgs - Adds exception related arguments to the driver command
1519/// arguments. There's a master flag, -fexceptions and also language specific
1520/// flags to enable/disable C++ and Objective-C exceptions.
1521/// This makes it possible to for example disable C++ exceptions but enable
1522/// Objective-C exceptions.
1523static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1524 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001525 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001526 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001527 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001528 if (KernelOrKext) {
1529 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1530 // arguments now to avoid warnings about unused arguments.
1531 Args.ClaimAllArgs(options::OPT_fexceptions);
1532 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1533 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1534 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1535 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1536 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001537 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001538 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001539
1540 // Exceptions are enabled by default.
1541 bool ExceptionsEnabled = true;
1542
1543 // This keeps track of whether exceptions were explicitly turned on or off.
1544 bool DidHaveExplicitExceptionFlag = false;
1545
Rafael Espindola00a66572009-10-01 13:33:33 +00001546 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1547 options::OPT_fno_exceptions)) {
1548 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001549 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001550 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001551 ExceptionsEnabled = false;
1552
1553 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001554 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001555
Anders Carlssone96ab552011-02-28 02:27:16 +00001556 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001557
Anders Carlssone96ab552011-02-28 02:27:16 +00001558 // Exception tables and cleanups can be enabled with -fexceptions even if the
1559 // language itself doesn't support exceptions.
1560 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1561 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001562
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001563 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1564 // is not necessarily sensible, but follows GCC.
1565 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001566 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001567 options::OPT_fno_objc_exceptions,
1568 true)) {
1569 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001570
Eric Christopher84fbdb42011-08-19 00:30:14 +00001571 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001572 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001573 }
1574
1575 if (types::isCXX(InputType)) {
1576 bool CXXExceptionsEnabled = ExceptionsEnabled;
1577
Eric Christopher84fbdb42011-08-19 00:30:14 +00001578 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1579 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001580 options::OPT_fexceptions,
1581 options::OPT_fno_exceptions)) {
1582 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1583 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001584 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001585 CXXExceptionsEnabled = false;
1586 }
1587
1588 if (CXXExceptionsEnabled) {
1589 CmdArgs.push_back("-fcxx-exceptions");
1590
1591 ShouldUseExceptionTables = true;
1592 }
1593 }
1594
1595 if (ShouldUseExceptionTables)
1596 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001597}
1598
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001599static bool ShouldDisableAutolink(const ArgList &Args,
1600 const ToolChain &TC) {
1601 bool Default = true;
1602 if (TC.getTriple().isOSDarwin()) {
1603 // The native darwin assembler doesn't support the linker_option directives,
1604 // so we disable them if we think the .s file will be passed to it.
1605 Default = TC.useIntegratedAs();
1606 }
1607 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1608 Default);
1609}
1610
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001611static bool ShouldDisableCFI(const ArgList &Args,
1612 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001613 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001614 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001615 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001616 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001617 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001618 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001619 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001620 options::OPT_fno_dwarf2_cfi_asm,
1621 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001622}
1623
Ted Kremenek62093662013-03-12 17:02:12 +00001624static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1625 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001626 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1627 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001628 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001629 return !UseDwarfDirectory;
1630}
1631
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001632/// \brief Check whether the given input tree contains any compilation actions.
1633static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001634 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001635 return true;
1636
1637 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1638 if (ContainsCompileAction(*it))
1639 return true;
1640
1641 return false;
1642}
1643
1644/// \brief Check if -relax-all should be passed to the internal assembler.
1645/// This is done by default when compiling non-assembler source with -O0.
1646static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1647 bool RelaxDefault = true;
1648
1649 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1650 RelaxDefault = A->getOption().matches(options::OPT_O0);
1651
1652 if (RelaxDefault) {
1653 RelaxDefault = false;
1654 for (ActionList::const_iterator it = C.getActions().begin(),
1655 ie = C.getActions().end(); it != ie; ++it) {
1656 if (ContainsCompileAction(*it)) {
1657 RelaxDefault = true;
1658 break;
1659 }
1660 }
1661 }
1662
1663 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1664 RelaxDefault);
1665}
1666
David Blaikie9260ed62013-07-25 21:19:01 +00001667static void CollectArgsForIntegratedAssembler(Compilation &C,
1668 const ArgList &Args,
1669 ArgStringList &CmdArgs,
1670 const Driver &D) {
1671 if (UseRelaxAll(C, Args))
1672 CmdArgs.push_back("-mrelax-all");
1673
David Peixottodfb66142013-11-14 22:52:58 +00001674 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001675 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001676 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1677 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1678 // arg after parsing the '-I' arg.
1679 bool TakeNextArg = false;
1680
David Blaikie9260ed62013-07-25 21:19:01 +00001681 // When using an integrated assembler, translate -Wa, and -Xassembler
1682 // options.
1683 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1684 options::OPT_Xassembler),
1685 ie = Args.filtered_end(); it != ie; ++it) {
1686 const Arg *A = *it;
1687 A->claim();
1688
1689 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1690 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001691 if (TakeNextArg) {
1692 CmdArgs.push_back(Value.data());
1693 TakeNextArg = false;
1694 continue;
1695 }
David Blaikie9260ed62013-07-25 21:19:01 +00001696
1697 if (Value == "-force_cpusubtype_ALL") {
1698 // Do nothing, this is the default and we don't support anything else.
1699 } else if (Value == "-L") {
1700 CmdArgs.push_back("-msave-temp-labels");
1701 } else if (Value == "--fatal-warnings") {
1702 CmdArgs.push_back("-mllvm");
1703 CmdArgs.push_back("-fatal-assembler-warnings");
1704 } else if (Value == "--noexecstack") {
1705 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00001706 } else if (Value == "-compress-debug-sections" ||
1707 Value == "--compress-debug-sections") {
David Blaikie372d9502014-01-17 03:17:40 +00001708 D.Diag(diag::warn_missing_debug_compression);
David Peixottodfb66142013-11-14 22:52:58 +00001709 } else if (Value.startswith("-I")) {
1710 CmdArgs.push_back(Value.data());
1711 // We need to consume the next argument if the current arg is a plain
1712 // -I. The next arg will be the include directory.
1713 if (Value == "-I")
1714 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001715 } else {
1716 D.Diag(diag::err_drv_unsupported_option_argument)
1717 << A->getOption().getName() << Value;
1718 }
1719 }
1720 }
1721}
1722
Chandler Carruth36381702013-06-23 11:28:48 +00001723static void addProfileRTLinux(
1724 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1725 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1726 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00001727 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00001728 Args.hasArg(options::OPT_fcreate_profile) ||
1729 Args.hasArg(options::OPT_coverage)))
1730 return;
1731
1732 // The profile runtime is located in the Linux library directory and has name
1733 // "libclang_rt.profile-<ArchName>.a".
1734 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1735 llvm::sys::path::append(
1736 LibProfile, "lib", "linux",
1737 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1738
1739 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1740}
1741
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001742static void addSanitizerRTLinkFlagsLinux(
1743 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001744 const StringRef Sanitizer, bool BeforeLibStdCXX,
1745 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001746 // Sanitizer runtime is located in the Linux library directory and
1747 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1748 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1749 llvm::sys::path::append(
1750 LibSanitizer, "lib", "linux",
1751 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001752
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001753 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1754 // etc.) so that the linker picks custom versions of the global 'operator
1755 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001756 // strategy of inserting it at the front of the link command. It also
1757 // needs to be forced to end up in the executable, so wrap it in
1758 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001759 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001760 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001761 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001762 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001763
1764 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1765 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1766
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001767 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001768 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001769 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001770 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001771
1772 // If possible, use a dynamic symbols file to export the symbols from the
1773 // runtime library. If we can't do so, use -export-dynamic instead to export
1774 // all symbols from the binary.
1775 if (ExportSymbols) {
1776 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1777 CmdArgs.push_back(
1778 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1779 else
1780 CmdArgs.push_back("-export-dynamic");
1781 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001782}
1783
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001784/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1785/// This needs to be called before we add the C run-time (malloc, etc).
1786static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001787 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001788 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001789 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1790 llvm::sys::path::append(LibAsan, "lib", "linux",
1791 (Twine("libclang_rt.asan-") +
1792 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001793 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001794 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001795 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001796 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001797 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001798}
1799
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001800/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1801/// This needs to be called before we add the C run-time (malloc, etc).
1802static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1803 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001804 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001805 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001806}
1807
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001808/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1809/// This needs to be called before we add the C run-time (malloc, etc).
1810static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1811 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001812 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001813 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001814}
1815
1816/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1817/// This needs to be called before we add the C run-time (malloc, etc).
1818static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1819 ArgStringList &CmdArgs) {
1820 if (!Args.hasArg(options::OPT_shared))
1821 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001822}
1823
Richard Smithe30752c2012-10-09 19:52:38 +00001824/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1825/// (Linux).
1826static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001827 ArgStringList &CmdArgs, bool IsCXX,
1828 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001829 // Need a copy of sanitizer_common. This could come from another sanitizer
1830 // runtime; if we're not including one, include our own copy.
1831 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001832 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1833
1834 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1835
1836 // Only include the bits of the runtime which need a C++ ABI library if
1837 // we're linking in C++ mode.
1838 if (IsCXX)
1839 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001840}
1841
Peter Collingbournec3772752013-08-07 22:47:34 +00001842static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1843 ArgStringList &CmdArgs) {
1844 if (!Args.hasArg(options::OPT_shared))
1845 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1846}
1847
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001848static bool shouldUseFramePointerForTarget(const ArgList &Args,
1849 const llvm::Triple &Triple) {
1850 switch (Triple.getArch()) {
1851 // Don't use a frame pointer on linux if optimizing for certain targets.
1852 case llvm::Triple::mips64:
1853 case llvm::Triple::mips64el:
1854 case llvm::Triple::mips:
1855 case llvm::Triple::mipsel:
1856 case llvm::Triple::systemz:
1857 case llvm::Triple::x86:
1858 case llvm::Triple::x86_64:
1859 if (Triple.isOSLinux())
1860 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1861 if (!A->getOption().matches(options::OPT_O0))
1862 return false;
1863 return true;
1864 case llvm::Triple::xcore:
1865 return false;
1866 default:
1867 return true;
1868 }
1869}
1870
Rafael Espindola224dd632011-12-14 21:02:23 +00001871static bool shouldUseFramePointer(const ArgList &Args,
1872 const llvm::Triple &Triple) {
1873 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1874 options::OPT_fomit_frame_pointer))
1875 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1876
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001877 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001878}
1879
Eric Christopherb7d97e92013-04-03 01:58:53 +00001880static bool shouldUseLeafFramePointer(const ArgList &Args,
1881 const llvm::Triple &Triple) {
1882 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1883 options::OPT_momit_leaf_frame_pointer))
1884 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1885
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001886 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001887}
1888
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001889/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001890static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001891 SmallString<128> cwd;
1892 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001893 CmdArgs.push_back("-fdebug-compilation-dir");
1894 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001895 }
1896}
1897
Eric Christopherd3804002013-02-22 20:12:52 +00001898static const char *SplitDebugName(const ArgList &Args,
1899 const InputInfoList &Inputs) {
1900 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1901 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1902 SmallString<128> T(FinalOutput->getValue());
1903 llvm::sys::path::replace_extension(T, "dwo");
1904 return Args.MakeArgString(T);
1905 } else {
1906 // Use the compilation dir.
1907 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1908 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1909 llvm::sys::path::replace_extension(F, "dwo");
1910 T += F;
1911 return Args.MakeArgString(F);
1912 }
1913}
1914
1915static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1916 const Tool &T, const JobAction &JA,
1917 const ArgList &Args, const InputInfo &Output,
1918 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001919 ArgStringList ExtractArgs;
1920 ExtractArgs.push_back("--extract-dwo");
1921
1922 ArgStringList StripArgs;
1923 StripArgs.push_back("--strip-dwo");
1924
1925 // Grabbing the output of the earlier compile step.
1926 StripArgs.push_back(Output.getFilename());
1927 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001928 ExtractArgs.push_back(OutFile);
1929
1930 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001931 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001932
1933 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001934 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001935
1936 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001937 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001938}
1939
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001940static bool isOptimizationLevelFast(const ArgList &Args) {
1941 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1942 if (A->getOption().matches(options::OPT_Ofast))
1943 return true;
1944 return false;
1945}
1946
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001947/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1948static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1949 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001950 if (A->getOption().matches(options::OPT_O4) ||
1951 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001952 return true;
1953
1954 if (A->getOption().matches(options::OPT_O0))
1955 return false;
1956
1957 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1958
Rafael Espindola91780de2013-08-26 14:05:41 +00001959 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001960 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001961 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001962 return true;
1963
1964 // Don't vectorize -Oz.
1965 if (S == "z")
1966 return false;
1967
1968 unsigned OptLevel = 0;
1969 if (S.getAsInteger(10, OptLevel))
1970 return false;
1971
1972 return OptLevel > 1;
1973 }
1974
1975 return false;
1976}
1977
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001978void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001979 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001980 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001981 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001982 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001983 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1984 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001985 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001986 ArgStringList CmdArgs;
1987
Daniel Dunbare521a892009-03-31 20:53:55 +00001988 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1989
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001990 // Invoke ourselves in -cc1 mode.
1991 //
1992 // FIXME: Implement custom jobs for internal actions.
1993 CmdArgs.push_back("-cc1");
1994
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001995 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001996 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001997 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001998 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001999
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002000 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002001 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002002
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002003 if (isa<AnalyzeJobAction>(JA)) {
2004 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2005 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002006 } else if (isa<MigrateJobAction>(JA)) {
2007 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002008 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002009 if (Output.getType() == types::TY_Dependencies)
2010 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002011 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002012 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002013 if (Args.hasArg(options::OPT_rewrite_objc) &&
2014 !Args.hasArg(options::OPT_g_Group))
2015 CmdArgs.push_back("-P");
2016 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002017 } else if (isa<AssembleJobAction>(JA)) {
2018 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002019
David Blaikie9260ed62013-07-25 21:19:01 +00002020 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002021
2022 // Also ignore explicit -force_cpusubtype_ALL option.
2023 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002024 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002025 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002026 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002027
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002028 if (JA.getType() == types::TY_Nothing)
2029 CmdArgs.push_back("-fsyntax-only");
2030 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002031 CmdArgs.push_back("-emit-pch");
2032 else
2033 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002034 } else {
2035 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002036
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002037 if (JA.getType() == types::TY_Nothing) {
2038 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002039 } else if (JA.getType() == types::TY_LLVM_IR ||
2040 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002041 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002042 } else if (JA.getType() == types::TY_LLVM_BC ||
2043 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002044 CmdArgs.push_back("-emit-llvm-bc");
2045 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002046 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002047 } else if (JA.getType() == types::TY_AST) {
2048 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002049 } else if (JA.getType() == types::TY_ModuleFile) {
2050 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002051 } else if (JA.getType() == types::TY_RewrittenObjC) {
2052 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002053 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002054 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2055 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002056 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002057 } else {
2058 assert(JA.getType() == types::TY_PP_Asm &&
2059 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002060 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002061 }
2062
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002063 // The make clang go fast button.
2064 CmdArgs.push_back("-disable-free");
2065
John McCallbb79b5f2010-02-13 03:50:24 +00002066 // Disable the verification pass in -asserts builds.
2067#ifdef NDEBUG
2068 CmdArgs.push_back("-disable-llvm-verifier");
2069#endif
2070
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002071 // Set the main file name, so that debug info works even with
2072 // -save-temps.
2073 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002074 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002075
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002076 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002077 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002078 if (Args.hasArg(options::OPT_static))
2079 CmdArgs.push_back("-static-define");
2080
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002081 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002082 // Enable region store model by default.
2083 CmdArgs.push_back("-analyzer-store=region");
2084
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002085 // Treat blocks as analysis entry points.
2086 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2087
Ted Kremenek49c79792011-03-24 00:28:47 +00002088 CmdArgs.push_back("-analyzer-eagerly-assume");
2089
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002090 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002091 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002092 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002093
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002094 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2095 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002096
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002097 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002098 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002099
2100 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002101
Jordan Rose10ad0812013-04-05 17:55:07 +00002102 if (types::isCXX(Inputs[0].getType()))
2103 CmdArgs.push_back("-analyzer-checker=cplusplus");
2104
Ted Kremenek37e96522012-01-26 02:27:38 +00002105 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002106 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2107 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2108 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2109 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2110 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2111 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002112 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002113
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002114 // Set the output format. The default is plist, for (lame) historical
2115 // reasons.
2116 CmdArgs.push_back("-analyzer-output");
2117 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002118 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002119 else
2120 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002121
Ted Kremenekfe449a22010-03-22 22:32:05 +00002122 // Disable the presentation of standard compiler warnings when
2123 // using --analyze. We only want to show static analyzer diagnostics
2124 // or frontend errors.
2125 CmdArgs.push_back("-w");
2126
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002127 // Add -Xanalyzer arguments when running as analyzer.
2128 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002129 }
2130
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002131 CheckCodeGenerationOptions(D, Args);
2132
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002133 bool PIE = getToolChain().isPIEDefault();
2134 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002135 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002136
Alexey Samsonov090301e2013-04-09 12:28:19 +00002137 // For the PIC and PIE flag options, this logic is different from the
2138 // legacy logic in very old versions of GCC, as that logic was just
2139 // a bug no one had ever fixed. This logic is both more rational and
2140 // consistent with GCC's new logic now that the bugs are fixed. The last
2141 // argument relating to either PIC or PIE wins, and no other argument is
2142 // used. If the last argument is any flavor of the '-fno-...' arguments,
2143 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2144 // at the same level.
2145 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2146 options::OPT_fpic, options::OPT_fno_pic,
2147 options::OPT_fPIE, options::OPT_fno_PIE,
2148 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002149 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2150 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002151 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002152 if (LastPICArg) {
2153 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002154 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2155 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2156 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2157 PIC = PIE || O.matches(options::OPT_fPIC) ||
2158 O.matches(options::OPT_fpic);
2159 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2160 O.matches(options::OPT_fPIC);
2161 } else {
2162 PIE = PIC = false;
2163 }
2164 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002165 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002166
Nick Lewycky609dd662013-10-11 03:33:53 +00002167 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002168 // specified while enabling PIC enabled level 1 PIC, just force it back to
2169 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2170 // informal testing).
2171 if (PIC && getToolChain().getTriple().isOSDarwin())
2172 IsPICLevelTwo |= getToolChain().isPICDefault();
2173
Chandler Carruthc0c04552012-04-08 16:40:35 +00002174 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2175 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002176 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002177 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002178 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002179 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002180 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002181 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002182
Chandler Carruth76a943b2012-11-19 03:52:03 +00002183 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2184 // This is a very special mode. It trumps the other modes, almost no one
2185 // uses it, and it isn't even valid on any OS but Darwin.
2186 if (!getToolChain().getTriple().isOSDarwin())
2187 D.Diag(diag::err_drv_unsupported_opt_for_target)
2188 << A->getSpelling() << getToolChain().getTriple().str();
2189
2190 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2191
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002192 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002193 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002194
Chandler Carruth76a943b2012-11-19 03:52:03 +00002195 // Only a forced PIC mode can cause the actual compile to have PIC defines
2196 // etc., no flags are sufficient. This behavior was selected to closely
2197 // match that of llvm-gcc and Apple GCC before that.
2198 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2199 CmdArgs.push_back("-pic-level");
2200 CmdArgs.push_back("2");
2201 }
2202 } else {
2203 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2204 // handled in Clang's IRGen by the -pie-level flag.
2205 CmdArgs.push_back("-mrelocation-model");
2206 CmdArgs.push_back(PIC ? "pic" : "static");
2207
2208 if (PIC) {
2209 CmdArgs.push_back("-pic-level");
2210 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2211 if (PIE) {
2212 CmdArgs.push_back("-pie-level");
2213 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2214 }
2215 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002216 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002217
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002218 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2219 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002220 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002221
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002222 // LLVM Code Generator Options.
2223
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002224 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2225 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002226 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002227 }
2228
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002229 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2230 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002231 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002232 D.Diag(diag::err_drv_unsupported_opt_for_target)
2233 << A->getSpelling() << getToolChain().getTriple().str();
2234 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2235 CmdArgs.push_back("-fpcc-struct-return");
2236 } else {
2237 assert(A->getOption().matches(options::OPT_freg_struct_return));
2238 CmdArgs.push_back("-freg-struct-return");
2239 }
2240 }
2241
Roman Divacky65b88cd2011-03-01 17:40:53 +00002242 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2243 CmdArgs.push_back("-mrtd");
2244
Rafael Espindola224dd632011-12-14 21:02:23 +00002245 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002246 CmdArgs.push_back("-mdisable-fp-elim");
2247 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2248 options::OPT_fno_zero_initialized_in_bss))
2249 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002250
2251 bool OFastEnabled = isOptimizationLevelFast(Args);
2252 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2253 // enabled. This alias option is being used to simplify the hasFlag logic.
2254 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2255 options::OPT_fstrict_aliasing;
2256 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002257 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002258 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002259 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2260 options::OPT_fno_struct_path_tbaa))
2261 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002262 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2263 false))
2264 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002265 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2266 options::OPT_fno_optimize_sibling_calls))
2267 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002268
Eric Christopher006208c2013-04-04 06:29:47 +00002269 // Handle segmented stacks.
2270 if (Args.hasArg(options::OPT_fsplit_stack))
2271 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002272
2273 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2274 // This alias option is being used to simplify the getLastArg logic.
2275 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2276 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002277
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002278 // Handle various floating point optimization flags, mapping them to the
2279 // appropriate LLVM code generation flags. The pattern for all of these is to
2280 // default off the codegen optimizations, and if any flag enables them and no
2281 // flag disables them after the flag enabling them, enable the codegen
2282 // optimization. This is complicated by several "umbrella" flags.
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_infinities,
2288 options::OPT_fno_honor_infinities))
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_infinities)
2292 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002293 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002294 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002295 options::OPT_ffinite_math_only,
2296 options::OPT_fno_finite_math_only,
2297 options::OPT_fhonor_nans,
2298 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002299 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2300 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002301 A->getOption().getID() != options::OPT_fhonor_nans)
2302 CmdArgs.push_back("-menable-no-nans");
2303
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002304 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2305 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002306 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002307 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002308 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002309 options::OPT_fno_math_errno)) {
2310 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2311 // However, turning *off* -ffast_math merely restores the toolchain default
2312 // (which may be false).
2313 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2314 A->getOption().getID() == options::OPT_ffast_math ||
2315 A->getOption().getID() == options::OPT_Ofast)
2316 MathErrno = false;
2317 else if (A->getOption().getID() == options::OPT_fmath_errno)
2318 MathErrno = true;
2319 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002320 if (MathErrno)
2321 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002322
2323 // There are several flags which require disabling very specific
2324 // optimizations. Any of these being disabled forces us to turn off the
2325 // entire set of LLVM optimizations, so collect them through all the flag
2326 // madness.
2327 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002328 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002329 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002330 options::OPT_funsafe_math_optimizations,
2331 options::OPT_fno_unsafe_math_optimizations,
2332 options::OPT_fassociative_math,
2333 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002334 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2335 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002336 A->getOption().getID() != options::OPT_fno_associative_math)
2337 AssociativeMath = true;
2338 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002339 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002340 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002341 options::OPT_funsafe_math_optimizations,
2342 options::OPT_fno_unsafe_math_optimizations,
2343 options::OPT_freciprocal_math,
2344 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002345 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2346 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002347 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2348 ReciprocalMath = true;
2349 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002350 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002351 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002352 options::OPT_funsafe_math_optimizations,
2353 options::OPT_fno_unsafe_math_optimizations,
2354 options::OPT_fsigned_zeros,
2355 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002356 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2357 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002358 A->getOption().getID() != options::OPT_fsigned_zeros)
2359 SignedZeros = false;
2360 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002361 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002362 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002363 options::OPT_funsafe_math_optimizations,
2364 options::OPT_fno_unsafe_math_optimizations,
2365 options::OPT_ftrapping_math,
2366 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002367 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2368 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002369 A->getOption().getID() != options::OPT_ftrapping_math)
2370 TrappingMath = false;
2371 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2372 !TrappingMath)
2373 CmdArgs.push_back("-menable-unsafe-fp-math");
2374
Lang Hamesaa53b932012-07-06 00:59:19 +00002375
2376 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002377 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002378 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002379 options::OPT_ffp_contract)) {
2380 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002381 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002382 if (Val == "fast" || Val == "on" || Val == "off") {
2383 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2384 } else {
2385 D.Diag(diag::err_drv_unsupported_option_argument)
2386 << A->getOption().getName() << Val;
2387 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002388 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2389 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002390 // If fast-math is set then set the fp-contract mode to fast.
2391 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2392 }
2393 }
2394
Bob Wilson6a039162012-07-19 03:52:53 +00002395 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2396 // and if we find them, tell the frontend to provide the appropriate
2397 // preprocessor macros. This is distinct from enabling any optimizations as
2398 // these options induce language changes which must survive serialization
2399 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002400 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2401 options::OPT_fno_fast_math))
2402 if (!A->getOption().matches(options::OPT_fno_fast_math))
2403 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002404 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2405 if (A->getOption().matches(options::OPT_ffinite_math_only))
2406 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002407
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002408 // Decide whether to use verbose asm. Verbose assembly is the default on
2409 // toolchains which have the integrated assembler on by default.
2410 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2411 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002412 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002413 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002414 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002415
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002416 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2417 CmdArgs.push_back("-mdebug-pass");
2418 CmdArgs.push_back("Structure");
2419 }
2420 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2421 CmdArgs.push_back("-mdebug-pass");
2422 CmdArgs.push_back("Arguments");
2423 }
2424
John McCall8517abc2010-02-19 02:45:38 +00002425 // Enable -mconstructor-aliases except on darwin, where we have to
2426 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002427 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002428 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002429
John McCall7ef5cb32011-03-18 02:56:14 +00002430 // Darwin's kernel doesn't support guard variables; just die if we
2431 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002432 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002433 CmdArgs.push_back("-fforbid-guard-variables");
2434
Douglas Gregordbe39272011-02-01 15:15:22 +00002435 if (Args.hasArg(options::OPT_mms_bitfields)) {
2436 CmdArgs.push_back("-mms-bitfields");
2437 }
John McCall8517abc2010-02-19 02:45:38 +00002438
Daniel Dunbar306945d2009-09-16 06:17:29 +00002439 // This is a coarse approximation of what llvm-gcc actually does, both
2440 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2441 // complicated ways.
2442 bool AsynchronousUnwindTables =
2443 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2444 options::OPT_fno_asynchronous_unwind_tables,
2445 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002446 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002447 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2448 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002449 CmdArgs.push_back("-munwind-tables");
2450
Chandler Carruth05fb5852012-11-21 23:40:23 +00002451 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002452
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002453 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2454 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002455 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002456 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002457
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002458 // FIXME: Handle -mtune=.
2459 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002460
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002461 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002462 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002463 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002464 }
2465
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002466 // Add the target cpu
2467 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2468 llvm::Triple ETriple(ETripleStr);
2469 std::string CPU = getCPUName(Args, ETriple);
2470 if (!CPU.empty()) {
2471 CmdArgs.push_back("-target-cpu");
2472 CmdArgs.push_back(Args.MakeArgString(CPU));
2473 }
2474
Rafael Espindolaeb265472013-08-21 21:59:03 +00002475 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2476 CmdArgs.push_back("-mfpmath");
2477 CmdArgs.push_back(A->getValue());
2478 }
2479
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002480 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002481 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002482
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002483 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002484 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002485 default:
2486 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002487
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002488 case llvm::Triple::arm:
2489 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002490 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002491 break;
2492
Eric Christopher0b26a612010-03-02 02:41:08 +00002493 case llvm::Triple::mips:
2494 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002495 case llvm::Triple::mips64:
2496 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002497 AddMIPSTargetArgs(Args, CmdArgs);
2498 break;
2499
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002500 case llvm::Triple::sparc:
2501 AddSparcTargetArgs(Args, CmdArgs);
2502 break;
2503
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002504 case llvm::Triple::x86:
2505 case llvm::Triple::x86_64:
2506 AddX86TargetArgs(Args, CmdArgs);
2507 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002508
2509 case llvm::Triple::hexagon:
2510 AddHexagonTargetArgs(Args, CmdArgs);
2511 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002512 }
2513
Hans Wennborg75958c42013-08-08 00:17:41 +00002514 // Add clang-cl arguments.
2515 if (getToolChain().getDriver().IsCLMode())
2516 AddClangCLArgs(Args, CmdArgs);
2517
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002518 // Pass the linker version in use.
2519 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2520 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002521 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002522 }
2523
Eric Christopherb7d97e92013-04-03 01:58:53 +00002524 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002525 CmdArgs.push_back("-momit-leaf-frame-pointer");
2526
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002527 // Explicitly error on some things we know we don't support and can't just
2528 // ignore.
2529 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002530 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2531 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002532 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002533 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002534 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002535 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2536 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002537 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002538 << Unsupported->getOption().getName();
2539 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002540 }
2541
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002542 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002543 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002544 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002545 CmdArgs.push_back("-header-include-file");
2546 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2547 D.CCPrintHeadersFilename : "-");
2548 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002549 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002550 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002551
Chad Rosierbe10f982011-08-02 17:58:04 +00002552 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002553 CmdArgs.push_back("-diagnostic-log-file");
2554 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2555 D.CCLogDiagnosticsFilename : "-");
2556 }
2557
Manman Ren17bdb0f2013-11-20 20:22:14 +00002558 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2559 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002560 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002561 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002562 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2563 // FIXME: we should support specifying dwarf version with
2564 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002565 CmdArgs.push_back("-gline-tables-only");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002566 // Default is dwarf-2 for darwin.
Tim Northover157d9112014-01-16 08:48:16 +00002567 if (getToolChain().getTriple().isOSBinFormatMachO())
Manman Ren17bdb0f2013-11-20 20:22:14 +00002568 CmdArgs.push_back("-gdwarf-2");
2569 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002570 CmdArgs.push_back("-gdwarf-2");
2571 else if (A->getOption().matches(options::OPT_gdwarf_3))
2572 CmdArgs.push_back("-gdwarf-3");
2573 else if (A->getOption().matches(options::OPT_gdwarf_4))
2574 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002575 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002576 !A->getOption().matches(options::OPT_ggdb0)) {
2577 // Default is dwarf-2 for darwin.
Tim Northover157d9112014-01-16 08:48:16 +00002578 if (getToolChain().getTriple().isOSBinFormatMachO())
Manman Ren38db0922013-07-02 23:15:25 +00002579 CmdArgs.push_back("-gdwarf-2");
2580 else
2581 CmdArgs.push_back("-g");
2582 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002583 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002584
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002585 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2586 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002587 if (Args.hasArg(options::OPT_gcolumn_info))
2588 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002589
Eric Christopher138c32b2013-09-13 22:37:55 +00002590 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002591 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2592 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002593 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002594 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002595 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002596 CmdArgs.push_back("-g");
2597 CmdArgs.push_back("-backend-option");
2598 CmdArgs.push_back("-split-dwarf=Enable");
2599 }
2600
Eric Christopher138c32b2013-09-13 22:37:55 +00002601 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2602 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2603 CmdArgs.push_back("-backend-option");
2604 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2605 }
Eric Christophereec89c22013-06-18 00:03:50 +00002606
David Blaikied74be702014-01-18 02:02:06 +00002607 if (Args.hasArg(options::OPT_fdebug_types_section)) {
2608 CmdArgs.push_back("-backend-option");
2609 CmdArgs.push_back("-generate-type-units");
2610 }
Eric Christophereec89c22013-06-18 00:03:50 +00002611
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002612 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2613 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2614
Chris Lattner3c77a352010-06-22 00:03:40 +00002615 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2616
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002617 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2618 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2619 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2620 D.Diag(diag::err_drv_argument_not_allowed_with)
2621 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2622
2623 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2624
2625 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2626 A->render(Args, CmdArgs);
2627 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2628 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2629
Nick Lewycky207bce32011-04-21 23:44:07 +00002630 if (Args.hasArg(options::OPT_ftest_coverage) ||
2631 Args.hasArg(options::OPT_coverage))
2632 CmdArgs.push_back("-femit-coverage-notes");
2633 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2634 Args.hasArg(options::OPT_coverage))
2635 CmdArgs.push_back("-femit-coverage-data");
2636
Nick Lewycky480cb992011-05-04 20:46:58 +00002637 if (C.getArgs().hasArg(options::OPT_c) ||
2638 C.getArgs().hasArg(options::OPT_S)) {
2639 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002640 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002641 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002642 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002643 SmallString<128> Pwd;
2644 if (!llvm::sys::fs::current_path(Pwd)) {
2645 llvm::sys::path::append(Pwd, CoverageFilename.str());
2646 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002647 }
2648 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002649 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002650 }
2651 }
2652
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002653 // Pass options for controlling the default header search paths.
2654 if (Args.hasArg(options::OPT_nostdinc)) {
2655 CmdArgs.push_back("-nostdsysteminc");
2656 CmdArgs.push_back("-nobuiltininc");
2657 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002658 if (Args.hasArg(options::OPT_nostdlibinc))
2659 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002660 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2661 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2662 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002663
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002664 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002665 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002666 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002667
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002668 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2669
Ted Kremenekf7639e12012-03-06 20:06:33 +00002670 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002671 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002672 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002673 options::OPT_ccc_arcmt_modify,
2674 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002675 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002676 switch (A->getOption().getID()) {
2677 default:
2678 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002679 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002680 CmdArgs.push_back("-arcmt-check");
2681 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002682 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002683 CmdArgs.push_back("-arcmt-modify");
2684 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002685 case options::OPT_ccc_arcmt_migrate:
2686 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002687 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002688 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002689
2690 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2691 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002692 break;
John McCalld70fb982011-06-15 23:25:17 +00002693 }
2694 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002695 } else {
2696 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2697 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2698 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002699 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002700
Ted Kremenekf7639e12012-03-06 20:06:33 +00002701 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2702 if (ARCMTEnabled) {
2703 D.Diag(diag::err_drv_argument_not_allowed_with)
2704 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2705 }
2706 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002707 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002708
2709 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002710 options::OPT_objcmt_migrate_subscripting,
2711 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002712 // None specified, means enable them all.
2713 CmdArgs.push_back("-objcmt-migrate-literals");
2714 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002715 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002716 } else {
2717 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2718 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002719 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002720 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002721 } else {
2722 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2723 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2724 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2725 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2726 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2727 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2728 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2729 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2730 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2731 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2732 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2733 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2734 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002735 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002736 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002737 }
2738
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002739 // Add preprocessing options like -I, -D, etc. if we are using the
2740 // preprocessor.
2741 //
2742 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002743 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002744 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002745
Rafael Espindolaa7431922011-07-21 23:40:37 +00002746 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2747 // that "The compiler can only warn and ignore the option if not recognized".
2748 // When building with ccache, it will pass -D options to clang even on
2749 // preprocessed inputs and configure concludes that -fPIC is not supported.
2750 Args.ClaimAllArgs(options::OPT_D);
2751
Alp Toker7874bdc2013-11-15 20:40:58 +00002752 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002753 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2754 if (A->getOption().matches(options::OPT_O4)) {
2755 CmdArgs.push_back("-O3");
2756 D.Diag(diag::warn_O4_is_O3);
2757 } else {
2758 A->render(Args, CmdArgs);
2759 }
2760 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002761
Chad Rosier86b82082012-12-12 20:06:31 +00002762 // Don't warn about unused -flto. This can happen when we're preprocessing or
2763 // precompiling.
2764 Args.ClaimAllArgs(options::OPT_flto);
2765
Daniel Dunbar945577c2009-10-29 02:24:45 +00002766 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002767 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2768 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002769 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002770 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002771
2772 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002773 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002774 //
2775 // If a std is supplied, only add -trigraphs if it follows the
2776 // option.
2777 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2778 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002779 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002780 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002781 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002782 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002783 else
2784 Std->render(Args, CmdArgs);
2785
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002786 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2787 options::OPT_trigraphs))
2788 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002789 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002790 } else {
2791 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002792 //
2793 // FIXME: Clang doesn't correctly handle -std= when the input language
2794 // doesn't match. For the time being just ignore this for C++ inputs;
2795 // eventually we want to do all the standard defaulting here instead of
2796 // splitting it between the driver and clang -cc1.
2797 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002798 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2799 "-std=", /*Joined=*/true);
2800 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2801 CmdArgs.push_back("-std=c++11");
2802
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002803 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002804 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002805
Richard Smith282b4492013-09-04 22:50:31 +00002806 // GCC's behavior for -Wwrite-strings is a bit strange:
2807 // * In C, this "warning flag" changes the types of string literals from
2808 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2809 // for the discarded qualifier.
2810 // * In C++, this is just a normal warning flag.
2811 //
2812 // Implementing this warning correctly in C is hard, so we follow GCC's
2813 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2814 // a non-const char* in C, rather than using this crude hack.
2815 if (!types::isCXX(InputType)) {
Rafael Espindola0df9e162013-11-05 21:43:54 +00002816 DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel(
2817 diag::warn_deprecated_string_literal_conversion_c, SourceLocation());
2818 if (DiagLevel > DiagnosticsEngine::Ignored)
Richard Smith282b4492013-09-04 22:50:31 +00002819 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002820 }
2821
Chandler Carruth61fbf622011-04-23 09:27:53 +00002822 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002823 // during C++ compilation, which it is by default. GCC keeps this define even
2824 // in the presence of '-w', match this behavior bug-for-bug.
2825 if (types::isCXX(InputType) &&
2826 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2827 true)) {
2828 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002829 }
2830
Chandler Carruthe0391482010-05-22 02:21:53 +00002831 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2832 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2833 if (Asm->getOption().matches(options::OPT_fasm))
2834 CmdArgs.push_back("-fgnu-keywords");
2835 else
2836 CmdArgs.push_back("-fno-gnu-keywords");
2837 }
2838
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002839 if (ShouldDisableCFI(Args, getToolChain()))
2840 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002841
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002842 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2843 CmdArgs.push_back("-fno-dwarf-directory-asm");
2844
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002845 if (ShouldDisableAutolink(Args, getToolChain()))
2846 CmdArgs.push_back("-fno-autolink");
2847
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002848 // Add in -fdebug-compilation-dir if necessary.
2849 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002850
Richard Smith9a568822011-11-21 19:36:32 +00002851 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2852 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002853 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002854 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002855 }
2856
Richard Smith79c927b2013-11-06 19:31:51 +00002857 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2858 CmdArgs.push_back("-foperator-arrow-depth");
2859 CmdArgs.push_back(A->getValue());
2860 }
2861
Richard Smith9a568822011-11-21 19:36:32 +00002862 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2863 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002864 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002865 }
2866
Richard Smitha3d3bd22013-05-08 02:12:03 +00002867 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2868 CmdArgs.push_back("-fconstexpr-steps");
2869 CmdArgs.push_back(A->getValue());
2870 }
2871
Richard Smithb3a14522013-02-22 01:59:51 +00002872 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2873 CmdArgs.push_back("-fbracket-depth");
2874 CmdArgs.push_back(A->getValue());
2875 }
2876
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002877 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2878 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002879 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002880 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002881 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2882 } else
2883 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002884 }
2885
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002886
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002887 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002888 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002889
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002890 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2891 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002892 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002893 }
David Chisnall5778fce2009-08-31 16:41:57 +00002894
Chris Lattnere23003d2010-01-09 21:54:33 +00002895 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2896 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002897 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002898 }
2899
Chris Lattnerb35583d2010-04-07 20:49:23 +00002900 CmdArgs.push_back("-ferror-limit");
2901 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002902 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002903 else
2904 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002905
Chandler Carrutha77a7272010-05-06 04:55:18 +00002906 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2907 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002908 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002909 }
2910
2911 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2912 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002913 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002914 }
2915
Richard Smithf6f003a2011-12-16 19:06:07 +00002916 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2917 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002918 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002919 }
2920
Daniel Dunbar2c978472009-11-04 06:24:47 +00002921 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002922 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002923 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002924 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002925 } else {
2926 // If -fmessage-length=N was not specified, determine whether this is a
2927 // terminal and, if so, implicitly define -fmessage-length appropriately.
2928 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002929 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002930 }
2931
John McCallb4a99d32013-02-19 01:57:35 +00002932 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2933 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2934 options::OPT_fvisibility_ms_compat)) {
2935 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2936 CmdArgs.push_back("-fvisibility");
2937 CmdArgs.push_back(A->getValue());
2938 } else {
2939 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2940 CmdArgs.push_back("-fvisibility");
2941 CmdArgs.push_back("hidden");
2942 CmdArgs.push_back("-ftype-visibility");
2943 CmdArgs.push_back("default");
2944 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002945 }
2946
Douglas Gregor08329632010-06-15 17:05:35 +00002947 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002948
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002949 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2950
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002951 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002952 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2953 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002954 CmdArgs.push_back("-ffreestanding");
2955
Daniel Dunbare357d562009-12-03 18:42:11 +00002956 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002957 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002958 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00002959 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
2960 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00002961 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002962 // AltiVec language extensions aren't relevant for assembling.
2963 if (!isa<PreprocessJobAction>(JA) ||
2964 Output.getType() != types::TY_PP_Asm)
2965 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002966 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2967 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002968
Peter Collingbourne32701642013-11-01 18:16:25 +00002969 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
2970 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002971
Will Dietz3676d562012-12-30 20:53:28 +00002972 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2973 options::OPT_fno_sanitize_recover,
2974 true))
2975 CmdArgs.push_back("-fno-sanitize-recover");
2976
Chad Rosierae229d52013-01-29 23:31:22 +00002977 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2978 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2979 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2980 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2981
Eric Christopher459d2712013-02-19 06:16:53 +00002982 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002983 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002984 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002985 getToolChain().getArch() == llvm::Triple::ppc64 ||
2986 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002987 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002988 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002989
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002990 if (getToolChain().SupportsProfiling())
2991 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002992
2993 // -flax-vector-conversions is default.
2994 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2995 options::OPT_fno_lax_vector_conversions))
2996 CmdArgs.push_back("-fno-lax-vector-conversions");
2997
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002998 if (Args.getLastArg(options::OPT_fapple_kext))
2999 CmdArgs.push_back("-fapple-kext");
3000
David Blaikie690f21e2012-06-14 18:55:27 +00003001 if (Args.hasFlag(options::OPT_frewrite_includes,
3002 options::OPT_fno_rewrite_includes, false))
3003 CmdArgs.push_back("-frewrite-includes");
3004
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003005 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003006 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003007 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003008 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3009 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003010
3011 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3012 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003013 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003014 }
3015
Bob Wilson14adb362012-02-03 06:27:22 +00003016 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003017
Chandler Carruth6e501032011-03-27 00:04:55 +00003018 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3019 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3020 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3021 options::OPT_fno_wrapv)) {
3022 if (A->getOption().matches(options::OPT_fwrapv))
3023 CmdArgs.push_back("-fwrapv");
3024 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3025 options::OPT_fno_strict_overflow)) {
3026 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3027 CmdArgs.push_back("-fwrapv");
3028 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003029
3030 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3031 options::OPT_fno_reroll_loops))
3032 if (A->getOption().matches(options::OPT_freroll_loops))
3033 CmdArgs.push_back("-freroll-loops");
3034
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003035 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003036 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3037 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003038
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003039 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3040
Mahesha S6a682be42012-10-27 07:47:56 +00003041
Daniel Dunbar4930e332009-11-17 08:07:36 +00003042 // -stack-protector=0 is default.
3043 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003044 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3045 options::OPT_fstack_protector_all,
3046 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003047 if (A->getOption().matches(options::OPT_fstack_protector))
3048 StackProtectorLevel = 1;
3049 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3050 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00003051 } else {
3052 StackProtectorLevel =
3053 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3054 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003055 if (StackProtectorLevel) {
3056 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003057 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003058 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003059
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003060 // --param ssp-buffer-size=
3061 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3062 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003063 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003064 if (Str.startswith("ssp-buffer-size=")) {
3065 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003066 CmdArgs.push_back("-stack-protector-buffer-size");
3067 // FIXME: Verify the argument is a valid integer.
3068 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003069 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003070 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003071 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003072 }
3073
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003074 // Translate -mstackrealign
3075 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3076 false)) {
3077 CmdArgs.push_back("-backend-option");
3078 CmdArgs.push_back("-force-align-stack");
3079 }
3080 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3081 false)) {
3082 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3083 }
3084
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003085 if (Args.hasArg(options::OPT_mstack_alignment)) {
3086 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3087 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003088 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003089 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003090 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003091 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3092 options::OPT_munaligned_access)) {
3093 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3094 CmdArgs.push_back("-backend-option");
3095 CmdArgs.push_back("-arm-strict-align");
3096 } else {
3097 CmdArgs.push_back("-backend-option");
3098 CmdArgs.push_back("-arm-no-strict-align");
3099 }
Renato Golina146a482013-08-24 14:44:41 +00003100 }
Chad Rosier60027022012-11-09 17:29:19 +00003101 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003102
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003103 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3104 options::OPT_mno_restrict_it)) {
3105 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3106 CmdArgs.push_back("-backend-option");
3107 CmdArgs.push_back("-arm-restrict-it");
3108 } else {
3109 CmdArgs.push_back("-backend-option");
3110 CmdArgs.push_back("-arm-no-restrict-it");
3111 }
3112 }
3113
Daniel Dunbard18049a2009-04-07 21:16:11 +00003114 // Forward -f options with positive and negative forms; we translate
3115 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003116 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3117 StringRef fname = A->getValue();
3118 if (!llvm::sys::fs::exists(fname))
3119 D.Diag(diag::err_drv_no_such_file) << fname;
3120 else
3121 A->render(Args, CmdArgs);
3122 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003123
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003124 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003125 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003126 CmdArgs.push_back("-fapple-kext");
3127 if (!Args.hasArg(options::OPT_fbuiltin))
3128 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003129 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003130 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003131 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003132 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003133 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003134
Nuno Lopes13c88c72009-12-16 16:59:22 +00003135 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3136 options::OPT_fno_assume_sane_operator_new))
3137 CmdArgs.push_back("-fno-assume-sane-operator-new");
3138
Daniel Dunbar4930e332009-11-17 08:07:36 +00003139 // -fblocks=0 is default.
3140 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003141 getToolChain().IsBlocksDefault()) ||
3142 (Args.hasArg(options::OPT_fgnu_runtime) &&
3143 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3144 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003145 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003146
3147 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3148 !getToolChain().hasBlocksRuntime())
3149 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003150 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003151
Douglas Gregor226173a2012-01-18 15:19:58 +00003152 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3153 // users must also pass -fcxx-modules. The latter flag will disappear once the
3154 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003155 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003156 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3157 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3158 options::OPT_fno_cxx_modules,
3159 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003160 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003161 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003162 HaveModules = true;
3163 }
3164 }
3165
Daniel Jasper07e6c402013-08-05 20:26:17 +00003166 // -fmodule-maps enables module map processing (off by default) for header
3167 // checking. It is implied by -fmodules.
3168 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3169 false)) {
3170 CmdArgs.push_back("-fmodule-maps");
3171 }
3172
Daniel Jasperac42b752013-10-21 06:34:34 +00003173 // -fmodules-decluse checks that modules used are declared so (off by
3174 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003175 if (Args.hasFlag(options::OPT_fmodules_decluse,
3176 options::OPT_fno_modules_decluse,
3177 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003178 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003179 }
3180
Daniel Jasperac42b752013-10-21 06:34:34 +00003181 // -fmodule-name specifies the module that is currently being built (or
3182 // used for header checking by -fmodule-maps).
3183 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3184 A->claim();
3185 A->render(Args, CmdArgs);
3186 }
3187
3188 // -fmodule-map-file can be used to specify a file containing module
3189 // definitions.
3190 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3191 A->claim();
3192 A->render(Args, CmdArgs);
3193 }
3194
Douglas Gregor35b04d62013-02-07 19:01:24 +00003195 // If a module path was provided, pass it along. Otherwise, use a temporary
3196 // directory.
3197 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3198 A->claim();
3199 if (HaveModules) {
3200 A->render(Args, CmdArgs);
3201 }
3202 } else if (HaveModules) {
3203 SmallString<128> DefaultModuleCache;
3204 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3205 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003206 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3207 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003208 const char Arg[] = "-fmodules-cache-path=";
3209 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3210 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003211 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3212 }
3213
3214 // Pass through all -fmodules-ignore-macro arguments.
3215 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003216 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3217 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003218
John McCalldfea9982010-04-09 19:12:06 +00003219 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003220 if (Args.hasFlag(options::OPT_fno_access_control,
3221 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003222 false))
John McCall3155f572010-04-09 19:03:51 +00003223 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003224
Anders Carlssond470fef2010-11-21 00:09:52 +00003225 // -felide-constructors is the default.
3226 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3227 options::OPT_felide_constructors,
3228 false))
3229 CmdArgs.push_back("-fno-elide-constructors");
3230
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003231 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003232 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003233 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003234 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003235
Richard Smith52be6192012-11-05 22:04:41 +00003236 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003237 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003238 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003239 Args.getLastArg(options::OPT_mkernel,
3240 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003241 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003242 D.Diag(diag::err_drv_argument_not_allowed_with)
3243 << "-fsanitize=vptr" << NoRttiArg;
3244 }
3245 }
3246
Tony Linthicum76329bf2011-12-12 21:14:55 +00003247 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003248 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003249 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003250 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003251 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003252 CmdArgs.push_back("-fshort-enums");
3253
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003254 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003255 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003256 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003257 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003258
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003259 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003260 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003261 options::OPT_fno_threadsafe_statics))
3262 CmdArgs.push_back("-fno-threadsafe-statics");
3263
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003264 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003265 if (!Args.hasFlag(
3266 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3267 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3268 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Robert Lytton6b1deb42013-11-12 10:09:22 +00003269 getToolChain().getArch() != llvm::Triple::hexagon &&
3270 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003271 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003272 CmdArgs.push_back("-fno-use-cxa-atexit");
3273
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003274 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003275 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003276 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3277 CmdArgs.push_back("-fms-extensions");
3278
Francois Pichet1b4f1632011-09-17 04:32:15 +00003279 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003280 if (Args.hasFlag(options::OPT_fms_compatibility,
3281 options::OPT_fno_ms_compatibility,
3282 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3283 Args.hasFlag(options::OPT_fms_extensions,
3284 options::OPT_fno_ms_extensions,
3285 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003286 CmdArgs.push_back("-fms-compatibility");
3287
Reid Klecknerc106fda2013-09-18 00:33:59 +00003288 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003289 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3290 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3291 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003292 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003293 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003294 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003295 else
3296 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3297 }
3298
3299
Eric Christopher5ecce122013-02-18 00:38:31 +00003300 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003301 if (Args.hasFlag(options::OPT_fborland_extensions,
3302 options::OPT_fno_borland_extensions, false))
3303 CmdArgs.push_back("-fborland-extensions");
3304
Francois Pichet02744872011-09-01 16:38:08 +00003305 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3306 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003307 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3308 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003309 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003310 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003311
Chandler Carruthe03aa552010-04-17 20:17:31 +00003312 // -fgnu-keywords default varies depending on language; only pass if
3313 // specified.
3314 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003315 options::OPT_fno_gnu_keywords))
3316 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003317
Rafael Espindola922a6242011-06-02 17:30:53 +00003318 if (Args.hasFlag(options::OPT_fgnu89_inline,
3319 options::OPT_fno_gnu89_inline,
3320 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003321 CmdArgs.push_back("-fgnu89-inline");
3322
Chad Rosier9c76d242012-03-15 22:31:42 +00003323 if (Args.hasArg(options::OPT_fno_inline))
3324 CmdArgs.push_back("-fno-inline");
3325
Chad Rosier64d6be92012-03-06 21:17:19 +00003326 if (Args.hasArg(options::OPT_fno_inline_functions))
3327 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003328
John McCall5fb5df92012-06-20 06:18:46 +00003329 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003330
John McCall5fb5df92012-06-20 06:18:46 +00003331 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003332 // legacy is the default. Except for deployment taget of 10.5,
3333 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3334 // gets ignored silently.
3335 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003336 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3337 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003338 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003339 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003340 if (getToolChain().UseObjCMixedDispatch())
3341 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3342 else
3343 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3344 }
3345 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003346
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003347 // When ObjectiveC legacy runtime is in effect on MacOSX,
3348 // turn on the option to do Array/Dictionary subscripting
3349 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003350 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3351 getToolChain().getTriple().isMacOSX() &&
3352 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3353 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003354 objcRuntime.isNeXTFamily())
3355 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3356
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003357 // -fencode-extended-block-signature=1 is default.
3358 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3359 CmdArgs.push_back("-fencode-extended-block-signature");
3360 }
3361
John McCall24fc0de2011-07-06 00:26:06 +00003362 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3363 // NOTE: This logic is duplicated in ToolChains.cpp.
3364 bool ARC = isObjCAutoRefCount(Args);
3365 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003366 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003367
John McCall24fc0de2011-07-06 00:26:06 +00003368 CmdArgs.push_back("-fobjc-arc");
3369
Chandler Carruth491db322011-11-04 07:34:47 +00003370 // FIXME: It seems like this entire block, and several around it should be
3371 // wrapped in isObjC, but for now we just use it here as this is where it
3372 // was being used previously.
3373 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3374 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3375 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3376 else
3377 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3378 }
3379
John McCall24fc0de2011-07-06 00:26:06 +00003380 // Allow the user to enable full exceptions code emission.
3381 // We define off for Objective-CC, on for Objective-C++.
3382 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3383 options::OPT_fno_objc_arc_exceptions,
3384 /*default*/ types::isCXX(InputType)))
3385 CmdArgs.push_back("-fobjc-arc-exceptions");
3386 }
3387
3388 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3389 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003390 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003391 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003392
John McCall24fc0de2011-07-06 00:26:06 +00003393 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3394 // takes precedence.
3395 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3396 if (!GCArg)
3397 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3398 if (GCArg) {
3399 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003400 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003401 << GCArg->getAsString(Args);
3402 } else if (getToolChain().SupportsObjCGC()) {
3403 GCArg->render(Args, CmdArgs);
3404 } else {
3405 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003406 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003407 << GCArg->getAsString(Args);
3408 }
3409 }
3410
John McCallb5f652e2011-06-22 00:53:57 +00003411 // Add exception args.
3412 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003413 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003414
3415 if (getToolChain().UseSjLjExceptions())
3416 CmdArgs.push_back("-fsjlj-exceptions");
3417
3418 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003419 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3420 options::OPT_fno_assume_sane_operator_new))
3421 CmdArgs.push_back("-fno-assume-sane-operator-new");
3422
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003423 // -fconstant-cfstrings is default, and may be subject to argument translation
3424 // on Darwin.
3425 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3426 options::OPT_fno_constant_cfstrings) ||
3427 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3428 options::OPT_mno_constant_cfstrings))
3429 CmdArgs.push_back("-fno-constant-cfstrings");
3430
John Thompsoned4e2952009-11-05 20:14:16 +00003431 // -fshort-wchar default varies depending on platform; only
3432 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003433 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3434 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003435
Hans Wennborg28c96312013-07-31 23:39:13 +00003436 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003437 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003438 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003439 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003440 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003441
Daniel Dunbar096ed292011-10-05 21:04:55 +00003442 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3443 // -fno-pack-struct doesn't apply to -fpack-struct=.
3444 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003445 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003446 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003447 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003448 } else if (Args.hasFlag(options::OPT_fpack_struct,
3449 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003450 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003451 }
3452
Robert Lytton0e076492013-08-13 09:43:10 +00003453 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003454 if (!Args.hasArg(options::OPT_fcommon))
3455 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003456 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003457 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003458
Daniel Dunbard18049a2009-04-07 21:16:11 +00003459 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003460 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003461 CmdArgs.push_back("-fno-common");
3462
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003463 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003464 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003465 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003466 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003467 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003468 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3469
Daniel Dunbar6358d682010-10-15 22:30:42 +00003470 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3471 if (!Args.hasFlag(options::OPT_ffor_scope,
3472 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003473 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003474 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3475
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003476 // -fcaret-diagnostics is default.
3477 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3478 options::OPT_fno_caret_diagnostics, true))
3479 CmdArgs.push_back("-fno-caret-diagnostics");
3480
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003481 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003482 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003483 options::OPT_fno_diagnostics_fixit_info))
3484 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003485
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003486 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003487 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003488 options::OPT_fno_diagnostics_show_option))
3489 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003490
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003491 if (const Arg *A =
3492 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3493 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003494 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003495 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003496
Douglas Gregor643c9222011-05-21 17:07:29 +00003497 if (const Arg *A =
3498 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3499 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003500 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003501 }
3502
Chandler Carruthb6766f02011-03-27 01:50:55 +00003503 if (Arg *A = Args.getLastArg(
3504 options::OPT_fdiagnostics_show_note_include_stack,
3505 options::OPT_fno_diagnostics_show_note_include_stack)) {
3506 if (A->getOption().matches(
3507 options::OPT_fdiagnostics_show_note_include_stack))
3508 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3509 else
3510 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3511 }
3512
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003513 // Color diagnostics are the default, unless the terminal doesn't support
3514 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003515 // Support both clang's -f[no-]color-diagnostics and gcc's
3516 // -f[no-]diagnostics-colors[=never|always|auto].
3517 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3518 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3519 it != ie; ++it) {
3520 const Option &O = (*it)->getOption();
3521 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3522 !O.matches(options::OPT_fdiagnostics_color) &&
3523 !O.matches(options::OPT_fno_color_diagnostics) &&
3524 !O.matches(options::OPT_fno_diagnostics_color) &&
3525 !O.matches(options::OPT_fdiagnostics_color_EQ))
3526 continue;
3527
3528 (*it)->claim();
3529 if (O.matches(options::OPT_fcolor_diagnostics) ||
3530 O.matches(options::OPT_fdiagnostics_color)) {
3531 ShowColors = Colors_On;
3532 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3533 O.matches(options::OPT_fno_diagnostics_color)) {
3534 ShowColors = Colors_Off;
3535 } else {
3536 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3537 StringRef value((*it)->getValue());
3538 if (value == "always")
3539 ShowColors = Colors_On;
3540 else if (value == "never")
3541 ShowColors = Colors_Off;
3542 else if (value == "auto")
3543 ShowColors = Colors_Auto;
3544 else
3545 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3546 << ("-fdiagnostics-color=" + value).str();
3547 }
3548 }
3549 if (ShowColors == Colors_On ||
3550 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003551 CmdArgs.push_back("-fcolor-diagnostics");
3552
Nico Rieck7857d462013-09-11 00:38:02 +00003553 if (Args.hasArg(options::OPT_fansi_escape_codes))
3554 CmdArgs.push_back("-fansi-escape-codes");
3555
Daniel Dunbardb097022009-06-08 21:13:54 +00003556 if (!Args.hasFlag(options::OPT_fshow_source_location,
3557 options::OPT_fno_show_source_location))
3558 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003559
Douglas Gregor643c9222011-05-21 17:07:29 +00003560 if (!Args.hasFlag(options::OPT_fshow_column,
3561 options::OPT_fno_show_column,
3562 true))
3563 CmdArgs.push_back("-fno-show-column");
3564
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003565 if (!Args.hasFlag(options::OPT_fspell_checking,
3566 options::OPT_fno_spell_checking))
3567 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003568
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003569
Chad Rosierc8e56e82012-12-05 21:08:21 +00003570 // -fno-asm-blocks is default.
3571 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3572 false))
3573 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003574
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003575 // Enable vectorization per default according to the optimization level
3576 // selected. For optimization levels that want vectorization we use the alias
3577 // option to simplify the hasFlag logic.
3578 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3579 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003580 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003581 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003582 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003583 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003584
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003585 // -fslp-vectorize is default.
3586 if (Args.hasFlag(options::OPT_fslp_vectorize,
3587 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003588 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003589
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003590 // -fno-slp-vectorize-aggressive is default.
3591 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003592 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003593 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003594
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003595 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3596 A->render(Args, CmdArgs);
3597
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003598 // -fdollars-in-identifiers default varies depending on platform and
3599 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003600 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003601 options::OPT_fno_dollars_in_identifiers)) {
3602 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003603 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003604 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003605 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003606 }
3607
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003608 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3609 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003610 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003611 options::OPT_fno_unit_at_a_time)) {
3612 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003613 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003614 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003615
Eli Friedman055c9702011-11-02 01:53:16 +00003616 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3617 options::OPT_fno_apple_pragma_pack, false))
3618 CmdArgs.push_back("-fapple-pragma-pack");
3619
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003620 // le32-specific flags:
3621 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3622 // by default.
3623 if (getToolChain().getArch() == llvm::Triple::le32) {
3624 CmdArgs.push_back("-fno-math-builtin");
3625 }
3626
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003627 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003628 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003629 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003630#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003631 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003632 (getToolChain().getArch() == llvm::Triple::arm ||
3633 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003634 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3635 CmdArgs.push_back("-fno-builtin-strcat");
3636 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3637 CmdArgs.push_back("-fno-builtin-strcpy");
3638 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003639#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003640
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003641 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003642 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003643 options::OPT_traditional_cpp)) {
3644 if (isa<PreprocessJobAction>(JA))
3645 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003646 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003648 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003649
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003650 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003651 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003652
3653 // Handle serialized diagnostics.
3654 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3655 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003656 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003657 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003658
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003659 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3660 CmdArgs.push_back("-fretain-comments-from-system-headers");
3661
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003662 // Forward -fcomment-block-commands to -cc1.
3663 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003664 // Forward -fparse-all-comments to -cc1.
3665 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003666
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003667 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3668 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003669 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003670 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3671 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003672 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003673
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003674 // We translate this by hand to the -cc1 argument, since nightly test uses
3675 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003676 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003677 CmdArgs.push_back("-disable-llvm-optzns");
3678 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003679 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003680 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003681
Daniel Dunbard67a3222009-03-30 06:36:42 +00003682 if (Output.getType() == types::TY_Dependencies) {
3683 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003684 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003685 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003686 CmdArgs.push_back(Output.getFilename());
3687 } else {
3688 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003689 }
3690
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003691 for (InputInfoList::const_iterator
3692 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3693 const InputInfo &II = *it;
3694 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003695 if (Args.hasArg(options::OPT_rewrite_objc))
3696 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3697 else
3698 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003699 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003700 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003701 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003702 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003703 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003704
Chris Lattnere9d7d782009-11-03 19:50:27 +00003705 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3706
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003707 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003708
3709 // Optionally embed the -cc1 level arguments into the debug info, for build
3710 // analysis.
3711 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003712 ArgStringList OriginalArgs;
3713 for (ArgList::const_iterator it = Args.begin(),
3714 ie = Args.end(); it != ie; ++it)
3715 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003716
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003717 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003718 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003719 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003720 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003721 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003722 }
3723 CmdArgs.push_back("-dwarf-debug-flags");
3724 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3725 }
3726
Eric Christopherd3804002013-02-22 20:12:52 +00003727 // Add the split debug info name to the command lines here so we
3728 // can propagate it to the backend.
3729 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003730 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003731 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003732 const char *SplitDwarfOut;
3733 if (SplitDwarf) {
3734 CmdArgs.push_back("-split-dwarf-file");
3735 SplitDwarfOut = SplitDebugName(Args, Inputs);
3736 CmdArgs.push_back(SplitDwarfOut);
3737 }
3738
3739 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00003740 if (Args.hasArg(options::OPT__SLASH_fallback) &&
3741 Output.getType() == types::TY_Object) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00003742 tools::visualstudio::Compile CL(getToolChain());
3743 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3744 LinkingOutput);
3745 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3746 } else {
3747 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3748 }
3749
Daniel Dunbar17731772009-03-23 19:03:36 +00003750
Eric Christopherf1545832013-02-22 23:50:16 +00003751 // Handle the debug info splitting at object creation time if we're
3752 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003753 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003754 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003755 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003756
Roman Divacky178e01602011-02-10 16:52:03 +00003757 if (Arg *A = Args.getLastArg(options::OPT_pg))
3758 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003759 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003760 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003761
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003762 // Claim some arguments which clang supports automatically.
3763
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003764 // -fpch-preprocess is used with gcc to add a special marker in the output to
3765 // include the PCH file. Clang's PTH solution is completely transparent, so we
3766 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003767 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003768
Daniel Dunbar17731772009-03-23 19:03:36 +00003769 // Claim some arguments which clang doesn't support, but we don't
3770 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003771 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3772 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003773
Rafael Espindolab0092d72013-09-04 19:37:35 +00003774 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003775 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003776}
3777
John McCall5fb5df92012-06-20 06:18:46 +00003778/// Add options related to the Objective-C runtime/ABI.
3779///
3780/// Returns true if the runtime is non-fragile.
3781ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3782 ArgStringList &cmdArgs,
3783 RewriteKind rewriteKind) const {
3784 // Look for the controlling runtime option.
3785 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3786 options::OPT_fgnu_runtime,
3787 options::OPT_fobjc_runtime_EQ);
3788
3789 // Just forward -fobjc-runtime= to the frontend. This supercedes
3790 // options about fragility.
3791 if (runtimeArg &&
3792 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3793 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003794 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003795 if (runtime.tryParse(value)) {
3796 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3797 << value;
3798 }
3799
3800 runtimeArg->render(args, cmdArgs);
3801 return runtime;
3802 }
3803
3804 // Otherwise, we'll need the ABI "version". Version numbers are
3805 // slightly confusing for historical reasons:
3806 // 1 - Traditional "fragile" ABI
3807 // 2 - Non-fragile ABI, version 1
3808 // 3 - Non-fragile ABI, version 2
3809 unsigned objcABIVersion = 1;
3810 // If -fobjc-abi-version= is present, use that to set the version.
3811 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_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 objcABIVersion = 1;
3815 else if (value == "2")
3816 objcABIVersion = 2;
3817 else if (value == "3")
3818 objcABIVersion = 3;
3819 else
3820 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3821 << value;
3822 } else {
3823 // Otherwise, determine if we are using the non-fragile ABI.
3824 bool nonFragileABIIsDefault =
3825 (rewriteKind == RK_NonFragile ||
3826 (rewriteKind == RK_None &&
3827 getToolChain().IsObjCNonFragileABIDefault()));
3828 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3829 options::OPT_fno_objc_nonfragile_abi,
3830 nonFragileABIIsDefault)) {
3831 // Determine the non-fragile ABI version to use.
3832#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3833 unsigned nonFragileABIVersion = 1;
3834#else
3835 unsigned nonFragileABIVersion = 2;
3836#endif
3837
3838 if (Arg *abiArg = args.getLastArg(
3839 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003840 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003841 if (value == "1")
3842 nonFragileABIVersion = 1;
3843 else if (value == "2")
3844 nonFragileABIVersion = 2;
3845 else
3846 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3847 << value;
3848 }
3849
3850 objcABIVersion = 1 + nonFragileABIVersion;
3851 } else {
3852 objcABIVersion = 1;
3853 }
3854 }
3855
3856 // We don't actually care about the ABI version other than whether
3857 // it's non-fragile.
3858 bool isNonFragile = objcABIVersion != 1;
3859
3860 // If we have no runtime argument, ask the toolchain for its default runtime.
3861 // However, the rewriter only really supports the Mac runtime, so assume that.
3862 ObjCRuntime runtime;
3863 if (!runtimeArg) {
3864 switch (rewriteKind) {
3865 case RK_None:
3866 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3867 break;
3868 case RK_Fragile:
3869 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3870 break;
3871 case RK_NonFragile:
3872 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3873 break;
3874 }
3875
3876 // -fnext-runtime
3877 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3878 // On Darwin, make this use the default behavior for the toolchain.
Tim Northover157d9112014-01-16 08:48:16 +00003879 if (getToolChain().getTriple().isOSBinFormatMachO()) {
John McCall5fb5df92012-06-20 06:18:46 +00003880 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3881
3882 // Otherwise, build for a generic macosx port.
3883 } else {
3884 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3885 }
3886
3887 // -fgnu-runtime
3888 } else {
3889 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003890 // Legacy behaviour is to target the gnustep runtime if we are i
3891 // non-fragile mode or the GCC runtime in fragile mode.
3892 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003893 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003894 else
3895 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003896 }
3897
3898 cmdArgs.push_back(args.MakeArgString(
3899 "-fobjc-runtime=" + runtime.getAsString()));
3900 return runtime;
3901}
3902
Hans Wennborg75958c42013-08-08 00:17:41 +00003903void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3904 unsigned RTOptionID = options::OPT__SLASH_MT;
3905
Hans Wennborgf1a74252013-09-10 20:18:04 +00003906 if (Args.hasArg(options::OPT__SLASH_LDd))
3907 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3908 // but defining _DEBUG is sticky.
3909 RTOptionID = options::OPT__SLASH_MTd;
3910
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003911 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003912 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003913
Hans Wennborg75958c42013-08-08 00:17:41 +00003914 switch(RTOptionID) {
3915 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003916 if (Args.hasArg(options::OPT__SLASH_LDd))
3917 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003918 CmdArgs.push_back("-D_MT");
3919 CmdArgs.push_back("-D_DLL");
3920 CmdArgs.push_back("--dependent-lib=msvcrt");
3921 break;
3922 case options::OPT__SLASH_MDd:
3923 CmdArgs.push_back("-D_DEBUG");
3924 CmdArgs.push_back("-D_MT");
3925 CmdArgs.push_back("-D_DLL");
3926 CmdArgs.push_back("--dependent-lib=msvcrtd");
3927 break;
3928 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003929 if (Args.hasArg(options::OPT__SLASH_LDd))
3930 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003931 CmdArgs.push_back("-D_MT");
3932 CmdArgs.push_back("--dependent-lib=libcmt");
3933 break;
3934 case options::OPT__SLASH_MTd:
3935 CmdArgs.push_back("-D_DEBUG");
3936 CmdArgs.push_back("-D_MT");
3937 CmdArgs.push_back("--dependent-lib=libcmtd");
3938 break;
3939 default:
3940 llvm_unreachable("Unexpected option ID.");
3941 }
3942
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003943 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3944 // users want. The /Za flag to cl.exe turns this off, but it's not
3945 // implemented in clang.
3946 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003947
Hans Wennborg0fd62072013-08-09 00:32:23 +00003948 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3949 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003950
3951 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3952 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003953 if (Args.hasArg(options::OPT__SLASH_fallback))
3954 CmdArgs.push_back("msvc-fallback");
3955 else
3956 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003957 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003958}
3959
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003960void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003961 const InputInfo &Output,
3962 const InputInfoList &Inputs,
3963 const ArgList &Args,
3964 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003965 ArgStringList CmdArgs;
3966
3967 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3968 const InputInfo &Input = Inputs[0];
3969
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003970 // Don't warn about "clang -w -c foo.s"
3971 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003972 // and "clang -emit-llvm -c foo.s"
3973 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003974
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003975 // Invoke ourselves in -cc1as mode.
3976 //
3977 // FIXME: Implement custom jobs for internal actions.
3978 CmdArgs.push_back("-cc1as");
3979
3980 // Add the "effective" target triple.
3981 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003982 std::string TripleStr =
3983 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003984 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3985
3986 // Set the output mode, we currently only expect to be used as a real
3987 // assembler.
3988 CmdArgs.push_back("-filetype");
3989 CmdArgs.push_back("obj");
3990
Eric Christopher45f2e712012-12-18 00:31:10 +00003991 // Set the main file name, so that debug info works even with
3992 // -save-temps or preprocessed assembly.
3993 CmdArgs.push_back("-main-file-name");
3994 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3995
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003996 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003997 const llvm::Triple &Triple = getToolChain().getTriple();
3998 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003999 if (!CPU.empty()) {
4000 CmdArgs.push_back("-target-cpu");
4001 CmdArgs.push_back(Args.MakeArgString(CPU));
4002 }
4003
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004004 // Add the target features
4005 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004006 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004007
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004008 // Ignore explicit -force_cpusubtype_ALL option.
4009 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004010
Eric Christopherfc3ee562012-01-10 00:38:01 +00004011 // Determine the original source input.
4012 const Action *SourceAction = &JA;
4013 while (SourceAction->getKind() != Action::InputClass) {
4014 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4015 SourceAction = SourceAction->getInputs()[0];
4016 }
4017
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004018 // Forward -g and handle debug info related flags, assuming we are dealing
4019 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004020 if (SourceAction->getType() == types::TY_Asm ||
4021 SourceAction->getType() == types::TY_PP_Asm) {
4022 Args.ClaimAllArgs(options::OPT_g_Group);
4023 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4024 if (!A->getOption().matches(options::OPT_g0))
4025 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004026
4027 // Add the -fdebug-compilation-dir flag if needed.
4028 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004029
4030 // Set the AT_producer to the clang version when using the integrated
4031 // assembler on assembly source files.
4032 CmdArgs.push_back("-dwarf-debug-producer");
4033 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004034 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004035
4036 // Optionally embed the -cc1as level arguments into the debug info, for build
4037 // analysis.
4038 if (getToolChain().UseDwarfDebugFlags()) {
4039 ArgStringList OriginalArgs;
4040 for (ArgList::const_iterator it = Args.begin(),
4041 ie = Args.end(); it != ie; ++it)
4042 (*it)->render(Args, OriginalArgs);
4043
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004044 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004045 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4046 Flags += Exec;
4047 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4048 Flags += " ";
4049 Flags += OriginalArgs[i];
4050 }
4051 CmdArgs.push_back("-dwarf-debug-flags");
4052 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4053 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004054
4055 // FIXME: Add -static support, once we have it.
4056
David Blaikie372d9502014-01-17 03:17:40 +00004057 // Consume all the warning flags. Usually this would be handled more
4058 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4059 // doesn't handle that so rather than warning about unused flags that are
4060 // actually used, we'll lie by omission instead.
4061 // FIXME: Stop lying and consume only the appropriate driver flags
4062 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4063 ie = Args.filtered_end();
4064 it != ie; ++it)
4065 (*it)->claim();
4066
David Blaikie9260ed62013-07-25 21:19:01 +00004067 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4068 getToolChain().getDriver());
4069
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004070 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004071
4072 assert(Output.isFilename() && "Unexpected lipo output.");
4073 CmdArgs.push_back("-o");
4074 CmdArgs.push_back(Output.getFilename());
4075
Daniel Dunbarb440f562010-08-02 02:38:21 +00004076 assert(Input.isFilename() && "Invalid input.");
4077 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004078
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004079 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004080 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004081
4082 // Handle the debug info splitting at object creation time if we're
4083 // creating an object.
4084 // TODO: Currently only works on linux with newer objcopy.
4085 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004086 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004087 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4088 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004089}
4090
Daniel Dunbara3246a02009-03-18 08:07:30 +00004091void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004092 const InputInfo &Output,
4093 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004094 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004095 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004096 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004097 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004098
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004099 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004100 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004101 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004102 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004103 // Don't forward any -g arguments to assembly steps.
4104 if (isa<AssembleJobAction>(JA) &&
4105 A->getOption().matches(options::OPT_g_Group))
4106 continue;
4107
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004108 // Don't forward any -W arguments to assembly and link steps.
4109 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4110 A->getOption().matches(options::OPT_W_Group))
4111 continue;
4112
Daniel Dunbar2da02722009-03-19 07:55:12 +00004113 // It is unfortunate that we have to claim here, as this means
4114 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004115 // platforms using a generic gcc, even if we are just using gcc
4116 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004117 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004118 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004119 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004120 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004121
Daniel Dunbar4e295052010-01-25 22:35:08 +00004122 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004123
4124 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004125 llvm::Triple::ArchType Arch = getToolChain().getArch();
Tim Northover157d9112014-01-16 08:48:16 +00004126 if (getToolChain().getTriple().isOSBinFormatMachO()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004127 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004128
4129 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004130 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004131 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004132 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004133 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004134 else if (Arch == llvm::Triple::ppc64le)
4135 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004136 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004137 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004138 }
4139
Daniel Dunbar5716d872009-05-02 21:41:52 +00004140 // Try to force gcc to match the tool chain we want, if we recognize
4141 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004142 //
4143 // FIXME: The triple class should directly provide the information we want
4144 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004145 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004146 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004147 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4148 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004149 CmdArgs.push_back("-m64");
4150
Daniel Dunbarb440f562010-08-02 02:38:21 +00004151 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004152 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004153 CmdArgs.push_back(Output.getFilename());
4154 } else {
4155 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004156 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004157 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004158
Tony Linthicum76329bf2011-12-12 21:14:55 +00004159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4160 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004161
4162 // Only pass -x if gcc will understand it; otherwise hope gcc
4163 // understands the suffix correctly. The main use case this would go
4164 // wrong in is for linker inputs if they happened to have an odd
4165 // suffix; really the only way to get this to happen is a command
4166 // like '-x foobar a.c' which will treat a.c like a linker input.
4167 //
4168 // FIXME: For the linker case specifically, can we safely convert
4169 // inputs into '-Wl,' options?
4170 for (InputInfoList::const_iterator
4171 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4172 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004173
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004174 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004175 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4176 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004177 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004178 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004179 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004180 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004181 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004182 else if (II.getType() == types::TY_ModuleFile)
4183 D.Diag(diag::err_drv_no_module_support)
4184 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004185
Daniel Dunbara3246a02009-03-18 08:07:30 +00004186 if (types::canTypeBeUserSpecified(II.getType())) {
4187 CmdArgs.push_back("-x");
4188 CmdArgs.push_back(types::getTypeName(II.getType()));
4189 }
4190
Daniel Dunbarb440f562010-08-02 02:38:21 +00004191 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004192 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004193 else {
4194 const Arg &A = II.getInputArg();
4195
4196 // Reverse translate some rewritten options.
4197 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4198 CmdArgs.push_back("-lstdc++");
4199 continue;
4200 }
4201
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004202 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004203 A.render(Args, CmdArgs);
4204 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004205 }
4206
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004207 const std::string customGCCName = D.getCCCGenericGCCName();
4208 const char *GCCName;
4209 if (!customGCCName.empty())
4210 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004211 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004212 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004213 } else
4214 GCCName = "gcc";
4215
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004216 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004217 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004218 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004219}
4220
Daniel Dunbar4e295052010-01-25 22:35:08 +00004221void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4222 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004223 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004224}
4225
Daniel Dunbar4e295052010-01-25 22:35:08 +00004226void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4227 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004228 const Driver &D = getToolChain().getDriver();
4229
Daniel Dunbar4e295052010-01-25 22:35:08 +00004230 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004231 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4232 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004233 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004234 else {
4235 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004236 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004237 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004238
Daniel Dunbar4e295052010-01-25 22:35:08 +00004239 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004240 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004241}
4242
Daniel Dunbar4e295052010-01-25 22:35:08 +00004243void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4244 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004245 // The types are (hopefully) good enough.
4246}
4247
Tony Linthicum76329bf2011-12-12 21:14:55 +00004248// Hexagon tools start.
4249void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4250 ArgStringList &CmdArgs) const {
4251
4252}
4253void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4254 const InputInfo &Output,
4255 const InputInfoList &Inputs,
4256 const ArgList &Args,
4257 const char *LinkingOutput) const {
4258
4259 const Driver &D = getToolChain().getDriver();
4260 ArgStringList CmdArgs;
4261
4262 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004263 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004264 CmdArgs.push_back(Args.MakeArgString(MarchString));
4265
4266 RenderExtraToolArgs(JA, CmdArgs);
4267
4268 if (Output.isFilename()) {
4269 CmdArgs.push_back("-o");
4270 CmdArgs.push_back(Output.getFilename());
4271 } else {
4272 assert(Output.isNothing() && "Unexpected output");
4273 CmdArgs.push_back("-fsyntax-only");
4274 }
4275
Matthew Curtise8f80a12012-12-06 17:49:03 +00004276 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4277 if (!SmallDataThreshold.empty())
4278 CmdArgs.push_back(
4279 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004280
Matthew Curtise5df3812012-12-07 17:23:04 +00004281 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4282 options::OPT_Xassembler);
4283
Tony Linthicum76329bf2011-12-12 21:14:55 +00004284 // Only pass -x if gcc will understand it; otherwise hope gcc
4285 // understands the suffix correctly. The main use case this would go
4286 // wrong in is for linker inputs if they happened to have an odd
4287 // suffix; really the only way to get this to happen is a command
4288 // like '-x foobar a.c' which will treat a.c like a linker input.
4289 //
4290 // FIXME: For the linker case specifically, can we safely convert
4291 // inputs into '-Wl,' options?
4292 for (InputInfoList::const_iterator
4293 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4294 const InputInfo &II = *it;
4295
4296 // Don't try to pass LLVM or AST inputs to a generic gcc.
4297 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4298 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4299 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4300 << getToolChain().getTripleString();
4301 else if (II.getType() == types::TY_AST)
4302 D.Diag(clang::diag::err_drv_no_ast_support)
4303 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004304 else if (II.getType() == types::TY_ModuleFile)
4305 D.Diag(diag::err_drv_no_module_support)
4306 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004307
4308 if (II.isFilename())
4309 CmdArgs.push_back(II.getFilename());
4310 else
4311 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4312 II.getInputArg().render(Args, CmdArgs);
4313 }
4314
4315 const char *GCCName = "hexagon-as";
4316 const char *Exec =
4317 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4318 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4319
4320}
4321void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4322 ArgStringList &CmdArgs) const {
4323 // The types are (hopefully) good enough.
4324}
4325
4326void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4327 const InputInfo &Output,
4328 const InputInfoList &Inputs,
4329 const ArgList &Args,
4330 const char *LinkingOutput) const {
4331
Matthew Curtise689b052012-12-06 15:46:07 +00004332 const toolchains::Hexagon_TC& ToolChain =
4333 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4334 const Driver &D = ToolChain.getDriver();
4335
Tony Linthicum76329bf2011-12-12 21:14:55 +00004336 ArgStringList CmdArgs;
4337
Matthew Curtise689b052012-12-06 15:46:07 +00004338 //----------------------------------------------------------------------------
4339 //
4340 //----------------------------------------------------------------------------
4341 bool hasStaticArg = Args.hasArg(options::OPT_static);
4342 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004343 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004344 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4345 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4346 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4347 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004348
Matthew Curtise689b052012-12-06 15:46:07 +00004349 //----------------------------------------------------------------------------
4350 // Silence warnings for various options
4351 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004352
Matthew Curtise689b052012-12-06 15:46:07 +00004353 Args.ClaimAllArgs(options::OPT_g_Group);
4354 Args.ClaimAllArgs(options::OPT_emit_llvm);
4355 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4356 // handled somewhere else.
4357 Args.ClaimAllArgs(options::OPT_static_libgcc);
4358
4359 //----------------------------------------------------------------------------
4360 //
4361 //----------------------------------------------------------------------------
4362 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4363 e = ToolChain.ExtraOpts.end();
4364 i != e; ++i)
4365 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004366
Matthew Curtisf10a5952012-12-06 14:16:43 +00004367 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4368 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004369
Matthew Curtise689b052012-12-06 15:46:07 +00004370 if (buildingLib) {
4371 CmdArgs.push_back("-shared");
4372 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4373 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004374 }
4375
Matthew Curtise689b052012-12-06 15:46:07 +00004376 if (hasStaticArg)
4377 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004378
Matthew Curtise8f80a12012-12-06 17:49:03 +00004379 if (buildPIE && !buildingLib)
4380 CmdArgs.push_back("-pie");
4381
4382 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4383 if (!SmallDataThreshold.empty()) {
4384 CmdArgs.push_back(
4385 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4386 }
4387
Matthew Curtise689b052012-12-06 15:46:07 +00004388 //----------------------------------------------------------------------------
4389 //
4390 //----------------------------------------------------------------------------
4391 CmdArgs.push_back("-o");
4392 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004393
Matthew Curtise689b052012-12-06 15:46:07 +00004394 const std::string MarchSuffix = "/" + MarchString;
4395 const std::string G0Suffix = "/G0";
4396 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4397 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4398 + "/";
4399 const std::string StartFilesDir = RootDir
4400 + "hexagon/lib"
4401 + (buildingLib
4402 ? MarchG0Suffix : MarchSuffix);
4403
4404 //----------------------------------------------------------------------------
4405 // moslib
4406 //----------------------------------------------------------------------------
4407 std::vector<std::string> oslibs;
4408 bool hasStandalone= false;
4409
4410 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4411 ie = Args.filtered_end(); it != ie; ++it) {
4412 (*it)->claim();
4413 oslibs.push_back((*it)->getValue());
4414 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004415 }
Matthew Curtise689b052012-12-06 15:46:07 +00004416 if (oslibs.empty()) {
4417 oslibs.push_back("standalone");
4418 hasStandalone = true;
4419 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004420
Matthew Curtise689b052012-12-06 15:46:07 +00004421 //----------------------------------------------------------------------------
4422 // Start Files
4423 //----------------------------------------------------------------------------
4424 if (incStdLib && incStartFiles) {
4425
4426 if (!buildingLib) {
4427 if (hasStandalone) {
4428 CmdArgs.push_back(
4429 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4430 }
4431 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4432 }
4433 std::string initObj = useShared ? "/initS.o" : "/init.o";
4434 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4435 }
4436
4437 //----------------------------------------------------------------------------
4438 // Library Search Paths
4439 //----------------------------------------------------------------------------
4440 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4441 for (ToolChain::path_list::const_iterator
4442 i = LibPaths.begin(),
4443 e = LibPaths.end();
4444 i != e;
4445 ++i)
4446 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4447
4448 //----------------------------------------------------------------------------
4449 //
4450 //----------------------------------------------------------------------------
4451 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4452 Args.AddAllArgs(CmdArgs, options::OPT_e);
4453 Args.AddAllArgs(CmdArgs, options::OPT_s);
4454 Args.AddAllArgs(CmdArgs, options::OPT_t);
4455 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4456
4457 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4458
4459 //----------------------------------------------------------------------------
4460 // Libraries
4461 //----------------------------------------------------------------------------
4462 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004463 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004464 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4465 CmdArgs.push_back("-lm");
4466 }
4467
4468 CmdArgs.push_back("--start-group");
4469
4470 if (!buildingLib) {
4471 for(std::vector<std::string>::iterator i = oslibs.begin(),
4472 e = oslibs.end(); i != e; ++i)
4473 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4474 CmdArgs.push_back("-lc");
4475 }
4476 CmdArgs.push_back("-lgcc");
4477
4478 CmdArgs.push_back("--end-group");
4479 }
4480
4481 //----------------------------------------------------------------------------
4482 // End files
4483 //----------------------------------------------------------------------------
4484 if (incStdLib && incStartFiles) {
4485 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4486 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4487 }
4488
4489 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004490 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004491}
4492// Hexagon tools end.
4493
Bernard Ogden31561762013-12-12 13:27:11 +00004494/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4495//
4496// FIXME: tblgen this.
4497const char *arm::getARMCPUForMArch(const ArgList &Args,
4498 const llvm::Triple &Triple) {
4499 StringRef MArch;
4500 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4501 // Otherwise, if we have -march= choose the base CPU for that arch.
4502 MArch = A->getValue();
4503 } else {
4504 // Otherwise, use the Arch from the triple.
4505 MArch = Triple.getArchName();
4506 }
4507
4508 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004509 if (MArch == "native") {
4510 std::string CPU = llvm::sys::getHostCPUName();
4511 if (CPU != "generic") {
4512 // Translate the native cpu into the architecture. The switch below will
4513 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004514 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004515 }
4516 }
4517
4518 if (Triple.getOS() == llvm::Triple::NetBSD) {
4519 if (MArch == "armv6")
4520 return "arm1176jzf-s";
4521 }
4522
4523 const char *result = llvm::StringSwitch<const char *>(MArch)
4524 .Cases("armv2", "armv2a","arm2")
4525 .Case("armv3", "arm6")
4526 .Case("armv3m", "arm7m")
4527 .Case("armv4", "strongarm")
4528 .Case("armv4t", "arm7tdmi")
4529 .Case("thumbv4t", "arm7tdmi")
4530 .Cases("armv5", "armv5t", "arm10tdmi")
4531 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4532 .Cases("armv5e", "armv5te", "arm1022e")
4533 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4534 .Case("armv5tej", "arm926ej-s")
4535 .Case("thumbv5tej", "arm926ej-s")
4536 .Cases("armv6", "armv6k", "arm1136jf-s")
4537 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4538 .Case("armv6j", "arm1136j-s")
4539 .Case("thumbv6j", "arm1136j-s")
4540 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4541 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4542 .Case("armv6t2", "arm1156t2-s")
4543 .Case("thumbv6t2", "arm1156t2-s")
4544 .Cases("armv6m", "armv6-m", "cortex-m0")
4545 .Case("thumbv6m", "cortex-m0")
4546 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
4547 .Cases("thumbv7", "thumbv7a", "cortex-a8")
4548 .Cases("armv7l", "armv7-l", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004549 .Cases("armv7s", "armv7-s", "swift")
4550 .Cases("armv7r", "armv7-r", "cortex-r4")
4551 .Case("thumbv7r", "cortex-r4")
4552 .Cases("armv7m", "armv7-m", "cortex-m3")
4553 .Case("thumbv7m", "cortex-m3")
4554 .Cases("armv7em", "armv7e-m", "cortex-m4")
4555 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
4556 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
4557 .Cases("thumbv8", "thumbv8a", "cortex-a53")
4558 .Case("ep9312", "ep9312")
4559 .Case("iwmmxt", "iwmmxt")
4560 .Case("xscale", "xscale")
4561 // If all else failed, return the most base CPU with thumb interworking
4562 // supported by LLVM.
4563 .Default(0);
4564
4565 if (result)
4566 return result;
4567
4568 return
4569 Triple.getEnvironment() == llvm::Triple::GNUEABIHF
4570 ? "arm1176jzf-s"
4571 : "arm7tdmi";
4572}
4573
4574/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004575StringRef arm::getARMTargetCPU(const ArgList &Args,
4576 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004577 // FIXME: Warn on inconsistent use of -mcpu and -march.
4578 // If we have -mcpu=, use that.
4579 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4580 StringRef MCPU = A->getValue();
4581 // Handle -mcpu=native.
4582 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004583 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004584 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004585 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004586 }
4587
4588 return getARMCPUForMArch(Args, Triple);
4589}
4590
4591/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4592/// CPU.
4593//
4594// FIXME: This is redundant with -mcpu, why does LLVM use this.
4595// FIXME: tblgen this, or kill it!
4596const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4597 return llvm::StringSwitch<const char *>(CPU)
4598 .Case("strongarm", "v4")
4599 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4600 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4601 .Cases("arm920", "arm920t", "arm922t", "v4t")
4602 .Cases("arm940t", "ep9312","v4t")
4603 .Cases("arm10tdmi", "arm1020t", "v5")
4604 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4605 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4606 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4607 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4608 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4609 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004610 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00004611 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4612 .Cases("cortex-r4", "cortex-r5", "v7r")
4613 .Case("cortex-m0", "v6m")
4614 .Case("cortex-m3", "v7m")
4615 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00004616 .Case("swift", "v7s")
4617 .Cases("cortex-a53", "cortex-a57", "v8")
4618 .Default("");
4619}
4620
Tim Northover157d9112014-01-16 08:48:16 +00004621llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004622 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4623 // archs which Darwin doesn't use.
4624
4625 // The matching this routine does is fairly pointless, since it is neither the
4626 // complete architecture list, nor a reasonable subset. The problem is that
4627 // historically the driver driver accepts this and also ties its -march=
4628 // handling to the architecture name, so we need to be careful before removing
4629 // support for it.
4630
4631 // This code must be kept in sync with Clang's Darwin specific argument
4632 // translation.
4633
4634 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4635 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4636 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4637 .Case("ppc64", llvm::Triple::ppc64)
4638 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4639 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4640 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004641 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004642 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004643 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00004644 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00004645 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004646 .Case("r600", llvm::Triple::r600)
4647 .Case("nvptx", llvm::Triple::nvptx)
4648 .Case("nvptx64", llvm::Triple::nvptx64)
4649 .Case("amdil", llvm::Triple::amdil)
4650 .Case("spir", llvm::Triple::spir)
4651 .Default(llvm::Triple::UnknownArch);
4652}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004653
Tim Northover157d9112014-01-16 08:48:16 +00004654void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
4655 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
4656 T.setArch(Arch);
4657
4658 if (Str == "x86_64h")
4659 T.setArchName(Str);
4660 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
4661 T.setOS(llvm::Triple::UnknownOS);
4662 T.setEnvironment(llvm::Triple::MachO);
4663 }
4664}
4665
Bob Wilsondecc03e2012-11-23 06:14:39 +00004666const char *Clang::getBaseInputName(const ArgList &Args,
4667 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004668 return Args.MakeArgString(
4669 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004670}
4671
Bob Wilsondecc03e2012-11-23 06:14:39 +00004672const char *Clang::getBaseInputStem(const ArgList &Args,
4673 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004674 const char *Str = getBaseInputName(Args, Inputs);
4675
Chris Lattner906bb902011-01-16 08:14:11 +00004676 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004677 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004678
4679 return Str;
4680}
4681
Bob Wilsondecc03e2012-11-23 06:14:39 +00004682const char *Clang::getDependencyFileName(const ArgList &Args,
4683 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004684 // FIXME: Think about this more.
4685 std::string Res;
4686
4687 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004688 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004689 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004690 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004691 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004692 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004693 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004694}
4695
Daniel Dunbarbe220842009-03-20 16:06:39 +00004696void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004697 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004698 const InputInfoList &Inputs,
4699 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004700 const char *LinkingOutput) const {
4701 ArgStringList CmdArgs;
4702
4703 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4704 const InputInfo &Input = Inputs[0];
4705
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004706 // Determine the original source input.
4707 const Action *SourceAction = &JA;
4708 while (SourceAction->getKind() != Action::InputClass) {
4709 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4710 SourceAction = SourceAction->getInputs()[0];
4711 }
4712
Kevin Enderby319baa42013-11-18 23:30:29 +00004713 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4714 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004715 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4716 // FIXME: at run-time detect assembler capabilities or rely on version
4717 // information forwarded by -target-assembler-version (future)
4718 if (Args.hasArg(options::OPT_no_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004719 const llvm::Triple &T(getToolChain().getTriple());
4720 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004721 CmdArgs.push_back("-Q");
4722 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004723
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004724 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004725 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004726 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004727 if (Args.hasArg(options::OPT_gstabs))
4728 CmdArgs.push_back("--gstabs");
4729 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004730 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004731 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004732
Daniel Dunbarbe220842009-03-20 16:06:39 +00004733 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00004734 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004735
Daniel Dunbar6d484762010-07-22 01:47:22 +00004736 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004737 if (getToolChain().getArch() == llvm::Triple::x86 ||
4738 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004739 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4740 CmdArgs.push_back("-force_cpusubtype_ALL");
4741
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004742 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004743 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004744 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00004745 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004746 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004747 CmdArgs.push_back("-static");
4748
Daniel Dunbarbe220842009-03-20 16:06:39 +00004749 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4750 options::OPT_Xassembler);
4751
4752 assert(Output.isFilename() && "Unexpected lipo output.");
4753 CmdArgs.push_back("-o");
4754 CmdArgs.push_back(Output.getFilename());
4755
Daniel Dunbarb440f562010-08-02 02:38:21 +00004756 assert(Input.isFilename() && "Invalid input.");
4757 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004758
4759 // asm_final spec is empty.
4760
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004761 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004762 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004763 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004764}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004765
Tim Northover157d9112014-01-16 08:48:16 +00004766void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00004767
Tim Northover157d9112014-01-16 08:48:16 +00004768void darwin::MachOTool::AddMachOArch(const ArgList &Args,
4769 ArgStringList &CmdArgs) const {
4770 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004771
Daniel Dunbarc1964212009-03-26 16:23:12 +00004772 // Derived from darwin_arch spec.
4773 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004774 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004775
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004776 // FIXME: Is this needed anymore?
4777 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004778 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004779}
4780
Bill Wendling3b2000f2012-10-02 18:02:50 +00004781bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4782 // We only need to generate a temp path for LTO if we aren't compiling object
4783 // files. When compiling source files, we run 'dsymutil' after linking. We
4784 // don't run 'dsymutil' when compiling object files.
4785 for (InputInfoList::const_iterator
4786 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4787 if (it->getType() != types::TY_Object)
4788 return true;
4789
4790 return false;
4791}
4792
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004793void darwin::Link::AddLinkArgs(Compilation &C,
4794 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004795 ArgStringList &CmdArgs,
4796 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004797 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00004798 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004799
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004800 unsigned Version[3] = { 0, 0, 0 };
4801 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4802 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004803 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004804 Version[1], Version[2], HadExtra) ||
4805 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004806 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004807 << A->getAsString(Args);
4808 }
4809
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00004810 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004811 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00004812 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
4813 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004814
Bob Wilson3d27dad2013-08-02 22:25:34 +00004815 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4816 CmdArgs.push_back("-export_dynamic");
4817
Bill Wendling313b6bf2012-11-16 23:03:00 +00004818 // If we are using LTO, then automatically create a temporary file path for
4819 // the linker to use, so that it's lifetime will extend past a possible
4820 // dsymutil step.
4821 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4822 const char *TmpPath = C.getArgs().MakeArgString(
4823 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4824 C.addTempFile(TmpPath);
4825 CmdArgs.push_back("-object_path_lto");
4826 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004827 }
4828
Daniel Dunbarc1964212009-03-26 16:23:12 +00004829 // Derived from the "link" spec.
4830 Args.AddAllArgs(CmdArgs, options::OPT_static);
4831 if (!Args.hasArg(options::OPT_static))
4832 CmdArgs.push_back("-dynamic");
4833 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4834 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4835 // here. How do we wish to handle such things?
4836 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004837
Daniel Dunbarc1964212009-03-26 16:23:12 +00004838 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00004839 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004840 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004841 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004842
4843 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4844 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4845 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4846
4847 Arg *A;
4848 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4849 (A = Args.getLastArg(options::OPT_current__version)) ||
4850 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004851 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004852 << A->getAsString(Args) << "-dynamiclib";
4853
4854 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4855 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4856 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4857 } else {
4858 CmdArgs.push_back("-dylib");
4859
4860 Arg *A;
4861 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4862 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4863 (A = Args.getLastArg(options::OPT_client__name)) ||
4864 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4865 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4866 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004867 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004868 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004869
Daniel Dunbarc1964212009-03-26 16:23:12 +00004870 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4871 "-dylib_compatibility_version");
4872 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4873 "-dylib_current_version");
4874
Tim Northover157d9112014-01-16 08:48:16 +00004875 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004876
4877 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4878 "-dylib_install_name");
4879 }
4880
4881 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4882 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4883 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00004884 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004885 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004886 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4887 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4888 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4889 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4890 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4891 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004892 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004893 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4894 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4895 Args.AddAllArgs(CmdArgs, options::OPT_init);
4896
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004897 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00004898 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004899
Daniel Dunbarc1964212009-03-26 16:23:12 +00004900 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4901 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4902 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4903 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4904 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004905
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004906 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4907 options::OPT_fno_pie,
4908 options::OPT_fno_PIE)) {
4909 if (A->getOption().matches(options::OPT_fpie) ||
4910 A->getOption().matches(options::OPT_fPIE))
4911 CmdArgs.push_back("-pie");
4912 else
4913 CmdArgs.push_back("-no_pie");
4914 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004915
4916 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4917 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4918 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4919 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4920 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4921 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4922 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4923 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4924 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4925 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4926 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4927 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4928 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4929 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4930 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4931 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004932
Daniel Dunbar84384642011-05-02 21:03:47 +00004933 // Give --sysroot= preference, over the Apple specific behavior to also use
4934 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004935 StringRef sysroot = C.getSysRoot();
4936 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004937 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004938 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004939 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4940 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004941 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004942 }
4943
Daniel Dunbarc1964212009-03-26 16:23:12 +00004944 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4945 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4946 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4947 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4948 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004949 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004950 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4951 Args.AddAllArgs(CmdArgs, options::OPT_y);
4952 Args.AddLastArg(CmdArgs, options::OPT_w);
4953 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4954 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4955 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4956 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4957 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4958 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4959 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4960 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4961 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4962 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4963 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4964 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4965}
4966
4967void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004968 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004969 const InputInfoList &Inputs,
4970 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004971 const char *LinkingOutput) const {
4972 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004973
Daniel Dunbarc1964212009-03-26 16:23:12 +00004974 // The logic here is derived from gcc's behavior; most of which
4975 // comes from specs (starting with link_command). Consult gcc for
4976 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004977 ArgStringList CmdArgs;
4978
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004979 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4980 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4981 options::OPT_ccc_arcmt_migrate)) {
4982 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4983 (*I)->claim();
4984 const char *Exec =
4985 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4986 CmdArgs.push_back(Output.getFilename());
4987 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4988 return;
4989 }
4990
Daniel Dunbarc1964212009-03-26 16:23:12 +00004991 // I'm not sure why this particular decomposition exists in gcc, but
4992 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004993 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004994
Daniel Dunbarc1964212009-03-26 16:23:12 +00004995 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4996 Args.AddAllArgs(CmdArgs, options::OPT_s);
4997 Args.AddAllArgs(CmdArgs, options::OPT_t);
4998 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4999 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005000 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005001 Args.AddAllArgs(CmdArgs, options::OPT_r);
5002
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005003 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5004 // members of static archive libraries which implement Objective-C classes or
5005 // categories.
5006 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5007 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005008
Daniel Dunbarc1964212009-03-26 16:23:12 +00005009 CmdArgs.push_back("-o");
5010 CmdArgs.push_back(Output.getFilename());
5011
Chad Rosier06fd3c62012-05-16 23:45:12 +00005012 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005013 !Args.hasArg(options::OPT_nostartfiles))
5014 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005015
5016 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005017
Daniel Dunbarc1964212009-03-26 16:23:12 +00005018 if (Args.hasArg(options::OPT_fopenmp))
5019 // This is more complicated in gcc...
5020 CmdArgs.push_back("-lgomp");
5021
Douglas Gregor9295df02012-05-15 21:00:27 +00005022 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5023
Bob Wilson16d93952012-05-15 18:57:39 +00005024 if (isObjCRuntimeLinked(Args) &&
5025 !Args.hasArg(options::OPT_nostdlib) &&
5026 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005027 // We use arclite library for both ARC and subscripting support.
5028 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5029
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005030 CmdArgs.push_back("-framework");
5031 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005032 // Link libobj.
5033 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005034 }
John McCall31168b02011-06-15 23:02:42 +00005035
Daniel Dunbarc1964212009-03-26 16:23:12 +00005036 if (LinkingOutput) {
5037 CmdArgs.push_back("-arch_multiple");
5038 CmdArgs.push_back("-final_output");
5039 CmdArgs.push_back(LinkingOutput);
5040 }
5041
Daniel Dunbarc1964212009-03-26 16:23:12 +00005042 if (Args.hasArg(options::OPT_fnested_functions))
5043 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005044
Daniel Dunbarc1964212009-03-26 16:23:12 +00005045 if (!Args.hasArg(options::OPT_nostdlib) &&
5046 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005047 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005048 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005049
Daniel Dunbarc1964212009-03-26 16:23:12 +00005050 // link_ssp spec is empty.
5051
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005052 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005053 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005054 }
5055
Chad Rosier06fd3c62012-05-16 23:45:12 +00005056 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005057 !Args.hasArg(options::OPT_nostartfiles)) {
5058 // endfile_spec is empty.
5059 }
5060
5061 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5062 Args.AddAllArgs(CmdArgs, options::OPT_F);
5063
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005064 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005065 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005066 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005067}
5068
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005069void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005070 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005071 const InputInfoList &Inputs,
5072 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005073 const char *LinkingOutput) const {
5074 ArgStringList CmdArgs;
5075
5076 CmdArgs.push_back("-create");
5077 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005078
5079 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005080 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005081
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005082 for (InputInfoList::const_iterator
5083 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5084 const InputInfo &II = *it;
5085 assert(II.isFilename() && "Unexpected lipo input.");
5086 CmdArgs.push_back(II.getFilename());
5087 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005088 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005089 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005090 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005091}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005092
Daniel Dunbar88299622010-06-04 18:28:36 +00005093void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005094 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005095 const InputInfoList &Inputs,
5096 const ArgList &Args,
5097 const char *LinkingOutput) const {
5098 ArgStringList CmdArgs;
5099
Daniel Dunbareb86b042011-05-09 17:23:16 +00005100 CmdArgs.push_back("-o");
5101 CmdArgs.push_back(Output.getFilename());
5102
Daniel Dunbar88299622010-06-04 18:28:36 +00005103 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5104 const InputInfo &Input = Inputs[0];
5105 assert(Input.isFilename() && "Unexpected dsymutil input.");
5106 CmdArgs.push_back(Input.getFilename());
5107
Daniel Dunbar88299622010-06-04 18:28:36 +00005108 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005109 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005111}
5112
Eric Christopher551ef452011-08-23 17:56:55 +00005113void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005114 const InputInfo &Output,
5115 const InputInfoList &Inputs,
5116 const ArgList &Args,
5117 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005118 ArgStringList CmdArgs;
5119 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005120 CmdArgs.push_back("--debug-info");
5121 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005122 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005123
5124 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5125 const InputInfo &Input = Inputs[0];
5126 assert(Input.isFilename() && "Unexpected verify input");
5127
5128 // Grabbing the output of the earlier dsymutil run.
5129 CmdArgs.push_back(Input.getFilename());
5130
5131 const char *Exec =
5132 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5133 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5134}
5135
David Chisnallf571cde2012-02-15 13:39:01 +00005136void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5137 const InputInfo &Output,
5138 const InputInfoList &Inputs,
5139 const ArgList &Args,
5140 const char *LinkingOutput) const {
5141 ArgStringList CmdArgs;
5142
5143 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5144 options::OPT_Xassembler);
5145
5146 CmdArgs.push_back("-o");
5147 CmdArgs.push_back(Output.getFilename());
5148
5149 for (InputInfoList::const_iterator
5150 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5151 const InputInfo &II = *it;
5152 CmdArgs.push_back(II.getFilename());
5153 }
5154
5155 const char *Exec =
5156 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5157 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5158}
5159
5160
5161void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5162 const InputInfo &Output,
5163 const InputInfoList &Inputs,
5164 const ArgList &Args,
5165 const char *LinkingOutput) const {
5166 // FIXME: Find a real GCC, don't hard-code versions here
5167 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5168 const llvm::Triple &T = getToolChain().getTriple();
5169 std::string LibPath = "/usr/lib/";
5170 llvm::Triple::ArchType Arch = T.getArch();
5171 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005172 case llvm::Triple::x86:
5173 GCCLibPath +=
5174 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5175 break;
5176 case llvm::Triple::x86_64:
5177 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5178 GCCLibPath += "/4.5.2/amd64/";
5179 LibPath += "amd64/";
5180 break;
5181 default:
5182 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005183 }
5184
5185 ArgStringList CmdArgs;
5186
David Chisnall272a0712012-02-29 15:06:12 +00005187 // Demangle C++ names in errors
5188 CmdArgs.push_back("-C");
5189
David Chisnallf571cde2012-02-15 13:39:01 +00005190 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5191 (!Args.hasArg(options::OPT_shared))) {
5192 CmdArgs.push_back("-e");
5193 CmdArgs.push_back("_start");
5194 }
5195
5196 if (Args.hasArg(options::OPT_static)) {
5197 CmdArgs.push_back("-Bstatic");
5198 CmdArgs.push_back("-dn");
5199 } else {
5200 CmdArgs.push_back("-Bdynamic");
5201 if (Args.hasArg(options::OPT_shared)) {
5202 CmdArgs.push_back("-shared");
5203 } else {
5204 CmdArgs.push_back("--dynamic-linker");
5205 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5206 }
5207 }
5208
5209 if (Output.isFilename()) {
5210 CmdArgs.push_back("-o");
5211 CmdArgs.push_back(Output.getFilename());
5212 } else {
5213 assert(Output.isNothing() && "Invalid output.");
5214 }
5215
5216 if (!Args.hasArg(options::OPT_nostdlib) &&
5217 !Args.hasArg(options::OPT_nostartfiles)) {
5218 if (!Args.hasArg(options::OPT_shared)) {
5219 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5220 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005221 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005222 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5223 } else {
5224 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005225 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5226 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005227 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005228 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005229 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005230 }
5231
5232 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5233
5234 Args.AddAllArgs(CmdArgs, options::OPT_L);
5235 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5236 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005237 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005238
5239 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5240
5241 if (!Args.hasArg(options::OPT_nostdlib) &&
5242 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005243 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005244 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005245 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005246 if (!Args.hasArg(options::OPT_shared)) {
5247 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005248 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005249 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005250 }
David Chisnallf571cde2012-02-15 13:39:01 +00005251 }
5252
5253 if (!Args.hasArg(options::OPT_nostdlib) &&
5254 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005255 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005256 }
David Chisnall96de9932012-02-16 16:00:47 +00005257 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005258
5259 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5260
5261 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005262 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005263 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5264}
5265
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005266void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005267 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005268 const InputInfoList &Inputs,
5269 const ArgList &Args,
5270 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005271 ArgStringList CmdArgs;
5272
5273 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5274 options::OPT_Xassembler);
5275
5276 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005277 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005278
5279 for (InputInfoList::const_iterator
5280 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5281 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005282 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005283 }
5284
5285 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005286 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005287 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005288}
5289
5290void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005291 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005292 const InputInfoList &Inputs,
5293 const ArgList &Args,
5294 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005295 ArgStringList CmdArgs;
5296
5297 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005298 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005299 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005300 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005301 }
5302
5303 if (Args.hasArg(options::OPT_static)) {
5304 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005305 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005306 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005307// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005308 CmdArgs.push_back("-Bdynamic");
5309 if (Args.hasArg(options::OPT_shared)) {
5310 CmdArgs.push_back("-shared");
5311 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005312 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005313 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5314 }
5315 }
5316
Daniel Dunbarb440f562010-08-02 02:38:21 +00005317 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005318 CmdArgs.push_back("-o");
5319 CmdArgs.push_back(Output.getFilename());
5320 } else {
5321 assert(Output.isNothing() && "Invalid output.");
5322 }
5323
5324 if (!Args.hasArg(options::OPT_nostdlib) &&
5325 !Args.hasArg(options::OPT_nostartfiles)) {
5326 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005327 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005328 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005329 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005330 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005331 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005332 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005333 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005334 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005335 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005336 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005337 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005338 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005339 }
5340
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005341 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5342 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005343 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005344
5345 Args.AddAllArgs(CmdArgs, options::OPT_L);
5346 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5347 Args.AddAllArgs(CmdArgs, options::OPT_e);
5348
Daniel Dunbar54423b22010-09-17 00:24:54 +00005349 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005350
5351 if (!Args.hasArg(options::OPT_nostdlib) &&
5352 !Args.hasArg(options::OPT_nodefaultlibs)) {
5353 // FIXME: For some reason GCC passes -lgcc before adding
5354 // the default system libraries. Just mimic this for now.
5355 CmdArgs.push_back("-lgcc");
5356
5357 if (Args.hasArg(options::OPT_pthread))
5358 CmdArgs.push_back("-pthread");
5359 if (!Args.hasArg(options::OPT_shared))
5360 CmdArgs.push_back("-lc");
5361 CmdArgs.push_back("-lgcc");
5362 }
5363
5364 if (!Args.hasArg(options::OPT_nostdlib) &&
5365 !Args.hasArg(options::OPT_nostartfiles)) {
5366 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005367 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005368 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005369 }
5370
Bill Wendling08760582011-06-27 19:15:03 +00005371 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005372
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005373 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005374 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005375 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005376}
5377
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005378void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005379 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005380 const InputInfoList &Inputs,
5381 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005382 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005383 ArgStringList CmdArgs;
5384
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005385 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5386 // instruct as in the base system to assemble 32-bit code.
5387 if (getToolChain().getArch() == llvm::Triple::x86)
5388 CmdArgs.push_back("--32");
5389 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5390 CmdArgs.push_back("-mppc");
5391 CmdArgs.push_back("-many");
5392 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5393 getToolChain().getArch() == llvm::Triple::mips64el) {
5394 StringRef CPUName;
5395 StringRef ABIName;
5396 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5397
5398 CmdArgs.push_back("-mabi");
5399 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5400
5401 if (getToolChain().getArch() == llvm::Triple::mips64)
5402 CmdArgs.push_back("-EB");
5403 else
5404 CmdArgs.push_back("-EL");
5405
5406 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5407 options::OPT_fpic, options::OPT_fno_pic,
5408 options::OPT_fPIE, options::OPT_fno_PIE,
5409 options::OPT_fpie, options::OPT_fno_pie);
5410 if (LastPICArg &&
5411 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5412 LastPICArg->getOption().matches(options::OPT_fpic) ||
5413 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5414 LastPICArg->getOption().matches(options::OPT_fpie))) {
5415 CmdArgs.push_back("-KPIC");
5416 }
5417 }
5418
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005419 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5420 options::OPT_Xassembler);
5421
5422 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005423 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005424
5425 for (InputInfoList::const_iterator
5426 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5427 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005428 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005429 }
5430
5431 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005432 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005433 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005434}
5435
5436void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005437 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005438 const InputInfoList &Inputs,
5439 const ArgList &Args,
5440 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005441 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005442 ArgStringList CmdArgs;
5443
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005444 // Silence warning for "clang -g foo.o -o foo"
5445 Args.ClaimAllArgs(options::OPT_g_Group);
5446 // and "clang -emit-llvm foo.o -o foo"
5447 Args.ClaimAllArgs(options::OPT_emit_llvm);
5448 // and for "clang -w foo.o -o foo". Other warning options are already
5449 // handled somewhere else.
5450 Args.ClaimAllArgs(options::OPT_w);
5451
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005452 if (getToolChain().getArch() == llvm::Triple::mips64)
5453 CmdArgs.push_back("-EB");
5454 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5455 CmdArgs.push_back("-EL");
5456
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005457 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005458 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005459 CmdArgs.push_back("-e");
5460 CmdArgs.push_back("__start");
5461 }
5462
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005463 if (Args.hasArg(options::OPT_static)) {
5464 CmdArgs.push_back("-Bstatic");
5465 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005466 if (Args.hasArg(options::OPT_rdynamic))
5467 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005468 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005469 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005470 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005471 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005472 } else {
5473 CmdArgs.push_back("-dynamic-linker");
5474 CmdArgs.push_back("/usr/libexec/ld.so");
5475 }
5476 }
5477
Rafael Espindola044f7832013-06-05 04:28:55 +00005478 if (Args.hasArg(options::OPT_nopie))
5479 CmdArgs.push_back("-nopie");
5480
Daniel Dunbarb440f562010-08-02 02:38:21 +00005481 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005482 CmdArgs.push_back("-o");
5483 CmdArgs.push_back(Output.getFilename());
5484 } else {
5485 assert(Output.isNothing() && "Invalid output.");
5486 }
5487
5488 if (!Args.hasArg(options::OPT_nostdlib) &&
5489 !Args.hasArg(options::OPT_nostartfiles)) {
5490 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005491 if (Args.hasArg(options::OPT_pg))
5492 CmdArgs.push_back(Args.MakeArgString(
5493 getToolChain().GetFilePath("gcrt0.o")));
5494 else
5495 CmdArgs.push_back(Args.MakeArgString(
5496 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005497 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005498 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005499 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005500 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005501 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005502 }
5503 }
5504
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005505 std::string Triple = getToolChain().getTripleString();
5506 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005507 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005508 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005509 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005510
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005511 Args.AddAllArgs(CmdArgs, options::OPT_L);
5512 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5513 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005514 Args.AddAllArgs(CmdArgs, options::OPT_s);
5515 Args.AddAllArgs(CmdArgs, options::OPT_t);
5516 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5517 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005518
Daniel Dunbar54423b22010-09-17 00:24:54 +00005519 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005520
5521 if (!Args.hasArg(options::OPT_nostdlib) &&
5522 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005523 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005524 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005525 if (Args.hasArg(options::OPT_pg))
5526 CmdArgs.push_back("-lm_p");
5527 else
5528 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005529 }
5530
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005531 // FIXME: For some reason GCC passes -lgcc before adding
5532 // the default system libraries. Just mimic this for now.
5533 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005534
Eric Christopher17674ec2012-09-13 06:32:34 +00005535 if (Args.hasArg(options::OPT_pthread)) {
5536 if (!Args.hasArg(options::OPT_shared) &&
5537 Args.hasArg(options::OPT_pg))
5538 CmdArgs.push_back("-lpthread_p");
5539 else
5540 CmdArgs.push_back("-lpthread");
5541 }
5542
Chandler Carruth45661652011-12-17 22:32:42 +00005543 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005544 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005545 CmdArgs.push_back("-lc_p");
5546 else
5547 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005548 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005549
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005550 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005551 }
5552
5553 if (!Args.hasArg(options::OPT_nostdlib) &&
5554 !Args.hasArg(options::OPT_nostartfiles)) {
5555 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005556 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005557 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005558 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005559 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005560 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005561 }
5562
5563 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005564 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005565 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005566}
Ed Schoutene33194b2009-04-02 19:13:12 +00005567
Eli Friedman9fa28852012-08-08 23:57:20 +00005568void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5569 const InputInfo &Output,
5570 const InputInfoList &Inputs,
5571 const ArgList &Args,
5572 const char *LinkingOutput) const {
5573 ArgStringList CmdArgs;
5574
5575 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5576 options::OPT_Xassembler);
5577
5578 CmdArgs.push_back("-o");
5579 CmdArgs.push_back(Output.getFilename());
5580
5581 for (InputInfoList::const_iterator
5582 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5583 const InputInfo &II = *it;
5584 CmdArgs.push_back(II.getFilename());
5585 }
5586
5587 const char *Exec =
5588 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5589 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5590}
5591
5592void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5593 const InputInfo &Output,
5594 const InputInfoList &Inputs,
5595 const ArgList &Args,
5596 const char *LinkingOutput) const {
5597 const Driver &D = getToolChain().getDriver();
5598 ArgStringList CmdArgs;
5599
5600 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5601 (!Args.hasArg(options::OPT_shared))) {
5602 CmdArgs.push_back("-e");
5603 CmdArgs.push_back("__start");
5604 }
5605
5606 if (Args.hasArg(options::OPT_static)) {
5607 CmdArgs.push_back("-Bstatic");
5608 } else {
5609 if (Args.hasArg(options::OPT_rdynamic))
5610 CmdArgs.push_back("-export-dynamic");
5611 CmdArgs.push_back("--eh-frame-hdr");
5612 CmdArgs.push_back("-Bdynamic");
5613 if (Args.hasArg(options::OPT_shared)) {
5614 CmdArgs.push_back("-shared");
5615 } else {
5616 CmdArgs.push_back("-dynamic-linker");
5617 CmdArgs.push_back("/usr/libexec/ld.so");
5618 }
5619 }
5620
5621 if (Output.isFilename()) {
5622 CmdArgs.push_back("-o");
5623 CmdArgs.push_back(Output.getFilename());
5624 } else {
5625 assert(Output.isNothing() && "Invalid output.");
5626 }
5627
5628 if (!Args.hasArg(options::OPT_nostdlib) &&
5629 !Args.hasArg(options::OPT_nostartfiles)) {
5630 if (!Args.hasArg(options::OPT_shared)) {
5631 if (Args.hasArg(options::OPT_pg))
5632 CmdArgs.push_back(Args.MakeArgString(
5633 getToolChain().GetFilePath("gcrt0.o")));
5634 else
5635 CmdArgs.push_back(Args.MakeArgString(
5636 getToolChain().GetFilePath("crt0.o")));
5637 CmdArgs.push_back(Args.MakeArgString(
5638 getToolChain().GetFilePath("crtbegin.o")));
5639 } else {
5640 CmdArgs.push_back(Args.MakeArgString(
5641 getToolChain().GetFilePath("crtbeginS.o")));
5642 }
5643 }
5644
5645 Args.AddAllArgs(CmdArgs, options::OPT_L);
5646 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5647 Args.AddAllArgs(CmdArgs, options::OPT_e);
5648
5649 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5650
5651 if (!Args.hasArg(options::OPT_nostdlib) &&
5652 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005653 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005654 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5655 if (Args.hasArg(options::OPT_pg))
5656 CmdArgs.push_back("-lm_p");
5657 else
5658 CmdArgs.push_back("-lm");
5659 }
5660
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005661 if (Args.hasArg(options::OPT_pthread)) {
5662 if (!Args.hasArg(options::OPT_shared) &&
5663 Args.hasArg(options::OPT_pg))
5664 CmdArgs.push_back("-lpthread_p");
5665 else
5666 CmdArgs.push_back("-lpthread");
5667 }
5668
Eli Friedman9fa28852012-08-08 23:57:20 +00005669 if (!Args.hasArg(options::OPT_shared)) {
5670 if (Args.hasArg(options::OPT_pg))
5671 CmdArgs.push_back("-lc_p");
5672 else
5673 CmdArgs.push_back("-lc");
5674 }
5675
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005676 StringRef MyArch;
5677 switch (getToolChain().getTriple().getArch()) {
5678 case llvm::Triple::arm:
5679 MyArch = "arm";
5680 break;
5681 case llvm::Triple::x86:
5682 MyArch = "i386";
5683 break;
5684 case llvm::Triple::x86_64:
5685 MyArch = "amd64";
5686 break;
5687 default:
5688 llvm_unreachable("Unsupported architecture");
5689 }
5690 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005691 }
5692
5693 if (!Args.hasArg(options::OPT_nostdlib) &&
5694 !Args.hasArg(options::OPT_nostartfiles)) {
5695 if (!Args.hasArg(options::OPT_shared))
5696 CmdArgs.push_back(Args.MakeArgString(
5697 getToolChain().GetFilePath("crtend.o")));
5698 else
5699 CmdArgs.push_back(Args.MakeArgString(
5700 getToolChain().GetFilePath("crtendS.o")));
5701 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005702
5703 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005704 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005705 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005706}
5707
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005708void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005709 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005710 const InputInfoList &Inputs,
5711 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005712 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005713 ArgStringList CmdArgs;
5714
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005715 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5716 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005717 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005718 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005719 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005720 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005721 else if (getToolChain().getArch() == llvm::Triple::mips ||
5722 getToolChain().getArch() == llvm::Triple::mipsel ||
5723 getToolChain().getArch() == llvm::Triple::mips64 ||
5724 getToolChain().getArch() == llvm::Triple::mips64el) {
5725 StringRef CPUName;
5726 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005727 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005728
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005729 CmdArgs.push_back("-march");
5730 CmdArgs.push_back(CPUName.data());
5731
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005732 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005733 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005734
5735 if (getToolChain().getArch() == llvm::Triple::mips ||
5736 getToolChain().getArch() == llvm::Triple::mips64)
5737 CmdArgs.push_back("-EB");
5738 else
5739 CmdArgs.push_back("-EL");
5740
5741 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5742 options::OPT_fpic, options::OPT_fno_pic,
5743 options::OPT_fPIE, options::OPT_fno_PIE,
5744 options::OPT_fpie, options::OPT_fno_pie);
5745 if (LastPICArg &&
5746 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5747 LastPICArg->getOption().matches(options::OPT_fpic) ||
5748 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5749 LastPICArg->getOption().matches(options::OPT_fpie))) {
5750 CmdArgs.push_back("-KPIC");
5751 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005752 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5753 getToolChain().getArch() == llvm::Triple::thumb) {
5754 CmdArgs.push_back("-mfpu=softvfp");
5755 switch(getToolChain().getTriple().getEnvironment()) {
5756 case llvm::Triple::GNUEABI:
5757 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005758 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005759 break;
5760
5761 default:
5762 CmdArgs.push_back("-matpcs");
5763 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00005764 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00005765 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky47f4ff82014-01-02 15:13:18 +00005766 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5767 options::OPT_fpic, options::OPT_fno_pic,
5768 options::OPT_fPIE, options::OPT_fno_PIE,
5769 options::OPT_fpie, options::OPT_fno_pie);
5770 if (LastPICArg &&
5771 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5772 LastPICArg->getOption().matches(options::OPT_fpic) ||
5773 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5774 LastPICArg->getOption().matches(options::OPT_fpie))) {
5775 CmdArgs.push_back("-KPIC");
5776 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005777 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005778
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005779 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5780 options::OPT_Xassembler);
5781
5782 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005783 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005784
5785 for (InputInfoList::const_iterator
5786 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5787 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005788 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005789 }
5790
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005791 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005792 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005793 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005794}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005795
5796void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005797 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005798 const InputInfoList &Inputs,
5799 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005800 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005801 const toolchains::FreeBSD& ToolChain =
5802 static_cast<const toolchains::FreeBSD&>(getToolChain());
5803 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005804 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005805
5806 // Silence warning for "clang -g foo.o -o foo"
5807 Args.ClaimAllArgs(options::OPT_g_Group);
5808 // and "clang -emit-llvm foo.o -o foo"
5809 Args.ClaimAllArgs(options::OPT_emit_llvm);
5810 // and for "clang -w foo.o -o foo". Other warning options are already
5811 // handled somewhere else.
5812 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005813
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005814 if (!D.SysRoot.empty())
5815 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5816
Roman Divackyafe2f232012-08-28 15:09:03 +00005817 if (Args.hasArg(options::OPT_pie))
5818 CmdArgs.push_back("-pie");
5819
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005820 if (Args.hasArg(options::OPT_static)) {
5821 CmdArgs.push_back("-Bstatic");
5822 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005823 if (Args.hasArg(options::OPT_rdynamic))
5824 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005825 CmdArgs.push_back("--eh-frame-hdr");
5826 if (Args.hasArg(options::OPT_shared)) {
5827 CmdArgs.push_back("-Bshareable");
5828 } else {
5829 CmdArgs.push_back("-dynamic-linker");
5830 CmdArgs.push_back("/libexec/ld-elf.so.1");
5831 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005832 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5833 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005834 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5835 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5836 CmdArgs.push_back("--hash-style=both");
5837 }
5838 }
5839 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005840 }
5841
5842 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5843 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005844 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005845 CmdArgs.push_back("-m");
5846 CmdArgs.push_back("elf_i386_fbsd");
5847 }
5848
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005849 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005850 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005851 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005852 }
5853
Daniel Dunbarb440f562010-08-02 02:38:21 +00005854 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005855 CmdArgs.push_back("-o");
5856 CmdArgs.push_back(Output.getFilename());
5857 } else {
5858 assert(Output.isNothing() && "Invalid output.");
5859 }
5860
5861 if (!Args.hasArg(options::OPT_nostdlib) &&
5862 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005863 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005864 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005865 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005866 crt1 = "gcrt1.o";
5867 else if (Args.hasArg(options::OPT_pie))
5868 crt1 = "Scrt1.o";
5869 else
5870 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005871 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005872 if (crt1)
5873 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5874
5875 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5876
5877 const char *crtbegin = NULL;
5878 if (Args.hasArg(options::OPT_static))
5879 crtbegin = "crtbeginT.o";
5880 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5881 crtbegin = "crtbeginS.o";
5882 else
5883 crtbegin = "crtbegin.o";
5884
5885 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005886 }
5887
5888 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005889 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005890 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5891 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005892 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005893 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5894 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005895 Args.AddAllArgs(CmdArgs, options::OPT_s);
5896 Args.AddAllArgs(CmdArgs, options::OPT_t);
5897 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5898 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005899
Alp Tokerce365ca2013-12-02 12:43:03 +00005900 if (D.IsUsingLTO(Args))
5901 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00005902
Roman Divackyafe2f232012-08-28 15:09:03 +00005903 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005904
5905 if (!Args.hasArg(options::OPT_nostdlib) &&
5906 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005907 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005908 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005909 if (Args.hasArg(options::OPT_pg))
5910 CmdArgs.push_back("-lm_p");
5911 else
5912 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005913 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005914 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5915 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005916 if (Args.hasArg(options::OPT_pg))
5917 CmdArgs.push_back("-lgcc_p");
5918 else
5919 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005920 if (Args.hasArg(options::OPT_static)) {
5921 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005922 } else if (Args.hasArg(options::OPT_pg)) {
5923 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005924 } else {
5925 CmdArgs.push_back("--as-needed");
5926 CmdArgs.push_back("-lgcc_s");
5927 CmdArgs.push_back("--no-as-needed");
5928 }
5929
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005930 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005931 if (Args.hasArg(options::OPT_pg))
5932 CmdArgs.push_back("-lpthread_p");
5933 else
5934 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005935 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005936
Roman Divacky66f22762011-02-10 16:59:40 +00005937 if (Args.hasArg(options::OPT_pg)) {
5938 if (Args.hasArg(options::OPT_shared))
5939 CmdArgs.push_back("-lc");
5940 else
5941 CmdArgs.push_back("-lc_p");
5942 CmdArgs.push_back("-lgcc_p");
5943 } else {
5944 CmdArgs.push_back("-lc");
5945 CmdArgs.push_back("-lgcc");
5946 }
5947
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005948 if (Args.hasArg(options::OPT_static)) {
5949 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005950 } else if (Args.hasArg(options::OPT_pg)) {
5951 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005952 } else {
5953 CmdArgs.push_back("--as-needed");
5954 CmdArgs.push_back("-lgcc_s");
5955 CmdArgs.push_back("--no-as-needed");
5956 }
5957 }
5958
5959 if (!Args.hasArg(options::OPT_nostdlib) &&
5960 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005961 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005962 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005963 else
5964 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005965 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005966 }
5967
Roman Divackyafe2f232012-08-28 15:09:03 +00005968 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005969
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005970 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005971 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005972 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005973}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005974
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005975void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5976 const InputInfo &Output,
5977 const InputInfoList &Inputs,
5978 const ArgList &Args,
5979 const char *LinkingOutput) const {
5980 ArgStringList CmdArgs;
5981
5982 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5983 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005984 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005985 CmdArgs.push_back("--32");
5986
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00005987 // Pass the target CPU to GNU as for ARM, since the source code might
5988 // not have the correct .cpu annotation.
5989 if (getToolChain().getArch() == llvm::Triple::arm) {
Bernard Ogden31561762013-12-12 13:27:11 +00005990 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00005991 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
5992 }
5993
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00005994 if (getToolChain().getArch() == llvm::Triple::mips ||
5995 getToolChain().getArch() == llvm::Triple::mipsel ||
5996 getToolChain().getArch() == llvm::Triple::mips64 ||
5997 getToolChain().getArch() == llvm::Triple::mips64el) {
5998 StringRef CPUName;
5999 StringRef ABIName;
6000 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6001
6002 CmdArgs.push_back("-march");
6003 CmdArgs.push_back(CPUName.data());
6004
6005 CmdArgs.push_back("-mabi");
6006 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6007
6008 if (getToolChain().getArch() == llvm::Triple::mips ||
6009 getToolChain().getArch() == llvm::Triple::mips64)
6010 CmdArgs.push_back("-EB");
6011 else
6012 CmdArgs.push_back("-EL");
6013
6014 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6015 options::OPT_fpic, options::OPT_fno_pic,
6016 options::OPT_fPIE, options::OPT_fno_PIE,
6017 options::OPT_fpie, options::OPT_fno_pie);
6018 if (LastPICArg &&
6019 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6020 LastPICArg->getOption().matches(options::OPT_fpic) ||
6021 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6022 LastPICArg->getOption().matches(options::OPT_fpie))) {
6023 CmdArgs.push_back("-KPIC");
6024 }
6025 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006026
6027 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6028 options::OPT_Xassembler);
6029
6030 CmdArgs.push_back("-o");
6031 CmdArgs.push_back(Output.getFilename());
6032
6033 for (InputInfoList::const_iterator
6034 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6035 const InputInfo &II = *it;
6036 CmdArgs.push_back(II.getFilename());
6037 }
6038
David Chisnallddbd68f2011-09-27 22:03:18 +00006039 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006040 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6041}
6042
6043void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6044 const InputInfo &Output,
6045 const InputInfoList &Inputs,
6046 const ArgList &Args,
6047 const char *LinkingOutput) const {
6048 const Driver &D = getToolChain().getDriver();
6049 ArgStringList CmdArgs;
6050
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006051 if (!D.SysRoot.empty())
6052 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6053
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006054 if (Args.hasArg(options::OPT_static)) {
6055 CmdArgs.push_back("-Bstatic");
6056 } else {
6057 if (Args.hasArg(options::OPT_rdynamic))
6058 CmdArgs.push_back("-export-dynamic");
6059 CmdArgs.push_back("--eh-frame-hdr");
6060 if (Args.hasArg(options::OPT_shared)) {
6061 CmdArgs.push_back("-Bshareable");
6062 } else {
6063 CmdArgs.push_back("-dynamic-linker");
6064 CmdArgs.push_back("/libexec/ld.elf_so");
6065 }
6066 }
6067
6068 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6069 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006070 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006071 CmdArgs.push_back("-m");
6072 CmdArgs.push_back("elf_i386");
6073 }
6074
6075 if (Output.isFilename()) {
6076 CmdArgs.push_back("-o");
6077 CmdArgs.push_back(Output.getFilename());
6078 } else {
6079 assert(Output.isNothing() && "Invalid output.");
6080 }
6081
6082 if (!Args.hasArg(options::OPT_nostdlib) &&
6083 !Args.hasArg(options::OPT_nostartfiles)) {
6084 if (!Args.hasArg(options::OPT_shared)) {
6085 CmdArgs.push_back(Args.MakeArgString(
6086 getToolChain().GetFilePath("crt0.o")));
6087 CmdArgs.push_back(Args.MakeArgString(
6088 getToolChain().GetFilePath("crti.o")));
6089 CmdArgs.push_back(Args.MakeArgString(
6090 getToolChain().GetFilePath("crtbegin.o")));
6091 } else {
6092 CmdArgs.push_back(Args.MakeArgString(
6093 getToolChain().GetFilePath("crti.o")));
6094 CmdArgs.push_back(Args.MakeArgString(
6095 getToolChain().GetFilePath("crtbeginS.o")));
6096 }
6097 }
6098
6099 Args.AddAllArgs(CmdArgs, options::OPT_L);
6100 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6101 Args.AddAllArgs(CmdArgs, options::OPT_e);
6102 Args.AddAllArgs(CmdArgs, options::OPT_s);
6103 Args.AddAllArgs(CmdArgs, options::OPT_t);
6104 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6105 Args.AddAllArgs(CmdArgs, options::OPT_r);
6106
6107 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6108
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006109 unsigned Major, Minor, Micro;
6110 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6111 bool useLibgcc = true;
6112 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006113 switch(getToolChain().getArch()) {
6114 case llvm::Triple::x86:
6115 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006116 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006117 break;
6118 default:
6119 break;
6120 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006121 }
6122
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006123 if (!Args.hasArg(options::OPT_nostdlib) &&
6124 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006125 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006126 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6127 CmdArgs.push_back("-lm");
6128 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006129 if (Args.hasArg(options::OPT_pthread))
6130 CmdArgs.push_back("-lpthread");
6131 CmdArgs.push_back("-lc");
6132
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006133 if (useLibgcc) {
6134 if (Args.hasArg(options::OPT_static)) {
6135 // libgcc_eh depends on libc, so resolve as much as possible,
6136 // pull in any new requirements from libc and then get the rest
6137 // of libgcc.
6138 CmdArgs.push_back("-lgcc_eh");
6139 CmdArgs.push_back("-lc");
6140 CmdArgs.push_back("-lgcc");
6141 } else {
6142 CmdArgs.push_back("-lgcc");
6143 CmdArgs.push_back("--as-needed");
6144 CmdArgs.push_back("-lgcc_s");
6145 CmdArgs.push_back("--no-as-needed");
6146 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006147 }
6148 }
6149
6150 if (!Args.hasArg(options::OPT_nostdlib) &&
6151 !Args.hasArg(options::OPT_nostartfiles)) {
6152 if (!Args.hasArg(options::OPT_shared))
6153 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6154 "crtend.o")));
6155 else
6156 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6157 "crtendS.o")));
6158 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6159 "crtn.o")));
6160 }
6161
Bill Wendling08760582011-06-27 19:15:03 +00006162 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006163
Rafael Espindola236db462013-11-09 20:07:19 +00006164 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006165 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6166}
6167
Thomas Schwinge4e555262013-03-28 19:04:25 +00006168void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6169 const InputInfo &Output,
6170 const InputInfoList &Inputs,
6171 const ArgList &Args,
6172 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006173 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006174 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006175
6176 // Add --32/--64 to make sure we get the format we want.
6177 // This is incomplete
6178 if (getToolChain().getArch() == llvm::Triple::x86) {
6179 CmdArgs.push_back("--32");
6180 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6181 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006182 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6183 CmdArgs.push_back("-a32");
6184 CmdArgs.push_back("-mppc");
6185 CmdArgs.push_back("-many");
6186 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6187 CmdArgs.push_back("-a64");
6188 CmdArgs.push_back("-mppc64");
6189 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006190 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6191 CmdArgs.push_back("-a64");
6192 CmdArgs.push_back("-mppc64le");
6193 CmdArgs.push_back("-many");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006194 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6195 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006196 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006197 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006198 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6199 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006200 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006201 NeedsKPIC = true;
Rafael Espindola92b00932010-08-10 00:25:48 +00006202 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006203 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006204 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6205 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006206 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6207 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006208
Tim Northover9c7e0352013-12-12 11:55:52 +00006209 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6210 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006211 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006212
6213 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006214
6215 // FIXME: remove krait check when GNU tools support krait cpu
6216 // for now replace it with -march=armv7-a to avoid a lower
6217 // march from being picked in the absence of a cpu flag.
6218 Arg *A;
6219 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6220 StringRef(A->getValue()) == "krait")
6221 CmdArgs.push_back("-march=armv7-a");
6222 else
6223 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006224 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006225 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6226 getToolChain().getArch() == llvm::Triple::mipsel ||
6227 getToolChain().getArch() == llvm::Triple::mips64 ||
6228 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006229 StringRef CPUName;
6230 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006231 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006232
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006233 CmdArgs.push_back("-march");
6234 CmdArgs.push_back(CPUName.data());
6235
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006236 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006237 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006238
6239 if (getToolChain().getArch() == llvm::Triple::mips ||
6240 getToolChain().getArch() == llvm::Triple::mips64)
6241 CmdArgs.push_back("-EB");
6242 else
6243 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006244
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006245 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6246 if (StringRef(A->getValue()) == "2008")
6247 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6248 }
6249
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006250 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006251 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6252 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6253 options::OPT_mno_micromips);
6254 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6255 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6256
Simon Atanasyanbd986632013-11-26 11:58:04 +00006257 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6258 // Do not use AddLastArg because not all versions of MIPS assembler
6259 // support -mmsa / -mno-msa options.
6260 if (A->getOption().matches(options::OPT_mmsa))
6261 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6262 }
6263
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006264 NeedsKPIC = true;
6265 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6266 // Always pass an -march option, since our default of z10 is later
6267 // than the GNU assembler's default.
6268 StringRef CPUName = getSystemZTargetCPU(Args);
6269 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6270 }
6271
6272 if (NeedsKPIC) {
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006273 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6274 options::OPT_fpic, options::OPT_fno_pic,
6275 options::OPT_fPIE, options::OPT_fno_PIE,
6276 options::OPT_fpie, options::OPT_fno_pie);
6277 if (LastPICArg &&
6278 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6279 LastPICArg->getOption().matches(options::OPT_fpic) ||
6280 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6281 LastPICArg->getOption().matches(options::OPT_fpie))) {
6282 CmdArgs.push_back("-KPIC");
6283 }
Rafael Espindola92b00932010-08-10 00:25:48 +00006284 }
6285
6286 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6287 options::OPT_Xassembler);
6288
6289 CmdArgs.push_back("-o");
6290 CmdArgs.push_back(Output.getFilename());
6291
6292 for (InputInfoList::const_iterator
6293 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6294 const InputInfo &II = *it;
6295 CmdArgs.push_back(II.getFilename());
6296 }
6297
6298 const char *Exec =
6299 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6300 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006301
6302 // Handle the debug info splitting at object creation time if we're
6303 // creating an object.
6304 // TODO: Currently only works on linux with newer objcopy.
6305 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006306 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006307 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6308 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006309}
6310
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006311static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6312 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006313 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006314 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6315 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006316 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006317 CmdArgs.push_back("-lgcc");
6318
Logan Chien3d3373c2012-11-19 12:04:11 +00006319 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006320 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006321 CmdArgs.push_back("-lgcc");
6322 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006323 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006324 CmdArgs.push_back("--as-needed");
6325 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006326 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006327 CmdArgs.push_back("--no-as-needed");
6328 }
6329
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006330 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006331 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006332 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006333 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006334
6335 // According to Android ABI, we have to link with libdl if we are
6336 // linking with non-static libgcc.
6337 //
6338 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6339 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6340 if (isAndroid && !StaticLibgcc)
6341 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006342}
6343
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006344static bool hasMipsN32ABIArg(const ArgList &Args) {
6345 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006346 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006347}
6348
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006349static StringRef getLinuxDynamicLinker(const ArgList &Args,
6350 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006351 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6352 if (ToolChain.getTriple().isArch64Bit())
6353 return "/system/bin/linker64";
6354 else
6355 return "/system/bin/linker";
6356 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6357 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006358 return "/lib/ld-linux.so.2";
6359 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6360 return "/lib/ld-linux-aarch64.so.1";
6361 else if (ToolChain.getArch() == llvm::Triple::arm ||
6362 ToolChain.getArch() == llvm::Triple::thumb) {
6363 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6364 return "/lib/ld-linux-armhf.so.3";
6365 else
6366 return "/lib/ld-linux.so.3";
6367 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6368 ToolChain.getArch() == llvm::Triple::mipsel)
6369 return "/lib/ld.so.1";
6370 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6371 ToolChain.getArch() == llvm::Triple::mips64el) {
6372 if (hasMipsN32ABIArg(Args))
6373 return "/lib32/ld.so.1";
6374 else
6375 return "/lib64/ld.so.1";
6376 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6377 return "/lib/ld.so.1";
6378 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006379 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006380 ToolChain.getArch() == llvm::Triple::systemz)
6381 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006382 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6383 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006384 else
6385 return "/lib64/ld-linux-x86-64.so.2";
6386}
6387
Thomas Schwinge4e555262013-03-28 19:04:25 +00006388void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6389 const InputInfo &Output,
6390 const InputInfoList &Inputs,
6391 const ArgList &Args,
6392 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006393 const toolchains::Linux& ToolChain =
6394 static_cast<const toolchains::Linux&>(getToolChain());
6395 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006396 const bool isAndroid =
6397 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006398 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006399 const bool IsPIE =
6400 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006401 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006402
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006403 ArgStringList CmdArgs;
6404
Rafael Espindolad1002f62010-11-15 18:28:16 +00006405 // Silence warning for "clang -g foo.o -o foo"
6406 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006407 // and "clang -emit-llvm foo.o -o foo"
6408 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006409 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006410 // handled somewhere else.
6411 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006412
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006413 if (!D.SysRoot.empty())
6414 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006415
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006416 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006417 CmdArgs.push_back("-pie");
6418
Rafael Espindola1c76c592010-11-07 22:57:16 +00006419 if (Args.hasArg(options::OPT_rdynamic))
6420 CmdArgs.push_back("-export-dynamic");
6421
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006422 if (Args.hasArg(options::OPT_s))
6423 CmdArgs.push_back("-s");
6424
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006425 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6426 e = ToolChain.ExtraOpts.end();
6427 i != e; ++i)
6428 CmdArgs.push_back(i->c_str());
6429
6430 if (!Args.hasArg(options::OPT_static)) {
6431 CmdArgs.push_back("--eh-frame-hdr");
6432 }
6433
6434 CmdArgs.push_back("-m");
6435 if (ToolChain.getArch() == llvm::Triple::x86)
6436 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006437 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6438 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006439 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006440 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006441 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006442 else if (ToolChain.getArch() == llvm::Triple::ppc)
6443 CmdArgs.push_back("elf32ppclinux");
6444 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6445 CmdArgs.push_back("elf64ppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00006446 else if (ToolChain.getArch() == llvm::Triple::sparc)
6447 CmdArgs.push_back("elf32_sparc");
6448 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6449 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006450 else if (ToolChain.getArch() == llvm::Triple::mips)
6451 CmdArgs.push_back("elf32btsmip");
6452 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6453 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006454 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6455 if (hasMipsN32ABIArg(Args))
6456 CmdArgs.push_back("elf32btsmipn32");
6457 else
6458 CmdArgs.push_back("elf64btsmip");
6459 }
6460 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6461 if (hasMipsN32ABIArg(Args))
6462 CmdArgs.push_back("elf32ltsmipn32");
6463 else
6464 CmdArgs.push_back("elf64ltsmip");
6465 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006466 else if (ToolChain.getArch() == llvm::Triple::systemz)
6467 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006468 else
6469 CmdArgs.push_back("elf_x86_64");
6470
6471 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006472 if (ToolChain.getArch() == llvm::Triple::arm
6473 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006474 CmdArgs.push_back("-Bstatic");
6475 else
6476 CmdArgs.push_back("-static");
6477 } else if (Args.hasArg(options::OPT_shared)) {
6478 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006479 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006480 CmdArgs.push_back("-Bsymbolic");
6481 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006482 }
6483
6484 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006485 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006486 (!Args.hasArg(options::OPT_static) &&
6487 !Args.hasArg(options::OPT_shared))) {
6488 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006489 CmdArgs.push_back(Args.MakeArgString(
6490 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006491 }
6492
6493 CmdArgs.push_back("-o");
6494 CmdArgs.push_back(Output.getFilename());
6495
Rafael Espindola81937ec2010-12-01 01:52:43 +00006496 if (!Args.hasArg(options::OPT_nostdlib) &&
6497 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006498 if (!isAndroid) {
6499 const char *crt1 = NULL;
6500 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006501 if (Args.hasArg(options::OPT_pg))
6502 crt1 = "gcrt1.o";
6503 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006504 crt1 = "Scrt1.o";
6505 else
6506 crt1 = "crt1.o";
6507 }
6508 if (crt1)
6509 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006510
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006511 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6512 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006513
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006514 const char *crtbegin;
6515 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006516 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006517 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006518 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006519 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006520 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006521 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006522 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006523 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006524
6525 // Add crtfastmath.o if available and fast math is enabled.
6526 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006527 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006528
6529 Args.AddAllArgs(CmdArgs, options::OPT_L);
6530
6531 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6532
Roman Divackyee8188a2011-03-01 17:53:14 +00006533 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6534 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006535 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006536
Alp Tokerce365ca2013-12-02 12:43:03 +00006537 if (D.IsUsingLTO(Args))
6538 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006539
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006540 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6541 CmdArgs.push_back("--no-demangle");
6542
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006543 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6544
Eric Christopher04997782012-11-29 18:51:05 +00006545 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006546 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006547 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006548 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006549 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006550 if (Sanitize.needsAsanRt())
6551 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6552 if (Sanitize.needsTsanRt())
6553 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006554 if (Sanitize.needsMsanRt())
6555 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006556 if (Sanitize.needsLsanRt())
6557 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006558 if (Sanitize.needsDfsanRt())
6559 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006560
Chandler Carruthe4458b32013-06-24 09:38:45 +00006561 // The profile runtime also needs access to system libraries.
6562 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6563
Hans Wennborg70850d82013-07-18 20:29:38 +00006564 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006565 !Args.hasArg(options::OPT_nostdlib) &&
6566 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006567 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6568 !Args.hasArg(options::OPT_static);
6569 if (OnlyLibstdcxxStatic)
6570 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006571 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006572 if (OnlyLibstdcxxStatic)
6573 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006574 CmdArgs.push_back("-lm");
6575 }
6576
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006577 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006578 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6579 if (Args.hasArg(options::OPT_static))
6580 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006581
Chandler Carruth01538002013-01-17 13:19:29 +00006582 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6583 if (OpenMP) {
6584 CmdArgs.push_back("-lgomp");
6585
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006586 // FIXME: Exclude this for platforms with libgomp that don't require
6587 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006588 CmdArgs.push_back("-lrt");
6589 }
6590
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006591 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006592
Chandler Carruth94a32012012-05-14 18:31:18 +00006593 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006594 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006595 CmdArgs.push_back("-lpthread");
6596
6597 CmdArgs.push_back("-lc");
6598
6599 if (Args.hasArg(options::OPT_static))
6600 CmdArgs.push_back("--end-group");
6601 else
6602 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6603 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006604
Rafael Espindola81937ec2010-12-01 01:52:43 +00006605 if (!Args.hasArg(options::OPT_nostartfiles)) {
6606 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006607 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006608 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006609 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006610 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006611 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006612 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006613
Rafael Espindola81937ec2010-12-01 01:52:43 +00006614 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006615 if (!isAndroid)
6616 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006617 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006618 }
6619
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006620 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6621}
Rafael Espindola92b00932010-08-10 00:25:48 +00006622
Chris Lattner3e2ee142010-07-07 16:01:42 +00006623void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006624 const InputInfo &Output,
6625 const InputInfoList &Inputs,
6626 const ArgList &Args,
6627 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006628 ArgStringList CmdArgs;
6629
6630 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6631 options::OPT_Xassembler);
6632
6633 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006634 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006635
6636 for (InputInfoList::const_iterator
6637 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6638 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006639 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006640 }
6641
6642 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006643 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006644 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006645}
6646
6647void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006648 const InputInfo &Output,
6649 const InputInfoList &Inputs,
6650 const ArgList &Args,
6651 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006652 const Driver &D = getToolChain().getDriver();
6653 ArgStringList CmdArgs;
6654
Daniel Dunbarb440f562010-08-02 02:38:21 +00006655 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006656 CmdArgs.push_back("-o");
6657 CmdArgs.push_back(Output.getFilename());
6658 } else {
6659 assert(Output.isNothing() && "Invalid output.");
6660 }
6661
6662 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006663 !Args.hasArg(options::OPT_nostartfiles)) {
6664 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6665 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6666 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6667 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6668 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006669
6670 Args.AddAllArgs(CmdArgs, options::OPT_L);
6671 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6672 Args.AddAllArgs(CmdArgs, options::OPT_e);
6673
Daniel Dunbar54423b22010-09-17 00:24:54 +00006674 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006675
Eli Friedman83de5132011-12-08 23:54:21 +00006676 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6677
Chris Lattner3e2ee142010-07-07 16:01:42 +00006678 if (!Args.hasArg(options::OPT_nostdlib) &&
6679 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006680 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006681 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006682 CmdArgs.push_back("-lm");
6683 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006684 }
6685
6686 if (!Args.hasArg(options::OPT_nostdlib) &&
6687 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006688 if (Args.hasArg(options::OPT_pthread))
6689 CmdArgs.push_back("-lpthread");
6690 CmdArgs.push_back("-lc");
6691 CmdArgs.push_back("-lCompilerRT-Generic");
6692 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6693 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006694 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006695 }
6696
Rafael Espindola236db462013-11-09 20:07:19 +00006697 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006698 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006699}
6700
Daniel Dunbarcc912342009-05-02 18:28:39 +00006701/// DragonFly Tools
6702
6703// For now, DragonFly Assemble does just about the same as for
6704// FreeBSD, but this may change soon.
6705void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006706 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006707 const InputInfoList &Inputs,
6708 const ArgList &Args,
6709 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006710 ArgStringList CmdArgs;
6711
6712 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6713 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006714 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006715 CmdArgs.push_back("--32");
6716
6717 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6718 options::OPT_Xassembler);
6719
6720 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006721 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006722
6723 for (InputInfoList::const_iterator
6724 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6725 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006726 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006727 }
6728
6729 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006730 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006731 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006732}
6733
6734void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006735 const InputInfo &Output,
6736 const InputInfoList &Inputs,
6737 const ArgList &Args,
6738 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006739 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006740 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006741 ArgStringList CmdArgs;
6742
John McCall65b8da02013-04-11 22:55:55 +00006743 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6744 UseGCC47 = false;
6745
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006746 if (!D.SysRoot.empty())
6747 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6748
John McCall65b8da02013-04-11 22:55:55 +00006749 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006750 if (Args.hasArg(options::OPT_static)) {
6751 CmdArgs.push_back("-Bstatic");
6752 } else {
John McCall65b8da02013-04-11 22:55:55 +00006753 if (Args.hasArg(options::OPT_rdynamic))
6754 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006755 if (Args.hasArg(options::OPT_shared))
6756 CmdArgs.push_back("-Bshareable");
6757 else {
6758 CmdArgs.push_back("-dynamic-linker");
6759 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6760 }
John McCall65b8da02013-04-11 22:55:55 +00006761 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006762 }
6763
6764 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6765 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006766 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006767 CmdArgs.push_back("-m");
6768 CmdArgs.push_back("elf_i386");
6769 }
6770
Daniel Dunbarb440f562010-08-02 02:38:21 +00006771 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006772 CmdArgs.push_back("-o");
6773 CmdArgs.push_back(Output.getFilename());
6774 } else {
6775 assert(Output.isNothing() && "Invalid output.");
6776 }
6777
6778 if (!Args.hasArg(options::OPT_nostdlib) &&
6779 !Args.hasArg(options::OPT_nostartfiles)) {
6780 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006781 if (Args.hasArg(options::OPT_pg))
6782 CmdArgs.push_back(Args.MakeArgString(
6783 getToolChain().GetFilePath("gcrt1.o")));
6784 else {
6785 if (Args.hasArg(options::OPT_pie))
6786 CmdArgs.push_back(Args.MakeArgString(
6787 getToolChain().GetFilePath("Scrt1.o")));
6788 else
6789 CmdArgs.push_back(Args.MakeArgString(
6790 getToolChain().GetFilePath("crt1.o")));
6791 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006792 }
John McCall65b8da02013-04-11 22:55:55 +00006793 CmdArgs.push_back(Args.MakeArgString(
6794 getToolChain().GetFilePath("crti.o")));
6795 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6796 CmdArgs.push_back(Args.MakeArgString(
6797 getToolChain().GetFilePath("crtbeginS.o")));
6798 else
6799 CmdArgs.push_back(Args.MakeArgString(
6800 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006801 }
6802
6803 Args.AddAllArgs(CmdArgs, options::OPT_L);
6804 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6805 Args.AddAllArgs(CmdArgs, options::OPT_e);
6806
Daniel Dunbar54423b22010-09-17 00:24:54 +00006807 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006808
6809 if (!Args.hasArg(options::OPT_nostdlib) &&
6810 !Args.hasArg(options::OPT_nodefaultlibs)) {
6811 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6812 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006813 if (UseGCC47)
6814 CmdArgs.push_back("-L/usr/lib/gcc47");
6815 else
6816 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006817
6818 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006819 if (UseGCC47) {
6820 CmdArgs.push_back("-rpath");
6821 CmdArgs.push_back("/usr/lib/gcc47");
6822 } else {
6823 CmdArgs.push_back("-rpath");
6824 CmdArgs.push_back("/usr/lib/gcc44");
6825 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006826 }
6827
Hans Wennborg70850d82013-07-18 20:29:38 +00006828 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006829 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006830 CmdArgs.push_back("-lm");
6831 }
6832
Daniel Dunbarcc912342009-05-02 18:28:39 +00006833 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006834 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006835
6836 if (!Args.hasArg(options::OPT_nolibc)) {
6837 CmdArgs.push_back("-lc");
6838 }
6839
John McCall65b8da02013-04-11 22:55:55 +00006840 if (UseGCC47) {
6841 if (Args.hasArg(options::OPT_static) ||
6842 Args.hasArg(options::OPT_static_libgcc)) {
6843 CmdArgs.push_back("-lgcc");
6844 CmdArgs.push_back("-lgcc_eh");
6845 } else {
6846 if (Args.hasArg(options::OPT_shared_libgcc)) {
6847 CmdArgs.push_back("-lgcc_pic");
6848 if (!Args.hasArg(options::OPT_shared))
6849 CmdArgs.push_back("-lgcc");
6850 } else {
6851 CmdArgs.push_back("-lgcc");
6852 CmdArgs.push_back("--as-needed");
6853 CmdArgs.push_back("-lgcc_pic");
6854 CmdArgs.push_back("--no-as-needed");
6855 }
6856 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006857 } else {
John McCall65b8da02013-04-11 22:55:55 +00006858 if (Args.hasArg(options::OPT_shared)) {
6859 CmdArgs.push_back("-lgcc_pic");
6860 } else {
6861 CmdArgs.push_back("-lgcc");
6862 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006863 }
6864 }
6865
6866 if (!Args.hasArg(options::OPT_nostdlib) &&
6867 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006868 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006869 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006870 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006871 else
6872 CmdArgs.push_back(Args.MakeArgString(
6873 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006874 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006875 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006876 }
6877
Bill Wendling08760582011-06-27 19:15:03 +00006878 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006879
Daniel Dunbarcc912342009-05-02 18:28:39 +00006880 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006881 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006882 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006883}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006884
6885void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6886 const InputInfo &Output,
6887 const InputInfoList &Inputs,
6888 const ArgList &Args,
6889 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006890 ArgStringList CmdArgs;
6891
6892 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006893 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6894 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006895 } else {
6896 assert(Output.isNothing() && "Invalid output.");
6897 }
6898
6899 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006900 !Args.hasArg(options::OPT_nostartfiles) &&
6901 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006902 CmdArgs.push_back("-defaultlib:libcmt");
6903 }
6904
6905 CmdArgs.push_back("-nologo");
6906
Hans Wennborgf1a74252013-09-10 20:18:04 +00006907 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6908
6909 if (DLL) {
6910 CmdArgs.push_back(Args.MakeArgString("-dll"));
6911
6912 SmallString<128> ImplibName(Output.getFilename());
6913 llvm::sys::path::replace_extension(ImplibName, "lib");
6914 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6915 ImplibName.str()));
6916 }
6917
Peter Collingbourne32701642013-11-01 18:16:25 +00006918 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006919 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006920 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006921 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006922 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6923 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006924 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006925 } else {
6926 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6927 }
6928 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006929 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6930 }
6931
Michael J. Spencere2f49362012-06-18 16:56:04 +00006932 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006933 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006934
6935 // Add filenames immediately.
6936 for (InputInfoList::const_iterator
6937 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6938 if (it->isFilename())
6939 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006940 else
6941 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006942 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006943
6944 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006945 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006946 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6947}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006948
6949void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6950 const InputInfo &Output,
6951 const InputInfoList &Inputs,
6952 const ArgList &Args,
6953 const char *LinkingOutput) const {
6954 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6955}
6956
Hans Wennborg188382e2013-09-20 18:16:35 +00006957// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6958// If one cannot be found, return FallbackName.
6959// We do this special search to prevent clang-cl from falling back onto itself
6960// if it's available as cl.exe on the path.
6961static std::string FindFallback(const char *FallbackName,
6962 const char *ClangProgramPath) {
6963 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6964 if (!OptPath.hasValue())
6965 return FallbackName;
6966
6967#ifdef LLVM_ON_WIN32
6968 const StringRef PathSeparators = ";";
6969#else
6970 const StringRef PathSeparators = ":";
6971#endif
6972
6973 SmallVector<StringRef, 8> PathSegments;
6974 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6975
6976 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6977 const StringRef &PathSegment = PathSegments[i];
6978 if (PathSegment.empty())
6979 continue;
6980
6981 SmallString<128> FilePath(PathSegment);
6982 llvm::sys::path::append(FilePath, FallbackName);
6983 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6984 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6985 return FilePath.str();
6986 }
6987
6988 return FallbackName;
6989}
6990
Hans Wennborg87cfa712013-09-19 20:32:16 +00006991Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6992 const InputInfo &Output,
6993 const InputInfoList &Inputs,
6994 const ArgList &Args,
6995 const char *LinkingOutput) const {
6996 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00006997 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00006998 CmdArgs.push_back("/c"); // Compile only.
6999 CmdArgs.push_back("/W0"); // No warnings.
7000
7001 // The goal is to be able to invoke this tool correctly based on
7002 // any flag accepted by clang-cl.
7003
7004 // These are spelled the same way in clang and cl.exe,.
7005 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7006 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007007
7008 // Optimization level.
7009 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7010 if (A->getOption().getID() == options::OPT_O0) {
7011 CmdArgs.push_back("/Od");
7012 } else {
7013 StringRef OptLevel = A->getValue();
7014 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7015 A->render(Args, CmdArgs);
7016 else if (OptLevel == "3")
7017 CmdArgs.push_back("/Ox");
7018 }
7019 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007020
7021 // Flags for which clang-cl have an alias.
7022 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7023
7024 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7025 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7026 : "/GR-");
7027 if (Args.hasArg(options::OPT_fsyntax_only))
7028 CmdArgs.push_back("/Zs");
7029
Hans Wennborg260ff402013-09-27 17:54:18 +00007030 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7031 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7032 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7033
Hans Wennborg87cfa712013-09-19 20:32:16 +00007034 // Flags that can simply be passed through.
7035 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7036 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7037
7038 // The order of these flags is relevant, so pick the last one.
7039 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7040 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7041 A->render(Args, CmdArgs);
7042
7043
7044 // Input filename.
7045 assert(Inputs.size() == 1);
7046 const InputInfo &II = Inputs[0];
7047 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7048 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7049 if (II.isFilename())
7050 CmdArgs.push_back(II.getFilename());
7051 else
7052 II.getInputArg().renderAsInput(Args, CmdArgs);
7053
7054 // Output filename.
7055 assert(Output.getType() == types::TY_Object);
7056 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7057 Output.getFilename());
7058 CmdArgs.push_back(Fo);
7059
Hans Wennborg188382e2013-09-20 18:16:35 +00007060 const Driver &D = getToolChain().getDriver();
7061 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007062
Hans Wennborg188382e2013-09-20 18:16:35 +00007063 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007064}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007065
7066
7067/// XCore Tools
7068// We pass assemble and link construction to the xcc tool.
7069
7070void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7071 const InputInfo &Output,
7072 const InputInfoList &Inputs,
7073 const ArgList &Args,
7074 const char *LinkingOutput) const {
7075 ArgStringList CmdArgs;
7076
7077 CmdArgs.push_back("-o");
7078 CmdArgs.push_back(Output.getFilename());
7079
7080 CmdArgs.push_back("-c");
7081
7082 if (Args.hasArg(options::OPT_g_Group)) {
7083 CmdArgs.push_back("-g");
7084 }
7085
7086 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7087 options::OPT_Xassembler);
7088
7089 for (InputInfoList::const_iterator
7090 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7091 const InputInfo &II = *it;
7092 CmdArgs.push_back(II.getFilename());
7093 }
7094
7095 const char *Exec =
7096 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7097 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7098}
7099
7100void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7101 const InputInfo &Output,
7102 const InputInfoList &Inputs,
7103 const ArgList &Args,
7104 const char *LinkingOutput) const {
7105 ArgStringList CmdArgs;
7106
7107 if (Output.isFilename()) {
7108 CmdArgs.push_back("-o");
7109 CmdArgs.push_back(Output.getFilename());
7110 } else {
7111 assert(Output.isNothing() && "Invalid output.");
7112 }
7113
7114 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7115
7116 const char *Exec =
7117 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7118 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7119}