blob: 2295e930fdfff14e11b9595cd7f5355cbaf86055 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Rafael Espindola0df9e162013-11-05 21:43:54 +000024#include "clang/Sema/SemaDiagnostic.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000032#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000033#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000034#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000035#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000036#include "llvm/Support/Path.h"
Rafael Espindola04b3fc42013-06-25 14:29:51 +000037#include "llvm/Support/Program.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000039#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000040#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000041
Daniel Dunbar1a093d22009-03-18 06:00:36 +000042using namespace clang::driver;
43using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000045using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000046
Daniel Dunbar64198ef2009-09-10 01:21:05 +000047/// CheckPreprocessingOptions - Perform some validation of preprocessing
48/// arguments that is shared with gcc.
49static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
50 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000051 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000053 << A->getAsString(Args) << "-E";
54}
55
Daniel Dunbar4eadb602009-09-10 01:21:12 +000056/// CheckCodeGenerationOptions - Perform some validation of code generation
57/// arguments that is shared with gcc.
58static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
59 // In gcc, only ARM checks this, but it seems reasonable to check universally.
60 if (Args.hasArg(options::OPT_static))
61 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
62 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000063 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000064 << A->getAsString(Args) << "-static";
65}
66
Chris Lattnerbf2803f2010-03-29 17:55:58 +000067// Quote target names for inclusion in GNU Make dependency files.
68// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000069static void QuoteTarget(StringRef Target,
70 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000071 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
72 switch (Target[i]) {
73 case ' ':
74 case '\t':
75 // Escape the preceding backslashes
76 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
77 Res.push_back('\\');
78
79 // Escape the space/tab
80 Res.push_back('\\');
81 break;
82 case '$':
83 Res.push_back('$');
84 break;
85 case '#':
86 Res.push_back('\\');
87 break;
88 default:
89 break;
90 }
91
92 Res.push_back(Target[i]);
93 }
94}
95
Bill Wendlingc0938f32012-03-12 22:10:06 +000096static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000097 ArgStringList &CmdArgs,
98 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000099 const char *EnvVar) {
100 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000101 bool CombinedArg = false;
102
Bill Wendling281ca292012-03-12 21:22:35 +0000103 if (!DirList)
104 return; // Nothing to do.
105
Chad Rosier616e8a52012-10-30 21:42:09 +0000106 StringRef Name(ArgName);
107 if (Name.equals("-I") || Name.equals("-L"))
108 CombinedArg = true;
109
Bill Wendling281ca292012-03-12 21:22:35 +0000110 StringRef Dirs(DirList);
111 if (Dirs.empty()) // Empty string should not add '.'.
112 return;
113
114 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000115 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000116 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000117 if (CombinedArg) {
118 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
119 } else {
120 CmdArgs.push_back(ArgName);
121 CmdArgs.push_back(".");
122 }
Bill Wendling281ca292012-03-12 21:22:35 +0000123 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000124 if (CombinedArg) {
125 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
126 } else {
127 CmdArgs.push_back(ArgName);
128 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
129 }
Bill Wendling281ca292012-03-12 21:22:35 +0000130 }
Nico Weber89355782012-03-19 15:00:03 +0000131 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000132 }
133
134 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000135 if (CombinedArg) {
136 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
137 } else {
138 CmdArgs.push_back(ArgName);
139 CmdArgs.push_back(".");
140 }
Bill Wendling281ca292012-03-12 21:22:35 +0000141 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000142 if (CombinedArg) {
143 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
144 } else {
145 CmdArgs.push_back(ArgName);
146 CmdArgs.push_back(Args.MakeArgString(Dirs));
147 }
Bill Wendling281ca292012-03-12 21:22:35 +0000148 }
149}
150
Daniel Dunbar54423b22010-09-17 00:24:54 +0000151static void AddLinkerInputs(const ToolChain &TC,
152 const InputInfoList &Inputs, const ArgList &Args,
153 ArgStringList &CmdArgs) {
154 const Driver &D = TC.getDriver();
155
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000156 // Add extra linker input arguments which are not treated as inputs
157 // (constructed via -Xarch_).
158 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
159
Daniel Dunbar54423b22010-09-17 00:24:54 +0000160 for (InputInfoList::const_iterator
161 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
162 const InputInfo &II = *it;
163
164 if (!TC.HasNativeLLVMSupport()) {
165 // Don't try to pass LLVM inputs unless we have native support.
166 if (II.getType() == types::TY_LLVM_IR ||
167 II.getType() == types::TY_LTO_IR ||
168 II.getType() == types::TY_LLVM_BC ||
169 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000170 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000171 << TC.getTripleString();
172 }
173
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000174 // Add filenames immediately.
175 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000176 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000177 continue;
178 }
179
180 // Otherwise, this is a linker input argument.
181 const Arg &A = II.getInputArg();
182
183 // Handle reserved library options.
184 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000185 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000186 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
187 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000188 } else
189 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000190 }
Bill Wendling281ca292012-03-12 21:22:35 +0000191
192 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000193 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194}
195
John McCall31168b02011-06-15 23:02:42 +0000196/// \brief Determine whether Objective-C automated reference counting is
197/// enabled.
198static bool isObjCAutoRefCount(const ArgList &Args) {
199 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
200}
201
Ted Kremeneke65b0862012-03-06 20:05:56 +0000202/// \brief Determine whether we are linking the ObjC runtime.
203static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000204 if (isObjCAutoRefCount(Args)) {
205 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000206 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000207 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000208 return Args.hasArg(options::OPT_fobjc_link_runtime);
209}
210
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000211static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000212 ArgStringList &CmdArgs,
213 llvm::Triple Triple) {
214 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
215 Args.hasArg(options::OPT_fprofile_generate) ||
216 Args.hasArg(options::OPT_fcreate_profile) ||
217 Args.hasArg(options::OPT_coverage)))
218 return;
219
220 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
221 // the link line. We cannot do the same thing because unlike gcov there is a
222 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
223 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000224 std::string ProfileRT =
225 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000226
Bill Wendling08760582011-06-27 19:15:03 +0000227 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000228}
229
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000230static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000231 // Don't forward inputs from the original command line. They are added from
232 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000233 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000234 !O.hasFlag(options::DriverOption) &&
235 !O.hasFlag(options::LinkerInput);
236}
237
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000238void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000239 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000240 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000241 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000242 ArgStringList &CmdArgs,
243 const InputInfo &Output,
244 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000245 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000246
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000247 CheckPreprocessingOptions(D, Args);
248
249 Args.AddLastArg(CmdArgs, options::OPT_C);
250 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000251
252 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000253 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000254 (A = Args.getLastArg(options::OPT_MD)) ||
255 (A = Args.getLastArg(options::OPT_MMD))) {
256 // Determine the output location.
257 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000258 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000259 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000260 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000261 } else if (Output.getType() == types::TY_Dependencies) {
262 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000263 } else if (A->getOption().matches(options::OPT_M) ||
264 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000265 DepFile = "-";
266 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000267 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000268 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 }
270 CmdArgs.push_back("-dependency-file");
271 CmdArgs.push_back(DepFile);
272
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000273 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000274 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
275 const char *DepTarget;
276
277 // If user provided -o, that is the dependency target, except
278 // when we are only generating a dependency file.
279 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
280 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000281 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 } else {
283 // Otherwise derive from the base input.
284 //
285 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000286 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000287 llvm::sys::path::replace_extension(P, "o");
288 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 }
290
291 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000292 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000293 QuoteTarget(DepTarget, Quoted);
294 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000295 }
296
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000297 if (A->getOption().matches(options::OPT_M) ||
298 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299 CmdArgs.push_back("-sys-header-deps");
300 }
301
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000302 if (Args.hasArg(options::OPT_MG)) {
303 if (!A || A->getOption().matches(options::OPT_MD) ||
304 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000305 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000306 CmdArgs.push_back("-MG");
307 }
308
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000309 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000310
311 // Convert all -MQ <target> args to -MT <quoted target>
312 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
313 options::OPT_MQ),
314 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000315 const Arg *A = *it;
316 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000317
Daniel Dunbara442fd52010-06-11 22:00:13 +0000318 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000319 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000321 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322 CmdArgs.push_back(Args.MakeArgString(Quoted));
323
324 // -MT flag - no change
325 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000326 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000327 }
328 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000329
Douglas Gregor111af7d2009-04-18 00:34:01 +0000330 // Add -i* options, and automatically translate to
331 // -include-pch/-include-pth for transparent PCH support. It's
332 // wonky, but we include looking for .gch so we can support seamless
333 // replacement into a build system already set up to be generating
334 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000335 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000336 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
337 ie = Args.filtered_end(); it != ie; ++it) {
338 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000339
340 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000341 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
342 RenderedImplicitInclude = true;
343
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000344 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000345 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000346
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000348 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000349 SmallString<128> P(A->getValue());
350 // We want the files to have a name like foo.h.pch. Add a dummy extension
351 // so that replace_extension does the right thing.
352 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000353 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000354 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000355 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000356 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000357 }
358
Douglas Gregor111af7d2009-04-18 00:34:01 +0000359 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000361 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000367 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000368 FoundPCH = UsePCH;
369 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000370 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 }
372
373 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 if (IsFirstImplicitInclude) {
375 A->claim();
376 if (UsePCH)
377 CmdArgs.push_back("-include-pch");
378 else
379 CmdArgs.push_back("-include-pth");
380 CmdArgs.push_back(Args.MakeArgString(P.str()));
381 continue;
382 } else {
383 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000384 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000385 << P.str() << A->getAsString(Args);
386 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000387 }
388 }
389
390 // Not translated, render as usual.
391 A->claim();
392 A->render(Args, CmdArgs);
393 }
394
395 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000396 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
397 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398
399 // Add -Wp, and -Xassembler if using the preprocessor.
400
401 // FIXME: There is a very unfortunate problem here, some troubled
402 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
403 // really support that we would have to parse and then translate
404 // those options. :(
405 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
406 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000407
408 // -I- is a deprecated GCC feature, reject it.
409 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000410 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000411
412 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
413 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000414 StringRef sysroot = C.getSysRoot();
415 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000416 if (!Args.hasArg(options::OPT_isysroot)) {
417 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000418 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000419 }
420 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000421
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000422 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000423 // FIXME: We should probably sink the logic for handling these from the
424 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000425 // CPATH - included following the user specified includes (but prior to
426 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000436
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000437 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000438 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000439 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000440
441 // Add system include arguments.
442 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000443}
444
Daniel Dunbarf492c922009-09-10 22:59:51 +0000445/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000446/// CPU.
447//
448// FIXME: This is redundant with -mcpu, why does LLVM use this.
449// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000450static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000451 return llvm::StringSwitch<const char *>(CPU)
Tim Northover92509c12013-06-13 15:02:46 +0000452 .Case("strongarm", "v4")
Chad Rosier9ac84512011-10-07 17:48:56 +0000453 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
454 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
455 .Cases("arm920", "arm920t", "arm922t", "v4t")
456 .Cases("arm940t", "ep9312","v4t")
457 .Cases("arm10tdmi", "arm1020t", "v5")
458 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
459 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
460 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
461 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
462 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
463 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000464 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Ana Pazosdd6068d2013-12-06 22:43:17 +0000465 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
Renato Golin1a04f222013-09-13 17:02:54 +0000466 .Cases("cortex-r4", "cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000467 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000468 .Case("cortex-m3", "v7m")
469 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000470 .Case("cortex-a9-mp", "v7f")
471 .Case("swift", "v7s")
Bernard Ogden021d7da2013-10-24 18:32:36 +0000472 .Cases("cortex-a53", "cortex-a57", "v8")
Chad Rosier9ac84512011-10-07 17:48:56 +0000473 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000474}
475
Benjamin Kramer09811c72012-06-26 22:20:06 +0000476/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
477//
478// FIXME: tblgen this.
479static std::string getARMTargetCPU(const ArgList &Args,
480 const llvm::Triple &Triple) {
481 // FIXME: Warn on inconsistent use of -mcpu and -march.
482
483 // If we have -mcpu=, use that.
484 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000485 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000486 // Handle -mcpu=native.
487 if (MCPU == "native")
488 return llvm::sys::getHostCPUName();
489 else
490 return MCPU;
491 }
492
493 StringRef MArch;
494 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
495 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000496 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000497 } else {
498 // Otherwise, use the Arch from the triple.
499 MArch = Triple.getArchName();
500 }
501
Joerg Sonnenberger706c2812013-12-05 21:27:58 +0000502 if (Triple.getOS() == llvm::Triple::NetBSD) {
503 if (MArch == "armv6")
504 return "arm1176jzf-s";
505 }
506
Benjamin Kramer09811c72012-06-26 22:20:06 +0000507 // Handle -march=native.
508 std::string NativeMArch;
509 if (MArch == "native") {
510 std::string CPU = llvm::sys::getHostCPUName();
511 if (CPU != "generic") {
512 // Translate the native cpu into the architecture. The switch below will
513 // then chose the minimum cpu for that arch.
514 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
515 MArch = NativeMArch;
516 }
517 }
518
519 return llvm::StringSwitch<const char *>(MArch)
520 .Cases("armv2", "armv2a","arm2")
521 .Case("armv3", "arm6")
522 .Case("armv3m", "arm7m")
Tim Northover92509c12013-06-13 15:02:46 +0000523 .Case("armv4", "strongarm")
524 .Case("armv4t", "arm7tdmi")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000525 .Case("thumbv4t", "arm7tdmi")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000526 .Cases("armv5", "armv5t", "arm10tdmi")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000527 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000528 .Cases("armv5e", "armv5te", "arm1022e")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000529 .Cases("thumbv5e", "thumbv5te", "arm1022e")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000530 .Case("armv5tej", "arm926ej-s")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000531 .Case("thumbv5tej", "arm926ej-s")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000532 .Cases("armv6", "armv6k", "arm1136jf-s")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000533 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000534 .Case("armv6j", "arm1136j-s")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000535 .Case("thumbv6j", "arm1136j-s")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000536 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000537 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000538 .Case("armv6t2", "arm1156t2-s")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000539 .Case("thumbv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000540 .Cases("armv6m", "armv6-m", "cortex-m0")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000541 .Case("thumbv6m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000542 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000543 .Cases("thumbv7", "thumbv7a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000544 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000545 .Case("thumbv7em", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000546 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
547 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000548 .Cases("armv7r", "armv7-r", "cortex-r4")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000549 .Case("thumbv7r", "cortex-r4")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000550 .Cases("armv7m", "armv7-m", "cortex-m3")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000551 .Case("thumbv7m", "cortex-m3")
Joey Goulyd077bc62013-06-26 17:19:48 +0000552 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Bernard Ogden178d0dc2013-12-12 13:26:59 +0000553 .Cases("thumbv8", "thumbv8a", "cortex-a53")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000554 .Case("ep9312", "ep9312")
555 .Case("iwmmxt", "iwmmxt")
556 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000557 // If all else failed, return the most base CPU with thumb interworking
558 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000559 .Default("arm7tdmi");
560}
561
Amara Emerson703da2e2013-10-31 09:32:33 +0000562/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
563//
564// FIXME: tblgen this.
565static std::string getAArch64TargetCPU(const ArgList &Args,
566 const llvm::Triple &Triple) {
567 // FIXME: Warn on inconsistent use of -mcpu and -march.
568
569 // If we have -mcpu=, use that.
570 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
571 StringRef MCPU = A->getValue();
572 // Handle -mcpu=native.
573 if (MCPU == "native")
574 return llvm::sys::getHostCPUName();
575 else
576 return MCPU;
577 }
578
579 return "generic";
580}
581
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000582// FIXME: Move to target hook.
583static bool isSignedCharDefault(const llvm::Triple &Triple) {
584 switch (Triple.getArch()) {
585 default:
586 return true;
587
Tim Northover9bb857a2013-01-31 12:13:10 +0000588 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000589 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000590 case llvm::Triple::ppc:
591 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000592 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000593 return true;
594 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000595
Bill Schmidt778d3872013-07-26 01:36:11 +0000596 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000597 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000598 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000600 }
601}
602
Robert Lytton0e076492013-08-13 09:43:10 +0000603static bool isNoCommonDefault(const llvm::Triple &Triple) {
604 switch (Triple.getArch()) {
605 default:
606 return false;
607
608 case llvm::Triple::xcore:
609 return true;
610 }
611}
612
Chad Rosiercfbfc582012-04-04 20:51:35 +0000613// Handle -mfpu=.
614//
615// FIXME: Centralize feature selection, defaulting shouldn't be also in the
616// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000617static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
618 const ArgList &Args,
619 std::vector<const char *> &Features) {
620 StringRef FPU = A->getValue();
621 if (FPU == "fp-armv8") {
622 Features.push_back("+fp-armv8");
623 } else if (FPU == "neon-fp-armv8") {
624 Features.push_back("+fp-armv8");
625 Features.push_back("+neon");
626 } else if (FPU == "crypto-neon-fp-armv8") {
627 Features.push_back("+fp-armv8");
628 Features.push_back("+neon");
629 Features.push_back("+crypto");
630 } else if (FPU == "neon") {
631 Features.push_back("+neon");
632 } else if (FPU == "none") {
633 Features.push_back("-fp-armv8");
634 Features.push_back("-crypto");
635 Features.push_back("-neon");
636 } else
637 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
638}
639
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000640// Handle -mhwdiv=.
641static void getARMHWDivFeatures(const Driver &D, const Arg *A,
642 const ArgList &Args,
643 std::vector<const char *> &Features) {
644 StringRef HWDiv = A->getValue();
645 if (HWDiv == "arm") {
646 Features.push_back("+hwdiv-arm");
647 Features.push_back("-hwdiv");
648 } else if (HWDiv == "thumb") {
649 Features.push_back("-hwdiv-arm");
650 Features.push_back("+hwdiv");
651 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
652 Features.push_back("+hwdiv-arm");
653 Features.push_back("+hwdiv");
654 } else if (HWDiv == "none") {
655 Features.push_back("-hwdiv-arm");
656 Features.push_back("-hwdiv");
657 } else
658 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
659}
660
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000661// Handle -mfpu=.
662//
663// FIXME: Centralize feature selection, defaulting shouldn't be also in the
664// frontend target.
665static void getARMFPUFeatures(const Driver &D, const Arg *A,
666 const ArgList &Args,
667 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000668 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000669
670 // Set the target features based on the FPU.
671 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
672 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000673 Features.push_back("-vfp2");
674 Features.push_back("-vfp3");
675 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000676 } else if (FPU == "vfp") {
677 Features.push_back("+vfp2");
678 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000679 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000680 Features.push_back("+vfp3");
681 Features.push_back("+d16");
682 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000683 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000684 Features.push_back("+vfp3");
685 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000686 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
687 Features.push_back("+vfp4");
688 Features.push_back("+d16");
689 Features.push_back("-neon");
690 } else if (FPU == "vfp4" || FPU == "vfpv4") {
691 Features.push_back("+vfp4");
692 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000693 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000694 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000695 Features.push_back("-neon");
696 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000697 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000698 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000699 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000700 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000701 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000702 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000703 Features.push_back("+neon");
704 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000705 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000706 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000707 } else if (FPU == "none") {
708 Features.push_back("-vfp2");
709 Features.push_back("-vfp3");
710 Features.push_back("-vfp4");
711 Features.push_back("-fp-armv8");
712 Features.push_back("-crypto");
713 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000714 } else
715 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
716}
717
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000718// Select the float ABI as determined by -msoft-float, -mhard-float, and
719// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000720StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
721 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000722 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000723 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
724 options::OPT_mhard_float,
725 options::OPT_mfloat_abi_EQ)) {
726 if (A->getOption().matches(options::OPT_msoft_float))
727 FloatABI = "soft";
728 else if (A->getOption().matches(options::OPT_mhard_float))
729 FloatABI = "hard";
730 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000731 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000732 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000733 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000734 << A->getAsString(Args);
735 FloatABI = "soft";
736 }
737 }
738 }
739
740 // If unspecified, choose the default based on the platform.
741 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000742 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000743 case llvm::Triple::Darwin:
744 case llvm::Triple::MacOSX:
745 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 // Darwin defaults to "softfp" for v6 and v7.
747 //
748 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000749 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000750 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000751 if (StringRef(ArchName).startswith("v6") ||
752 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000753 FloatABI = "softfp";
754 else
755 FloatABI = "soft";
756 break;
757 }
758
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000759 case llvm::Triple::FreeBSD:
760 // FreeBSD defaults to soft float
761 FloatABI = "soft";
762 break;
763
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000765 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000766 case llvm::Triple::GNUEABIHF:
767 FloatABI = "hard";
768 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000769 case llvm::Triple::GNUEABI:
770 FloatABI = "softfp";
771 break;
772 case llvm::Triple::EABI:
773 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
774 FloatABI = "softfp";
775 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000776 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000777 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000778 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000779 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000780 FloatABI = "softfp";
781 else
782 FloatABI = "soft";
783 break;
784 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000785 default:
786 // Assume "soft", but warn the user we are guessing.
787 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000788 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000789 break;
790 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000791 }
792 }
793
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000794 return FloatABI;
795}
796
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000797static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
798 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000799 std::vector<const char *> &Features,
800 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000801 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000802 if (!ForAS) {
803 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
804 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
805 // stripped out by the ARM target. We should probably pass this a new
806 // -target-option, which is handled by the -cc1/-cc1as invocation.
807 //
808 // FIXME2: For consistency, it would be ideal if we set up the target
809 // machine state the same when using the frontend or the assembler. We don't
810 // currently do that for the assembler, we pass the options directly to the
811 // backend and never even instantiate the frontend TargetInfo. If we did,
812 // and used its handleTargetFeatures hook, then we could ensure the
813 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000814
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000815 // Use software floating point operations?
816 if (FloatABI == "soft")
817 Features.push_back("+soft-float");
818
819 // Use software floating point argument passing?
820 if (FloatABI != "hard")
821 Features.push_back("+soft-float-abi");
822 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000823
824 // Honor -mfpu=.
825 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000826 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000827 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
828 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000829
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000830 // Setting -msoft-float effectively disables NEON because of the GCC
831 // implementation, although the same isn't true of VFP or VFP3.
832 if (FloatABI == "soft")
833 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000834
835 // En/disable crc
836 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
837 options::OPT_mnocrc)) {
838 if (A->getOption().matches(options::OPT_mcrc))
839 Features.push_back("+crc");
840 else
841 Features.push_back("-crc");
842 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000843}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000844
845void Clang::AddARMTargetArgs(const ArgList &Args,
846 ArgStringList &CmdArgs,
847 bool KernelOrKext) const {
848 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000849 // Get the effective triple, which takes into account the deployment target.
850 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
851 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000852 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000853
854 // Select the ABI to use.
855 //
856 // FIXME: Support -meabi.
857 const char *ABIName = 0;
858 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000859 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000860 } else if (Triple.isOSDarwin()) {
861 // The backend is hardwired to assume AAPCS for M-class processors, ensure
862 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000863 if (Triple.getEnvironment() == llvm::Triple::EABI ||
864 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000865 ABIName = "aapcs";
866 } else {
867 ABIName = "apcs-gnu";
868 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000869 } else {
870 // Select the default based on the platform.
871 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000872 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000873 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000874 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000875 ABIName = "aapcs-linux";
876 break;
877 case llvm::Triple::EABI:
878 ABIName = "aapcs";
879 break;
880 default:
881 ABIName = "apcs-gnu";
882 }
883 }
884 CmdArgs.push_back("-target-abi");
885 CmdArgs.push_back(ABIName);
886
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000887 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000888 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000889 if (FloatABI == "soft") {
890 // Floating point operations and argument passing are soft.
891 //
892 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000893 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000894 CmdArgs.push_back("-mfloat-abi");
895 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000896 } else if (FloatABI == "softfp") {
897 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000898 CmdArgs.push_back("-mfloat-abi");
899 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000900 } else {
901 // Floating point operations and argument passing are hard.
902 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000903 CmdArgs.push_back("-mfloat-abi");
904 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000905 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000906
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000907 // Kernel code has more strict alignment requirements.
908 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000909 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000910 CmdArgs.push_back("-backend-option");
911 CmdArgs.push_back("-arm-long-calls");
912 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000913
Daniel Dunbar12100e22011-03-22 16:48:17 +0000914 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000915 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000916
917 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000918 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000919 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000920 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000921
922 // Setting -mno-global-merge disables the codegen global merge pass. Setting
923 // -mglobal-merge has no effect as the pass is enabled by default.
924 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
925 options::OPT_mno_global_merge)) {
926 if (A->getOption().matches(options::OPT_mno_global_merge))
927 CmdArgs.push_back("-mno-global-merge");
928 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000929
Bob Wilson9c8af452013-04-11 18:53:25 +0000930 if (!Args.hasFlag(options::OPT_mimplicit_float,
931 options::OPT_mno_implicit_float,
932 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000933 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000934
935 // llvm does not support reserving registers in general. There is support
936 // for reserving r9 on ARM though (defined as a platform-specific register
937 // in ARM EABI).
938 if (Args.hasArg(options::OPT_ffixed_r9)) {
939 CmdArgs.push_back("-backend-option");
940 CmdArgs.push_back("-arm-reserve-r9");
941 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000942}
943
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000944// Get CPU and ABI names. They are not independent
945// so we have to calculate them together.
946static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000947 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000948 StringRef &CPUName,
949 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000950 const char *DefMips32CPU = "mips32";
951 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000952
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000953 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000954 options::OPT_mcpu_EQ))
955 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000956
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000957 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000958 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000959 // Convert a GNU style Mips ABI name to the name
960 // accepted by LLVM Mips backend.
961 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
962 .Case("32", "o32")
963 .Case("64", "n64")
964 .Default(ABIName);
965 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000966
967 // Setup default CPU and ABI names.
968 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000969 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000970 default:
971 llvm_unreachable("Unexpected triple arch name");
972 case llvm::Triple::mips:
973 case llvm::Triple::mipsel:
974 CPUName = DefMips32CPU;
975 break;
976 case llvm::Triple::mips64:
977 case llvm::Triple::mips64el:
978 CPUName = DefMips64CPU;
979 break;
980 }
981 }
982
983 if (!ABIName.empty()) {
984 // Deduce CPU name from ABI name.
985 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000986 .Cases("32", "o32", "eabi", DefMips32CPU)
987 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000988 .Default("");
989 }
990 else if (!CPUName.empty()) {
991 // Deduce ABI name from CPU name.
992 ABIName = llvm::StringSwitch<const char *>(CPUName)
993 .Cases("mips32", "mips32r2", "o32")
994 .Cases("mips64", "mips64r2", "n64")
995 .Default("");
996 }
997
998 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000999}
1000
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001001// Convert ABI name to the GNU tools acceptable variant.
1002static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1003 return llvm::StringSwitch<llvm::StringRef>(ABI)
1004 .Case("o32", "32")
1005 .Case("n64", "64")
1006 .Default(ABI);
1007}
1008
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001009// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1010// and -mfloat-abi=.
1011static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001012 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001013 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001014 options::OPT_mhard_float,
1015 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001016 if (A->getOption().matches(options::OPT_msoft_float))
1017 FloatABI = "soft";
1018 else if (A->getOption().matches(options::OPT_mhard_float))
1019 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001020 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001021 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001022 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001023 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001024 FloatABI = "hard";
1025 }
1026 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001027 }
1028
1029 // If unspecified, choose the default based on the platform.
1030 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001031 // Assume "hard", because it's a default value used by gcc.
1032 // When we start to recognize specific target MIPS processors,
1033 // we will be able to select the default more correctly.
1034 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001035 }
1036
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001037 return FloatABI;
1038}
1039
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001040static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001041 std::vector<const char *> &Features,
1042 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001043 StringRef FeatureName) {
1044 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001045 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001046 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001047 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001048 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001049 }
1050}
1051
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001052static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1053 std::vector<const char *> &Features) {
1054 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001055 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001056 // FIXME: Note, this is a hack. We need to pass the selected float
1057 // mode to the MipsTargetInfoBase to define appropriate macros there.
1058 // Now it is the only method.
1059 Features.push_back("+soft-float");
1060 }
1061
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001062 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1063 if (StringRef(A->getValue()) == "2008")
1064 Features.push_back("+nan2008");
1065 }
1066
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001067 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1068 options::OPT_mdouble_float, "single-float");
1069 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1070 "mips16");
1071 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1072 options::OPT_mno_micromips, "micromips");
1073 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1074 "dsp");
1075 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1076 "dspr2");
1077 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1078 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001079 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1080 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001081}
1082
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001083void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001084 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001085 const Driver &D = getToolChain().getDriver();
1086 StringRef CPUName;
1087 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001088 const llvm::Triple &Triple = getToolChain().getTriple();
1089 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001090
1091 CmdArgs.push_back("-target-abi");
1092 CmdArgs.push_back(ABIName.data());
1093
1094 StringRef FloatABI = getMipsFloatABI(D, Args);
1095
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001096 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001097 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001098 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001099 CmdArgs.push_back("-mfloat-abi");
1100 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001101 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001102 else {
1103 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001104 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001105 CmdArgs.push_back("-mfloat-abi");
1106 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001107 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001108
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001109 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1110 if (A->getOption().matches(options::OPT_mxgot)) {
1111 CmdArgs.push_back("-mllvm");
1112 CmdArgs.push_back("-mxgot");
1113 }
1114 }
1115
Simon Atanasyanc580b322013-05-11 06:33:44 +00001116 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1117 options::OPT_mno_ldc1_sdc1)) {
1118 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1119 CmdArgs.push_back("-mllvm");
1120 CmdArgs.push_back("-mno-ldc1-sdc1");
1121 }
1122 }
1123
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001124 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1125 options::OPT_mno_check_zero_division)) {
1126 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1127 CmdArgs.push_back("-mllvm");
1128 CmdArgs.push_back("-mno-check-zero-division");
1129 }
1130 }
1131
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001132 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001133 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001134 CmdArgs.push_back("-mllvm");
1135 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1136 A->claim();
1137 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001138}
1139
Hal Finkel8eb59282012-06-11 22:35:19 +00001140/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1141static std::string getPPCTargetCPU(const ArgList &Args) {
1142 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001143 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001144
1145 if (CPUName == "native") {
1146 std::string CPU = llvm::sys::getHostCPUName();
1147 if (!CPU.empty() && CPU != "generic")
1148 return CPU;
1149 else
1150 return "";
1151 }
1152
1153 return llvm::StringSwitch<const char *>(CPUName)
1154 .Case("common", "generic")
1155 .Case("440", "440")
1156 .Case("440fp", "440")
1157 .Case("450", "450")
1158 .Case("601", "601")
1159 .Case("602", "602")
1160 .Case("603", "603")
1161 .Case("603e", "603e")
1162 .Case("603ev", "603ev")
1163 .Case("604", "604")
1164 .Case("604e", "604e")
1165 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001166 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001167 .Case("G3", "g3")
1168 .Case("7400", "7400")
1169 .Case("G4", "g4")
1170 .Case("7450", "7450")
1171 .Case("G4+", "g4+")
1172 .Case("750", "750")
1173 .Case("970", "970")
1174 .Case("G5", "g5")
1175 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001176 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001177 .Case("e500mc", "e500mc")
1178 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001179 .Case("power3", "pwr3")
1180 .Case("power4", "pwr4")
1181 .Case("power5", "pwr5")
1182 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001183 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001184 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001185 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001186 .Case("pwr3", "pwr3")
1187 .Case("pwr4", "pwr4")
1188 .Case("pwr5", "pwr5")
1189 .Case("pwr5x", "pwr5x")
1190 .Case("pwr6", "pwr6")
1191 .Case("pwr6x", "pwr6x")
1192 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001193 .Case("powerpc", "ppc")
1194 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001195 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001196 .Default("");
1197 }
1198
1199 return "";
1200}
1201
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001202static void getPPCTargetFeatures(const ArgList &Args,
1203 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001204 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1205 ie = Args.filtered_end();
1206 it != ie; ++it) {
1207 StringRef Name = (*it)->getOption().getName();
1208 (*it)->claim();
1209
1210 // Skip over "-m".
1211 assert(Name.startswith("m") && "Invalid feature name.");
1212 Name = Name.substr(1);
1213
1214 bool IsNegative = Name.startswith("no-");
1215 if (IsNegative)
1216 Name = Name.substr(3);
1217
1218 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1219 // pass the correct option to the backend while calling the frontend
1220 // option the same.
1221 // TODO: Change the LLVM backend option maybe?
1222 if (Name == "mfcrf")
1223 Name = "mfocrf";
1224
1225 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1226 }
1227
1228 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001229 AddTargetFeature(Args, Features, options::OPT_faltivec,
1230 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001231}
1232
Tom Stellard6674c702013-04-01 20:56:53 +00001233/// Get the (LLVM) name of the R600 gpu we are targeting.
1234static std::string getR600TargetGPU(const ArgList &Args) {
1235 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001236 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001237 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001238 .Cases("rv630", "rv635", "r600")
1239 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001240 .Case("rv740", "rv770")
1241 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001242 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001243 .Case("hemlock", "cypress")
1244 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001245 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001246 }
1247 return "";
1248}
1249
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001250static void getSparcTargetFeatures(const ArgList &Args,
1251 std::vector<const char *> Features) {
1252 bool SoftFloatABI = true;
1253 if (Arg *A =
1254 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1255 if (A->getOption().matches(options::OPT_mhard_float))
1256 SoftFloatABI = false;
1257 }
1258 if (SoftFloatABI)
1259 Features.push_back("+soft-float");
1260}
1261
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001262void Clang::AddSparcTargetArgs(const ArgList &Args,
1263 ArgStringList &CmdArgs) const {
1264 const Driver &D = getToolChain().getDriver();
1265
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001266 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001267 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001268 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1269 options::OPT_mhard_float)) {
1270 if (A->getOption().matches(options::OPT_msoft_float))
1271 FloatABI = "soft";
1272 else if (A->getOption().matches(options::OPT_mhard_float))
1273 FloatABI = "hard";
1274 }
1275
1276 // If unspecified, choose the default based on the platform.
1277 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001278 // Assume "soft", but warn the user we are guessing.
1279 FloatABI = "soft";
1280 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001281 }
1282
1283 if (FloatABI == "soft") {
1284 // Floating point operations and argument passing are soft.
1285 //
1286 // FIXME: This changes CPP defines, we need -target-soft-float.
1287 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001288 } else {
1289 assert(FloatABI == "hard" && "Invalid float abi!");
1290 CmdArgs.push_back("-mhard-float");
1291 }
1292}
1293
Richard Sandiford4652d892013-07-19 16:51:51 +00001294static const char *getSystemZTargetCPU(const ArgList &Args) {
1295 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1296 return A->getValue();
1297 return "z10";
1298}
1299
Chandler Carruth953fb082013-01-13 11:46:33 +00001300static const char *getX86TargetCPU(const ArgList &Args,
1301 const llvm::Triple &Triple) {
1302 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001303 if (StringRef(A->getValue()) != "native") {
1304 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1305 return "core-avx2";
1306
Chandler Carruth953fb082013-01-13 11:46:33 +00001307 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001308 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001309
1310 // FIXME: Reject attempts to use -march=native unless the target matches
1311 // the host.
1312 //
1313 // FIXME: We should also incorporate the detected target features for use
1314 // with -native.
1315 std::string CPU = llvm::sys::getHostCPUName();
1316 if (!CPU.empty() && CPU != "generic")
1317 return Args.MakeArgString(CPU);
1318 }
1319
1320 // Select the default CPU if none was given (or detection failed).
1321
1322 if (Triple.getArch() != llvm::Triple::x86_64 &&
1323 Triple.getArch() != llvm::Triple::x86)
1324 return 0; // This routine is only handling x86 targets.
1325
1326 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1327
1328 // FIXME: Need target hooks.
Jim Grosbach82eee262013-11-16 00:53:35 +00001329 if (Triple.isOSDarwin()) {
1330 if (Triple.getArchName() == "x86_64h")
1331 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001332 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001333 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001334
Chandler Carruth953fb082013-01-13 11:46:33 +00001335 // All x86 devices running Android have core2 as their common
1336 // denominator. This makes a better choice than pentium4.
1337 if (Triple.getEnvironment() == llvm::Triple::Android)
1338 return "core2";
1339
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001340 // Everything else goes to x86-64 in 64-bit mode.
1341 if (Is64Bit)
1342 return "x86-64";
1343
1344 switch (Triple.getOS()) {
1345 case llvm::Triple::FreeBSD:
1346 case llvm::Triple::NetBSD:
1347 case llvm::Triple::OpenBSD:
1348 return "i486";
1349 case llvm::Triple::Haiku:
1350 return "i586";
1351 case llvm::Triple::Bitrig:
1352 return "i686";
1353 default:
1354 // Fallback to p4.
1355 return "pentium4";
1356 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001357}
1358
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001359static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1360 switch(T.getArch()) {
1361 default:
1362 return "";
1363
Amara Emerson703da2e2013-10-31 09:32:33 +00001364 case llvm::Triple::aarch64:
1365 return getAArch64TargetCPU(Args, T);
1366
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001367 case llvm::Triple::arm:
1368 case llvm::Triple::thumb:
1369 return getARMTargetCPU(Args, T);
1370
1371 case llvm::Triple::mips:
1372 case llvm::Triple::mipsel:
1373 case llvm::Triple::mips64:
1374 case llvm::Triple::mips64el: {
1375 StringRef CPUName;
1376 StringRef ABIName;
1377 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1378 return CPUName;
1379 }
1380
1381 case llvm::Triple::ppc:
1382 case llvm::Triple::ppc64:
1383 case llvm::Triple::ppc64le: {
1384 std::string TargetCPUName = getPPCTargetCPU(Args);
1385 // LLVM may default to generating code for the native CPU,
1386 // but, like gcc, we default to a more generic option for
1387 // each architecture. (except on Darwin)
1388 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1389 if (T.getArch() == llvm::Triple::ppc64)
1390 TargetCPUName = "ppc64";
1391 else if (T.getArch() == llvm::Triple::ppc64le)
1392 TargetCPUName = "ppc64le";
1393 else
1394 TargetCPUName = "ppc";
1395 }
1396 return TargetCPUName;
1397 }
1398
1399 case llvm::Triple::sparc:
1400 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1401 return A->getValue();
1402 return "";
1403
1404 case llvm::Triple::x86:
1405 case llvm::Triple::x86_64:
1406 return getX86TargetCPU(Args, T);
1407
1408 case llvm::Triple::hexagon:
1409 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1410
1411 case llvm::Triple::systemz:
1412 return getSystemZTargetCPU(Args);
1413
1414 case llvm::Triple::r600:
1415 return getR600TargetGPU(Args);
1416 }
1417}
1418
Alp Tokerce365ca2013-12-02 12:43:03 +00001419static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1420 ArgStringList &CmdArgs) {
1421 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1422 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1423 // forward.
1424 CmdArgs.push_back("-plugin");
1425 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1426 CmdArgs.push_back(Args.MakeArgString(Plugin));
1427
1428 // Try to pass driver level flags relevant to LTO code generation down to
1429 // the plugin.
1430
1431 // Handle flags for selecting CPU variants.
1432 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1433 if (!CPU.empty())
1434 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1435}
1436
Jim Grosbach82eee262013-11-16 00:53:35 +00001437static void getX86TargetFeatures(const llvm::Triple &Triple,
1438 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001439 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001440 if (Triple.getArchName() == "x86_64h") {
1441 // x86_64h implies quite a few of the more modern subtarget features
1442 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1443 Features.push_back("-rdrnd");
1444 Features.push_back("-aes");
1445 Features.push_back("-pclmul");
1446 Features.push_back("-rtm");
1447 Features.push_back("-hle");
1448 Features.push_back("-fsgsbase");
1449 }
1450
1451 // Now add any that the user explicitly requested on the command line,
1452 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001453 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1454 ie = Args.filtered_end();
1455 it != ie; ++it) {
1456 StringRef Name = (*it)->getOption().getName();
1457 (*it)->claim();
1458
1459 // Skip over "-m".
1460 assert(Name.startswith("m") && "Invalid feature name.");
1461 Name = Name.substr(1);
1462
1463 bool IsNegative = Name.startswith("no-");
1464 if (IsNegative)
1465 Name = Name.substr(3);
1466
1467 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1468 }
1469}
1470
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001471void Clang::AddX86TargetArgs(const ArgList &Args,
1472 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001473 if (!Args.hasFlag(options::OPT_mred_zone,
1474 options::OPT_mno_red_zone,
1475 true) ||
1476 Args.hasArg(options::OPT_mkernel) ||
1477 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001478 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001479
Bob Wilson2616e2e2013-02-10 16:01:41 +00001480 // Default to avoid implicit floating-point for kernel/kext code, but allow
1481 // that to be overridden with -mno-soft-float.
1482 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1483 Args.hasArg(options::OPT_fapple_kext));
1484 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1485 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001486 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001487 options::OPT_mno_implicit_float)) {
1488 const Option &O = A->getOption();
1489 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1490 O.matches(options::OPT_msoft_float));
1491 }
1492 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001493 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001494}
1495
Matthew Curtise8f80a12012-12-06 17:49:03 +00001496static inline bool HasPICArg(const ArgList &Args) {
1497 return Args.hasArg(options::OPT_fPIC)
1498 || Args.hasArg(options::OPT_fpic);
1499}
1500
1501static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1502 return Args.getLastArg(options::OPT_G,
1503 options::OPT_G_EQ,
1504 options::OPT_msmall_data_threshold_EQ);
1505}
1506
1507static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1508 std::string value;
1509 if (HasPICArg(Args))
1510 value = "0";
1511 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1512 value = A->getValue();
1513 A->claim();
1514 }
1515 return value;
1516}
1517
Tony Linthicum76329bf2011-12-12 21:14:55 +00001518void Clang::AddHexagonTargetArgs(const ArgList &Args,
1519 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001520 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001521 CmdArgs.push_back("-mqdsp6-compat");
1522 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001523
Matthew Curtise8f80a12012-12-06 17:49:03 +00001524 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1525 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001526 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001527 CmdArgs.push_back(Args.MakeArgString(
1528 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001529 }
1530
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001531 if (!Args.hasArg(options::OPT_fno_short_enums))
1532 CmdArgs.push_back("-fshort-enums");
1533 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1534 CmdArgs.push_back ("-mllvm");
1535 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1536 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001537 CmdArgs.push_back ("-mllvm");
1538 CmdArgs.push_back ("-machine-sink-split=0");
1539}
1540
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001541static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1542 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001543 // Honor -mfpu=.
1544 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001545 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001546}
1547
1548static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001549 const ArgList &Args, ArgStringList &CmdArgs,
1550 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001551 std::vector<const char *> Features;
1552 switch (Triple.getArch()) {
1553 default:
1554 break;
1555 case llvm::Triple::mips:
1556 case llvm::Triple::mipsel:
1557 case llvm::Triple::mips64:
1558 case llvm::Triple::mips64el:
1559 getMIPSTargetFeatures(D, Args, Features);
1560 break;
1561
1562 case llvm::Triple::arm:
1563 case llvm::Triple::thumb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001564 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001565 break;
1566
1567 case llvm::Triple::ppc:
1568 case llvm::Triple::ppc64:
1569 case llvm::Triple::ppc64le:
1570 getPPCTargetFeatures(Args, Features);
1571 break;
1572 case llvm::Triple::sparc:
1573 getSparcTargetFeatures(Args, Features);
1574 break;
1575 case llvm::Triple::aarch64:
1576 getAArch64TargetFeatures(D, Args, Features);
1577 break;
1578 case llvm::Triple::x86:
1579 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001580 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001581 break;
1582 }
Rafael Espindola43964802013-08-21 17:34:32 +00001583
1584 // Find the last of each feature.
1585 llvm::StringMap<unsigned> LastOpt;
1586 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1587 const char *Name = Features[I];
1588 assert(Name[0] == '-' || Name[0] == '+');
1589 LastOpt[Name + 1] = I;
1590 }
1591
1592 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1593 // If this feature was overridden, ignore it.
1594 const char *Name = Features[I];
1595 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1596 assert(LastI != LastOpt.end());
1597 unsigned Last = LastI->second;
1598 if (Last != I)
1599 continue;
1600
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001601 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001602 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001603 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001604}
1605
Eric Christopher84fbdb42011-08-19 00:30:14 +00001606static bool
John McCall5fb5df92012-06-20 06:18:46 +00001607shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001608 const llvm::Triple &Triple) {
1609 // We use the zero-cost exception tables for Objective-C if the non-fragile
1610 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1611 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001612 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001613 return true;
1614
Bob Wilson83e723a2013-12-05 19:38:42 +00001615 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001616 return false;
1617
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001618 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001619 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001620 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001621}
1622
Anders Carlssone96ab552011-02-28 02:27:16 +00001623/// addExceptionArgs - Adds exception related arguments to the driver command
1624/// arguments. There's a master flag, -fexceptions and also language specific
1625/// flags to enable/disable C++ and Objective-C exceptions.
1626/// This makes it possible to for example disable C++ exceptions but enable
1627/// Objective-C exceptions.
1628static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1629 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001630 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001631 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001632 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001633 if (KernelOrKext) {
1634 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1635 // arguments now to avoid warnings about unused arguments.
1636 Args.ClaimAllArgs(options::OPT_fexceptions);
1637 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1638 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1639 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1640 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1641 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001642 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001643 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001644
1645 // Exceptions are enabled by default.
1646 bool ExceptionsEnabled = true;
1647
1648 // This keeps track of whether exceptions were explicitly turned on or off.
1649 bool DidHaveExplicitExceptionFlag = false;
1650
Rafael Espindola00a66572009-10-01 13:33:33 +00001651 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1652 options::OPT_fno_exceptions)) {
1653 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001654 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001655 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001656 ExceptionsEnabled = false;
1657
1658 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001659 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001660
Anders Carlssone96ab552011-02-28 02:27:16 +00001661 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001662
Anders Carlssone96ab552011-02-28 02:27:16 +00001663 // Exception tables and cleanups can be enabled with -fexceptions even if the
1664 // language itself doesn't support exceptions.
1665 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1666 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001667
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001668 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1669 // is not necessarily sensible, but follows GCC.
1670 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001671 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001672 options::OPT_fno_objc_exceptions,
1673 true)) {
1674 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001675
Eric Christopher84fbdb42011-08-19 00:30:14 +00001676 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001677 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001678 }
1679
1680 if (types::isCXX(InputType)) {
1681 bool CXXExceptionsEnabled = ExceptionsEnabled;
1682
Eric Christopher84fbdb42011-08-19 00:30:14 +00001683 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1684 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001685 options::OPT_fexceptions,
1686 options::OPT_fno_exceptions)) {
1687 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1688 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001689 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001690 CXXExceptionsEnabled = false;
1691 }
1692
1693 if (CXXExceptionsEnabled) {
1694 CmdArgs.push_back("-fcxx-exceptions");
1695
1696 ShouldUseExceptionTables = true;
1697 }
1698 }
1699
1700 if (ShouldUseExceptionTables)
1701 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001702}
1703
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001704static bool ShouldDisableAutolink(const ArgList &Args,
1705 const ToolChain &TC) {
1706 bool Default = true;
1707 if (TC.getTriple().isOSDarwin()) {
1708 // The native darwin assembler doesn't support the linker_option directives,
1709 // so we disable them if we think the .s file will be passed to it.
1710 Default = TC.useIntegratedAs();
1711 }
1712 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1713 Default);
1714}
1715
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001716static bool ShouldDisableCFI(const ArgList &Args,
1717 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001718 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001719 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001720 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001721 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001722 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001723 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001724 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001725 options::OPT_fno_dwarf2_cfi_asm,
1726 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001727}
1728
Ted Kremenek62093662013-03-12 17:02:12 +00001729static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1730 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001731 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1732 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001733 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001734 return !UseDwarfDirectory;
1735}
1736
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001737/// \brief Check whether the given input tree contains any compilation actions.
1738static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001739 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001740 return true;
1741
1742 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1743 if (ContainsCompileAction(*it))
1744 return true;
1745
1746 return false;
1747}
1748
1749/// \brief Check if -relax-all should be passed to the internal assembler.
1750/// This is done by default when compiling non-assembler source with -O0.
1751static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1752 bool RelaxDefault = true;
1753
1754 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1755 RelaxDefault = A->getOption().matches(options::OPT_O0);
1756
1757 if (RelaxDefault) {
1758 RelaxDefault = false;
1759 for (ActionList::const_iterator it = C.getActions().begin(),
1760 ie = C.getActions().end(); it != ie; ++it) {
1761 if (ContainsCompileAction(*it)) {
1762 RelaxDefault = true;
1763 break;
1764 }
1765 }
1766 }
1767
1768 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1769 RelaxDefault);
1770}
1771
David Blaikie9260ed62013-07-25 21:19:01 +00001772static void CollectArgsForIntegratedAssembler(Compilation &C,
1773 const ArgList &Args,
1774 ArgStringList &CmdArgs,
1775 const Driver &D) {
1776 if (UseRelaxAll(C, Args))
1777 CmdArgs.push_back("-mrelax-all");
1778
David Peixottodfb66142013-11-14 22:52:58 +00001779 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001780 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001781 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1782 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1783 // arg after parsing the '-I' arg.
1784 bool TakeNextArg = false;
1785
David Blaikie9260ed62013-07-25 21:19:01 +00001786 // When using an integrated assembler, translate -Wa, and -Xassembler
1787 // options.
1788 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1789 options::OPT_Xassembler),
1790 ie = Args.filtered_end(); it != ie; ++it) {
1791 const Arg *A = *it;
1792 A->claim();
1793
1794 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1795 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001796 if (TakeNextArg) {
1797 CmdArgs.push_back(Value.data());
1798 TakeNextArg = false;
1799 continue;
1800 }
David Blaikie9260ed62013-07-25 21:19:01 +00001801
1802 if (Value == "-force_cpusubtype_ALL") {
1803 // Do nothing, this is the default and we don't support anything else.
1804 } else if (Value == "-L") {
1805 CmdArgs.push_back("-msave-temp-labels");
1806 } else if (Value == "--fatal-warnings") {
1807 CmdArgs.push_back("-mllvm");
1808 CmdArgs.push_back("-fatal-assembler-warnings");
1809 } else if (Value == "--noexecstack") {
1810 CmdArgs.push_back("-mnoexecstack");
David Peixottodfb66142013-11-14 22:52:58 +00001811 } else if (Value.startswith("-I")) {
1812 CmdArgs.push_back(Value.data());
1813 // We need to consume the next argument if the current arg is a plain
1814 // -I. The next arg will be the include directory.
1815 if (Value == "-I")
1816 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001817 } else {
1818 D.Diag(diag::err_drv_unsupported_option_argument)
1819 << A->getOption().getName() << Value;
1820 }
1821 }
1822 }
1823}
1824
Chandler Carruth36381702013-06-23 11:28:48 +00001825static void addProfileRTLinux(
1826 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1827 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1828 Args.hasArg(options::OPT_fprofile_generate) ||
1829 Args.hasArg(options::OPT_fcreate_profile) ||
1830 Args.hasArg(options::OPT_coverage)))
1831 return;
1832
1833 // The profile runtime is located in the Linux library directory and has name
1834 // "libclang_rt.profile-<ArchName>.a".
1835 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1836 llvm::sys::path::append(
1837 LibProfile, "lib", "linux",
1838 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1839
1840 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1841}
1842
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001843static void addSanitizerRTLinkFlagsLinux(
1844 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001845 const StringRef Sanitizer, bool BeforeLibStdCXX,
1846 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001847 // Sanitizer runtime is located in the Linux library directory and
1848 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1849 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1850 llvm::sys::path::append(
1851 LibSanitizer, "lib", "linux",
1852 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001853
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001854 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1855 // etc.) so that the linker picks custom versions of the global 'operator
1856 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001857 // strategy of inserting it at the front of the link command. It also
1858 // needs to be forced to end up in the executable, so wrap it in
1859 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001860 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001861 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001862 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001863 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001864
1865 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1866 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1867
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001868 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001869 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001870 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001871 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001872
1873 // If possible, use a dynamic symbols file to export the symbols from the
1874 // runtime library. If we can't do so, use -export-dynamic instead to export
1875 // all symbols from the binary.
1876 if (ExportSymbols) {
1877 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1878 CmdArgs.push_back(
1879 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1880 else
1881 CmdArgs.push_back("-export-dynamic");
1882 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001883}
1884
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001885/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1886/// This needs to be called before we add the C run-time (malloc, etc).
1887static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001888 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001889 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001890 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1891 llvm::sys::path::append(LibAsan, "lib", "linux",
1892 (Twine("libclang_rt.asan-") +
1893 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001894 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001895 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001896 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001897 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001898 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001899}
1900
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001901/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1902/// This needs to be called before we add the C run-time (malloc, etc).
1903static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1904 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001905 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001906 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001907}
1908
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001909/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1910/// This needs to be called before we add the C run-time (malloc, etc).
1911static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1912 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001913 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001914 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001915}
1916
1917/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1918/// This needs to be called before we add the C run-time (malloc, etc).
1919static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1920 ArgStringList &CmdArgs) {
1921 if (!Args.hasArg(options::OPT_shared))
1922 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001923}
1924
Richard Smithe30752c2012-10-09 19:52:38 +00001925/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1926/// (Linux).
1927static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001928 ArgStringList &CmdArgs, bool IsCXX,
1929 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001930 // Need a copy of sanitizer_common. This could come from another sanitizer
1931 // runtime; if we're not including one, include our own copy.
1932 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001933 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1934
1935 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1936
1937 // Only include the bits of the runtime which need a C++ ABI library if
1938 // we're linking in C++ mode.
1939 if (IsCXX)
1940 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001941}
1942
Peter Collingbournec3772752013-08-07 22:47:34 +00001943static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1944 ArgStringList &CmdArgs) {
1945 if (!Args.hasArg(options::OPT_shared))
1946 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1947}
1948
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001949static bool shouldUseFramePointerForTarget(const ArgList &Args,
1950 const llvm::Triple &Triple) {
1951 switch (Triple.getArch()) {
1952 // Don't use a frame pointer on linux if optimizing for certain targets.
1953 case llvm::Triple::mips64:
1954 case llvm::Triple::mips64el:
1955 case llvm::Triple::mips:
1956 case llvm::Triple::mipsel:
1957 case llvm::Triple::systemz:
1958 case llvm::Triple::x86:
1959 case llvm::Triple::x86_64:
1960 if (Triple.isOSLinux())
1961 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1962 if (!A->getOption().matches(options::OPT_O0))
1963 return false;
1964 return true;
1965 case llvm::Triple::xcore:
1966 return false;
1967 default:
1968 return true;
1969 }
1970}
1971
Rafael Espindola224dd632011-12-14 21:02:23 +00001972static bool shouldUseFramePointer(const ArgList &Args,
1973 const llvm::Triple &Triple) {
1974 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1975 options::OPT_fomit_frame_pointer))
1976 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1977
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001978 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001979}
1980
Eric Christopherb7d97e92013-04-03 01:58:53 +00001981static bool shouldUseLeafFramePointer(const ArgList &Args,
1982 const llvm::Triple &Triple) {
1983 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1984 options::OPT_momit_leaf_frame_pointer))
1985 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1986
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001987 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001988}
1989
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001990/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001991static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001992 SmallString<128> cwd;
1993 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001994 CmdArgs.push_back("-fdebug-compilation-dir");
1995 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001996 }
1997}
1998
Eric Christopherd3804002013-02-22 20:12:52 +00001999static const char *SplitDebugName(const ArgList &Args,
2000 const InputInfoList &Inputs) {
2001 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2002 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2003 SmallString<128> T(FinalOutput->getValue());
2004 llvm::sys::path::replace_extension(T, "dwo");
2005 return Args.MakeArgString(T);
2006 } else {
2007 // Use the compilation dir.
2008 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
2009 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2010 llvm::sys::path::replace_extension(F, "dwo");
2011 T += F;
2012 return Args.MakeArgString(F);
2013 }
2014}
2015
2016static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2017 const Tool &T, const JobAction &JA,
2018 const ArgList &Args, const InputInfo &Output,
2019 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002020 ArgStringList ExtractArgs;
2021 ExtractArgs.push_back("--extract-dwo");
2022
2023 ArgStringList StripArgs;
2024 StripArgs.push_back("--strip-dwo");
2025
2026 // Grabbing the output of the earlier compile step.
2027 StripArgs.push_back(Output.getFilename());
2028 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002029 ExtractArgs.push_back(OutFile);
2030
2031 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002032 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002033
2034 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002035 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002036
2037 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002038 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002039}
2040
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002041static bool isOptimizationLevelFast(const ArgList &Args) {
2042 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2043 if (A->getOption().matches(options::OPT_Ofast))
2044 return true;
2045 return false;
2046}
2047
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002048/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2049static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2050 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002051 if (A->getOption().matches(options::OPT_O4) ||
2052 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002053 return true;
2054
2055 if (A->getOption().matches(options::OPT_O0))
2056 return false;
2057
2058 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2059
Rafael Espindola91780de2013-08-26 14:05:41 +00002060 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002061 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002062 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002063 return true;
2064
2065 // Don't vectorize -Oz.
2066 if (S == "z")
2067 return false;
2068
2069 unsigned OptLevel = 0;
2070 if (S.getAsInteger(10, OptLevel))
2071 return false;
2072
2073 return OptLevel > 1;
2074 }
2075
2076 return false;
2077}
2078
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002079void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002080 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002081 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002082 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002083 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002084 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2085 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002086 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002087 ArgStringList CmdArgs;
2088
Daniel Dunbare521a892009-03-31 20:53:55 +00002089 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2090
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002091 // Invoke ourselves in -cc1 mode.
2092 //
2093 // FIXME: Implement custom jobs for internal actions.
2094 CmdArgs.push_back("-cc1");
2095
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002096 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002097 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002098 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002099 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002100
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002101 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002102 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002103
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002104 if (isa<AnalyzeJobAction>(JA)) {
2105 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2106 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002107 } else if (isa<MigrateJobAction>(JA)) {
2108 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002109 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002110 if (Output.getType() == types::TY_Dependencies)
2111 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002112 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002113 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002114 if (Args.hasArg(options::OPT_rewrite_objc) &&
2115 !Args.hasArg(options::OPT_g_Group))
2116 CmdArgs.push_back("-P");
2117 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002118 } else if (isa<AssembleJobAction>(JA)) {
2119 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002120
David Blaikie9260ed62013-07-25 21:19:01 +00002121 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002122
2123 // Also ignore explicit -force_cpusubtype_ALL option.
2124 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002125 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002126 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002127 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002128
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002129 if (JA.getType() == types::TY_Nothing)
2130 CmdArgs.push_back("-fsyntax-only");
2131 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002132 CmdArgs.push_back("-emit-pch");
2133 else
2134 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002135 } else {
2136 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002137
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002138 if (JA.getType() == types::TY_Nothing) {
2139 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002140 } else if (JA.getType() == types::TY_LLVM_IR ||
2141 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002142 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002143 } else if (JA.getType() == types::TY_LLVM_BC ||
2144 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002145 CmdArgs.push_back("-emit-llvm-bc");
2146 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002147 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002148 } else if (JA.getType() == types::TY_AST) {
2149 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002150 } else if (JA.getType() == types::TY_ModuleFile) {
2151 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002152 } else if (JA.getType() == types::TY_RewrittenObjC) {
2153 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002154 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002155 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2156 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002157 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002158 } else {
2159 assert(JA.getType() == types::TY_PP_Asm &&
2160 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002161 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002162 }
2163
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002164 // The make clang go fast button.
2165 CmdArgs.push_back("-disable-free");
2166
John McCallbb79b5f2010-02-13 03:50:24 +00002167 // Disable the verification pass in -asserts builds.
2168#ifdef NDEBUG
2169 CmdArgs.push_back("-disable-llvm-verifier");
2170#endif
2171
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002172 // Set the main file name, so that debug info works even with
2173 // -save-temps.
2174 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002175 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002176
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002177 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002178 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002179 if (Args.hasArg(options::OPT_static))
2180 CmdArgs.push_back("-static-define");
2181
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002182 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002183 // Enable region store model by default.
2184 CmdArgs.push_back("-analyzer-store=region");
2185
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002186 // Treat blocks as analysis entry points.
2187 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2188
Ted Kremenek49c79792011-03-24 00:28:47 +00002189 CmdArgs.push_back("-analyzer-eagerly-assume");
2190
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002191 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002192 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002193 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002194
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002195 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2196 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002197
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002198 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002199 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002200
2201 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002202
Jordan Rose10ad0812013-04-05 17:55:07 +00002203 if (types::isCXX(Inputs[0].getType()))
2204 CmdArgs.push_back("-analyzer-checker=cplusplus");
2205
Ted Kremenek37e96522012-01-26 02:27:38 +00002206 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002207 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2208 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2209 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2210 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2211 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2212 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002213 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002214
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002215 // Set the output format. The default is plist, for (lame) historical
2216 // reasons.
2217 CmdArgs.push_back("-analyzer-output");
2218 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002219 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002220 else
2221 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002222
Ted Kremenekfe449a22010-03-22 22:32:05 +00002223 // Disable the presentation of standard compiler warnings when
2224 // using --analyze. We only want to show static analyzer diagnostics
2225 // or frontend errors.
2226 CmdArgs.push_back("-w");
2227
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002228 // Add -Xanalyzer arguments when running as analyzer.
2229 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002230 }
2231
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002232 CheckCodeGenerationOptions(D, Args);
2233
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002234 bool PIE = getToolChain().isPIEDefault();
2235 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002236 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002237
Alexey Samsonov090301e2013-04-09 12:28:19 +00002238 // For the PIC and PIE flag options, this logic is different from the
2239 // legacy logic in very old versions of GCC, as that logic was just
2240 // a bug no one had ever fixed. This logic is both more rational and
2241 // consistent with GCC's new logic now that the bugs are fixed. The last
2242 // argument relating to either PIC or PIE wins, and no other argument is
2243 // used. If the last argument is any flavor of the '-fno-...' arguments,
2244 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2245 // at the same level.
2246 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2247 options::OPT_fpic, options::OPT_fno_pic,
2248 options::OPT_fPIE, options::OPT_fno_PIE,
2249 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002250 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2251 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002252 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002253 if (LastPICArg) {
2254 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002255 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2256 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2257 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2258 PIC = PIE || O.matches(options::OPT_fPIC) ||
2259 O.matches(options::OPT_fpic);
2260 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2261 O.matches(options::OPT_fPIC);
2262 } else {
2263 PIE = PIC = false;
2264 }
2265 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002266 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002267
Nick Lewycky609dd662013-10-11 03:33:53 +00002268 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002269 // specified while enabling PIC enabled level 1 PIC, just force it back to
2270 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2271 // informal testing).
2272 if (PIC && getToolChain().getTriple().isOSDarwin())
2273 IsPICLevelTwo |= getToolChain().isPICDefault();
2274
Chandler Carruthc0c04552012-04-08 16:40:35 +00002275 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2276 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002277 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002278 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002279 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002280 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002281 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002282 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002283
Chandler Carruth76a943b2012-11-19 03:52:03 +00002284 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2285 // This is a very special mode. It trumps the other modes, almost no one
2286 // uses it, and it isn't even valid on any OS but Darwin.
2287 if (!getToolChain().getTriple().isOSDarwin())
2288 D.Diag(diag::err_drv_unsupported_opt_for_target)
2289 << A->getSpelling() << getToolChain().getTriple().str();
2290
2291 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2292
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002293 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002294 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002295
Chandler Carruth76a943b2012-11-19 03:52:03 +00002296 // Only a forced PIC mode can cause the actual compile to have PIC defines
2297 // etc., no flags are sufficient. This behavior was selected to closely
2298 // match that of llvm-gcc and Apple GCC before that.
2299 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2300 CmdArgs.push_back("-pic-level");
2301 CmdArgs.push_back("2");
2302 }
2303 } else {
2304 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2305 // handled in Clang's IRGen by the -pie-level flag.
2306 CmdArgs.push_back("-mrelocation-model");
2307 CmdArgs.push_back(PIC ? "pic" : "static");
2308
2309 if (PIC) {
2310 CmdArgs.push_back("-pic-level");
2311 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2312 if (PIE) {
2313 CmdArgs.push_back("-pie-level");
2314 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2315 }
2316 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002317 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002318
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002319 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2320 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002321 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002322
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002323 // LLVM Code Generator Options.
2324
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002325 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2326 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002327 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002328 }
2329
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002330 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2331 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002332 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002333 D.Diag(diag::err_drv_unsupported_opt_for_target)
2334 << A->getSpelling() << getToolChain().getTriple().str();
2335 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2336 CmdArgs.push_back("-fpcc-struct-return");
2337 } else {
2338 assert(A->getOption().matches(options::OPT_freg_struct_return));
2339 CmdArgs.push_back("-freg-struct-return");
2340 }
2341 }
2342
Roman Divacky65b88cd2011-03-01 17:40:53 +00002343 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2344 CmdArgs.push_back("-mrtd");
2345
Rafael Espindola224dd632011-12-14 21:02:23 +00002346 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002347 CmdArgs.push_back("-mdisable-fp-elim");
2348 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2349 options::OPT_fno_zero_initialized_in_bss))
2350 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002351
2352 bool OFastEnabled = isOptimizationLevelFast(Args);
2353 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2354 // enabled. This alias option is being used to simplify the hasFlag logic.
2355 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2356 options::OPT_fstrict_aliasing;
2357 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002358 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002359 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002360 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2361 options::OPT_fno_struct_path_tbaa))
2362 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002363 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2364 false))
2365 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002366 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2367 options::OPT_fno_optimize_sibling_calls))
2368 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002369
Eric Christopher006208c2013-04-04 06:29:47 +00002370 // Handle segmented stacks.
2371 if (Args.hasArg(options::OPT_fsplit_stack))
2372 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002373
2374 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2375 // This alias option is being used to simplify the getLastArg logic.
2376 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2377 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002378
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002379 // Handle various floating point optimization flags, mapping them to the
2380 // appropriate LLVM code generation flags. The pattern for all of these is to
2381 // default off the codegen optimizations, and if any flag enables them and no
2382 // flag disables them after the flag enabling them, enable the codegen
2383 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002384 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002385 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002386 options::OPT_ffinite_math_only,
2387 options::OPT_fno_finite_math_only,
2388 options::OPT_fhonor_infinities,
2389 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002390 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2391 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002392 A->getOption().getID() != options::OPT_fhonor_infinities)
2393 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002394 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002395 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002396 options::OPT_ffinite_math_only,
2397 options::OPT_fno_finite_math_only,
2398 options::OPT_fhonor_nans,
2399 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002400 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2401 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002402 A->getOption().getID() != options::OPT_fhonor_nans)
2403 CmdArgs.push_back("-menable-no-nans");
2404
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002405 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2406 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002407 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002408 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002409 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002410 options::OPT_fno_math_errno)) {
2411 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2412 // However, turning *off* -ffast_math merely restores the toolchain default
2413 // (which may be false).
2414 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2415 A->getOption().getID() == options::OPT_ffast_math ||
2416 A->getOption().getID() == options::OPT_Ofast)
2417 MathErrno = false;
2418 else if (A->getOption().getID() == options::OPT_fmath_errno)
2419 MathErrno = true;
2420 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002421 if (MathErrno)
2422 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002423
2424 // There are several flags which require disabling very specific
2425 // optimizations. Any of these being disabled forces us to turn off the
2426 // entire set of LLVM optimizations, so collect them through all the flag
2427 // madness.
2428 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002429 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002430 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002431 options::OPT_funsafe_math_optimizations,
2432 options::OPT_fno_unsafe_math_optimizations,
2433 options::OPT_fassociative_math,
2434 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002435 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2436 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002437 A->getOption().getID() != options::OPT_fno_associative_math)
2438 AssociativeMath = true;
2439 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002440 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002441 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002442 options::OPT_funsafe_math_optimizations,
2443 options::OPT_fno_unsafe_math_optimizations,
2444 options::OPT_freciprocal_math,
2445 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002446 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2447 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002448 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2449 ReciprocalMath = true;
2450 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002451 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002452 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002453 options::OPT_funsafe_math_optimizations,
2454 options::OPT_fno_unsafe_math_optimizations,
2455 options::OPT_fsigned_zeros,
2456 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002457 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2458 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002459 A->getOption().getID() != options::OPT_fsigned_zeros)
2460 SignedZeros = false;
2461 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002462 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002463 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002464 options::OPT_funsafe_math_optimizations,
2465 options::OPT_fno_unsafe_math_optimizations,
2466 options::OPT_ftrapping_math,
2467 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002468 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2469 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002470 A->getOption().getID() != options::OPT_ftrapping_math)
2471 TrappingMath = false;
2472 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2473 !TrappingMath)
2474 CmdArgs.push_back("-menable-unsafe-fp-math");
2475
Lang Hamesaa53b932012-07-06 00:59:19 +00002476
2477 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002478 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002479 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002480 options::OPT_ffp_contract)) {
2481 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002482 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002483 if (Val == "fast" || Val == "on" || Val == "off") {
2484 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2485 } else {
2486 D.Diag(diag::err_drv_unsupported_option_argument)
2487 << A->getOption().getName() << Val;
2488 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002489 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2490 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002491 // If fast-math is set then set the fp-contract mode to fast.
2492 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2493 }
2494 }
2495
Bob Wilson6a039162012-07-19 03:52:53 +00002496 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2497 // and if we find them, tell the frontend to provide the appropriate
2498 // preprocessor macros. This is distinct from enabling any optimizations as
2499 // these options induce language changes which must survive serialization
2500 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002501 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2502 options::OPT_fno_fast_math))
2503 if (!A->getOption().matches(options::OPT_fno_fast_math))
2504 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002505 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2506 if (A->getOption().matches(options::OPT_ffinite_math_only))
2507 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002508
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002509 // Decide whether to use verbose asm. Verbose assembly is the default on
2510 // toolchains which have the integrated assembler on by default.
2511 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2512 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002513 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002514 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002515 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002516
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002517 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2518 CmdArgs.push_back("-mdebug-pass");
2519 CmdArgs.push_back("Structure");
2520 }
2521 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2522 CmdArgs.push_back("-mdebug-pass");
2523 CmdArgs.push_back("Arguments");
2524 }
2525
John McCall8517abc2010-02-19 02:45:38 +00002526 // Enable -mconstructor-aliases except on darwin, where we have to
2527 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002528 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002529 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002530
John McCall7ef5cb32011-03-18 02:56:14 +00002531 // Darwin's kernel doesn't support guard variables; just die if we
2532 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002533 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002534 CmdArgs.push_back("-fforbid-guard-variables");
2535
Douglas Gregordbe39272011-02-01 15:15:22 +00002536 if (Args.hasArg(options::OPT_mms_bitfields)) {
2537 CmdArgs.push_back("-mms-bitfields");
2538 }
John McCall8517abc2010-02-19 02:45:38 +00002539
Daniel Dunbar306945d2009-09-16 06:17:29 +00002540 // This is a coarse approximation of what llvm-gcc actually does, both
2541 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2542 // complicated ways.
2543 bool AsynchronousUnwindTables =
2544 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2545 options::OPT_fno_asynchronous_unwind_tables,
2546 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002547 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002548 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2549 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002550 CmdArgs.push_back("-munwind-tables");
2551
Chandler Carruth05fb5852012-11-21 23:40:23 +00002552 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002553
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002554 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2555 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002556 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002557 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002558
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002559 // FIXME: Handle -mtune=.
2560 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002561
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002562 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002563 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002564 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002565 }
2566
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002567 // Add the target cpu
2568 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2569 llvm::Triple ETriple(ETripleStr);
2570 std::string CPU = getCPUName(Args, ETriple);
2571 if (!CPU.empty()) {
2572 CmdArgs.push_back("-target-cpu");
2573 CmdArgs.push_back(Args.MakeArgString(CPU));
2574 }
2575
Rafael Espindolaeb265472013-08-21 21:59:03 +00002576 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2577 CmdArgs.push_back("-mfpmath");
2578 CmdArgs.push_back(A->getValue());
2579 }
2580
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002581 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002582 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002583
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002584 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002585 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002586 default:
2587 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002588
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002589 case llvm::Triple::arm:
2590 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002591 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002592 break;
2593
Eric Christopher0b26a612010-03-02 02:41:08 +00002594 case llvm::Triple::mips:
2595 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002596 case llvm::Triple::mips64:
2597 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002598 AddMIPSTargetArgs(Args, CmdArgs);
2599 break;
2600
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002601 case llvm::Triple::sparc:
2602 AddSparcTargetArgs(Args, CmdArgs);
2603 break;
2604
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002605 case llvm::Triple::x86:
2606 case llvm::Triple::x86_64:
2607 AddX86TargetArgs(Args, CmdArgs);
2608 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002609
2610 case llvm::Triple::hexagon:
2611 AddHexagonTargetArgs(Args, CmdArgs);
2612 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002613 }
2614
Hans Wennborg75958c42013-08-08 00:17:41 +00002615 // Add clang-cl arguments.
2616 if (getToolChain().getDriver().IsCLMode())
2617 AddClangCLArgs(Args, CmdArgs);
2618
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002619 // Pass the linker version in use.
2620 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2621 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002622 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002623 }
2624
Eric Christopherb7d97e92013-04-03 01:58:53 +00002625 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002626 CmdArgs.push_back("-momit-leaf-frame-pointer");
2627
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002628 // Explicitly error on some things we know we don't support and can't just
2629 // ignore.
2630 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002631 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2632 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002633 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002634 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002635 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002636 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2637 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002638 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002639 << Unsupported->getOption().getName();
2640 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002641 }
2642
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002643 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002644 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002645 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002646 CmdArgs.push_back("-header-include-file");
2647 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2648 D.CCPrintHeadersFilename : "-");
2649 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002650 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002651 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002652
Chad Rosierbe10f982011-08-02 17:58:04 +00002653 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002654 CmdArgs.push_back("-diagnostic-log-file");
2655 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2656 D.CCLogDiagnosticsFilename : "-");
2657 }
2658
Manman Ren17bdb0f2013-11-20 20:22:14 +00002659 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2660 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002661 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002662 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002663 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2664 // FIXME: we should support specifying dwarf version with
2665 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002666 CmdArgs.push_back("-gline-tables-only");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002667 // Default is dwarf-2 for darwin.
2668 if (getToolChain().getTriple().isOSDarwin())
2669 CmdArgs.push_back("-gdwarf-2");
2670 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002671 CmdArgs.push_back("-gdwarf-2");
2672 else if (A->getOption().matches(options::OPT_gdwarf_3))
2673 CmdArgs.push_back("-gdwarf-3");
2674 else if (A->getOption().matches(options::OPT_gdwarf_4))
2675 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002676 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002677 !A->getOption().matches(options::OPT_ggdb0)) {
2678 // Default is dwarf-2 for darwin.
2679 if (getToolChain().getTriple().isOSDarwin())
2680 CmdArgs.push_back("-gdwarf-2");
2681 else
2682 CmdArgs.push_back("-g");
2683 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002684 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002685
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002686 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2687 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002688 if (Args.hasArg(options::OPT_gcolumn_info))
2689 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002690
Eric Christopher138c32b2013-09-13 22:37:55 +00002691 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002692 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2693 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002694 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002695 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002696 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002697 CmdArgs.push_back("-g");
2698 CmdArgs.push_back("-backend-option");
2699 CmdArgs.push_back("-split-dwarf=Enable");
2700 }
2701
Eric Christopher138c32b2013-09-13 22:37:55 +00002702 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2703 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2704 CmdArgs.push_back("-backend-option");
2705 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2706 }
Eric Christophereec89c22013-06-18 00:03:50 +00002707
2708 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2709
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002710 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2711 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2712
Chris Lattner3c77a352010-06-22 00:03:40 +00002713 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2714
Nick Lewycky207bce32011-04-21 23:44:07 +00002715 if (Args.hasArg(options::OPT_ftest_coverage) ||
2716 Args.hasArg(options::OPT_coverage))
2717 CmdArgs.push_back("-femit-coverage-notes");
2718 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2719 Args.hasArg(options::OPT_coverage))
2720 CmdArgs.push_back("-femit-coverage-data");
2721
Nick Lewycky480cb992011-05-04 20:46:58 +00002722 if (C.getArgs().hasArg(options::OPT_c) ||
2723 C.getArgs().hasArg(options::OPT_S)) {
2724 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002725 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002726 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002727 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002728 SmallString<128> Pwd;
2729 if (!llvm::sys::fs::current_path(Pwd)) {
2730 llvm::sys::path::append(Pwd, CoverageFilename.str());
2731 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002732 }
2733 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002734 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002735 }
2736 }
2737
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002738 // Pass options for controlling the default header search paths.
2739 if (Args.hasArg(options::OPT_nostdinc)) {
2740 CmdArgs.push_back("-nostdsysteminc");
2741 CmdArgs.push_back("-nobuiltininc");
2742 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002743 if (Args.hasArg(options::OPT_nostdlibinc))
2744 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002745 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2746 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2747 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002748
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002749 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002750 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002751 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002752
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002753 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2754
Ted Kremenekf7639e12012-03-06 20:06:33 +00002755 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002756 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002757 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002758 options::OPT_ccc_arcmt_modify,
2759 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002760 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002761 switch (A->getOption().getID()) {
2762 default:
2763 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002764 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002765 CmdArgs.push_back("-arcmt-check");
2766 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002767 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002768 CmdArgs.push_back("-arcmt-modify");
2769 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002770 case options::OPT_ccc_arcmt_migrate:
2771 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002772 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002773 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002774
2775 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2776 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002777 break;
John McCalld70fb982011-06-15 23:25:17 +00002778 }
2779 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002780 } else {
2781 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2782 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2783 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002784 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002785
Ted Kremenekf7639e12012-03-06 20:06:33 +00002786 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2787 if (ARCMTEnabled) {
2788 D.Diag(diag::err_drv_argument_not_allowed_with)
2789 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2790 }
2791 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002792 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002793
2794 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002795 options::OPT_objcmt_migrate_subscripting,
2796 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002797 // None specified, means enable them all.
2798 CmdArgs.push_back("-objcmt-migrate-literals");
2799 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002800 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002801 } else {
2802 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2803 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002804 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002805 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002806 } else {
2807 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2808 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2809 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2810 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2811 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2812 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2813 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2814 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2815 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2816 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2817 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2818 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2819 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002820 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002821 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002822 }
2823
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002824 // Add preprocessing options like -I, -D, etc. if we are using the
2825 // preprocessor.
2826 //
2827 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002828 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002829 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002830
Rafael Espindolaa7431922011-07-21 23:40:37 +00002831 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2832 // that "The compiler can only warn and ignore the option if not recognized".
2833 // When building with ccache, it will pass -D options to clang even on
2834 // preprocessed inputs and configure concludes that -fPIC is not supported.
2835 Args.ClaimAllArgs(options::OPT_D);
2836
Alp Toker7874bdc2013-11-15 20:40:58 +00002837 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002838 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2839 if (A->getOption().matches(options::OPT_O4)) {
2840 CmdArgs.push_back("-O3");
2841 D.Diag(diag::warn_O4_is_O3);
2842 } else {
2843 A->render(Args, CmdArgs);
2844 }
2845 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002846
Chad Rosier86b82082012-12-12 20:06:31 +00002847 // Don't warn about unused -flto. This can happen when we're preprocessing or
2848 // precompiling.
2849 Args.ClaimAllArgs(options::OPT_flto);
2850
Daniel Dunbar945577c2009-10-29 02:24:45 +00002851 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002852 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2853 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002854 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002855 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002856
2857 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002858 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002859 //
2860 // If a std is supplied, only add -trigraphs if it follows the
2861 // option.
2862 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2863 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002864 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002865 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002866 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002867 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002868 else
2869 Std->render(Args, CmdArgs);
2870
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002871 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2872 options::OPT_trigraphs))
2873 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002874 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002875 } else {
2876 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002877 //
2878 // FIXME: Clang doesn't correctly handle -std= when the input language
2879 // doesn't match. For the time being just ignore this for C++ inputs;
2880 // eventually we want to do all the standard defaulting here instead of
2881 // splitting it between the driver and clang -cc1.
2882 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002883 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2884 "-std=", /*Joined=*/true);
2885 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2886 CmdArgs.push_back("-std=c++11");
2887
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002888 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002889 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002890
Richard Smith282b4492013-09-04 22:50:31 +00002891 // GCC's behavior for -Wwrite-strings is a bit strange:
2892 // * In C, this "warning flag" changes the types of string literals from
2893 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2894 // for the discarded qualifier.
2895 // * In C++, this is just a normal warning flag.
2896 //
2897 // Implementing this warning correctly in C is hard, so we follow GCC's
2898 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2899 // a non-const char* in C, rather than using this crude hack.
2900 if (!types::isCXX(InputType)) {
Rafael Espindola0df9e162013-11-05 21:43:54 +00002901 DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel(
2902 diag::warn_deprecated_string_literal_conversion_c, SourceLocation());
2903 if (DiagLevel > DiagnosticsEngine::Ignored)
Richard Smith282b4492013-09-04 22:50:31 +00002904 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002905 }
2906
Chandler Carruth61fbf622011-04-23 09:27:53 +00002907 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002908 // during C++ compilation, which it is by default. GCC keeps this define even
2909 // in the presence of '-w', match this behavior bug-for-bug.
2910 if (types::isCXX(InputType) &&
2911 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2912 true)) {
2913 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002914 }
2915
Chandler Carruthe0391482010-05-22 02:21:53 +00002916 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2917 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2918 if (Asm->getOption().matches(options::OPT_fasm))
2919 CmdArgs.push_back("-fgnu-keywords");
2920 else
2921 CmdArgs.push_back("-fno-gnu-keywords");
2922 }
2923
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002924 if (ShouldDisableCFI(Args, getToolChain()))
2925 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002926
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002927 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2928 CmdArgs.push_back("-fno-dwarf-directory-asm");
2929
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002930 if (ShouldDisableAutolink(Args, getToolChain()))
2931 CmdArgs.push_back("-fno-autolink");
2932
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002933 // Add in -fdebug-compilation-dir if necessary.
2934 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002935
Richard Smith9a568822011-11-21 19:36:32 +00002936 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2937 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002938 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002939 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002940 }
2941
Richard Smith79c927b2013-11-06 19:31:51 +00002942 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2943 CmdArgs.push_back("-foperator-arrow-depth");
2944 CmdArgs.push_back(A->getValue());
2945 }
2946
Richard Smith9a568822011-11-21 19:36:32 +00002947 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2948 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002949 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002950 }
2951
Richard Smitha3d3bd22013-05-08 02:12:03 +00002952 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2953 CmdArgs.push_back("-fconstexpr-steps");
2954 CmdArgs.push_back(A->getValue());
2955 }
2956
Richard Smithb3a14522013-02-22 01:59:51 +00002957 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2958 CmdArgs.push_back("-fbracket-depth");
2959 CmdArgs.push_back(A->getValue());
2960 }
2961
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002962 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2963 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002964 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002965 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002966 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2967 } else
2968 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002969 }
2970
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002971
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002972 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002973 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002974
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002975 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2976 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002977 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002978 }
David Chisnall5778fce2009-08-31 16:41:57 +00002979
Chris Lattnere23003d2010-01-09 21:54:33 +00002980 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2981 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002982 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002983 }
2984
Chris Lattnerb35583d2010-04-07 20:49:23 +00002985 CmdArgs.push_back("-ferror-limit");
2986 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002987 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002988 else
2989 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002990
Chandler Carrutha77a7272010-05-06 04:55:18 +00002991 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2992 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002993 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002994 }
2995
2996 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2997 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002998 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002999 }
3000
Richard Smithf6f003a2011-12-16 19:06:07 +00003001 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3002 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003003 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003004 }
3005
Daniel Dunbar2c978472009-11-04 06:24:47 +00003006 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003007 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003008 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003009 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003010 } else {
3011 // If -fmessage-length=N was not specified, determine whether this is a
3012 // terminal and, if so, implicitly define -fmessage-length appropriately.
3013 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003014 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003015 }
3016
John McCallb4a99d32013-02-19 01:57:35 +00003017 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3018 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3019 options::OPT_fvisibility_ms_compat)) {
3020 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3021 CmdArgs.push_back("-fvisibility");
3022 CmdArgs.push_back(A->getValue());
3023 } else {
3024 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3025 CmdArgs.push_back("-fvisibility");
3026 CmdArgs.push_back("hidden");
3027 CmdArgs.push_back("-ftype-visibility");
3028 CmdArgs.push_back("default");
3029 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003030 }
3031
Douglas Gregor08329632010-06-15 17:05:35 +00003032 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003033
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003034 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3035
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003036 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003037 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3038 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003039 CmdArgs.push_back("-ffreestanding");
3040
Daniel Dunbare357d562009-12-03 18:42:11 +00003041 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003042 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003043 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00003044 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00003045 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00003046 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003047 // AltiVec language extensions aren't relevant for assembling.
3048 if (!isa<PreprocessJobAction>(JA) ||
3049 Output.getType() != types::TY_PP_Asm)
3050 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003051 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3052 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003053
Peter Collingbourne32701642013-11-01 18:16:25 +00003054 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3055 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003056
Will Dietz3676d562012-12-30 20:53:28 +00003057 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3058 options::OPT_fno_sanitize_recover,
3059 true))
3060 CmdArgs.push_back("-fno-sanitize-recover");
3061
Chad Rosierae229d52013-01-29 23:31:22 +00003062 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
3063 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3064 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3065 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3066
Eric Christopher459d2712013-02-19 06:16:53 +00003067 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003068 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003069 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003070 getToolChain().getArch() == llvm::Triple::ppc64 ||
3071 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003072 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003073 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003074
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003075 if (getToolChain().SupportsProfiling())
3076 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003077
3078 // -flax-vector-conversions is default.
3079 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3080 options::OPT_fno_lax_vector_conversions))
3081 CmdArgs.push_back("-fno-lax-vector-conversions");
3082
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003083 if (Args.getLastArg(options::OPT_fapple_kext))
3084 CmdArgs.push_back("-fapple-kext");
3085
David Blaikie690f21e2012-06-14 18:55:27 +00003086 if (Args.hasFlag(options::OPT_frewrite_includes,
3087 options::OPT_fno_rewrite_includes, false))
3088 CmdArgs.push_back("-frewrite-includes");
3089
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003090 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003091 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003092 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003093 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3094 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003095
3096 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3097 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003098 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003099 }
3100
Bob Wilson14adb362012-02-03 06:27:22 +00003101 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003102
Chandler Carruth6e501032011-03-27 00:04:55 +00003103 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3104 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3105 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3106 options::OPT_fno_wrapv)) {
3107 if (A->getOption().matches(options::OPT_fwrapv))
3108 CmdArgs.push_back("-fwrapv");
3109 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3110 options::OPT_fno_strict_overflow)) {
3111 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3112 CmdArgs.push_back("-fwrapv");
3113 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003114
3115 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3116 options::OPT_fno_reroll_loops))
3117 if (A->getOption().matches(options::OPT_freroll_loops))
3118 CmdArgs.push_back("-freroll-loops");
3119
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003120 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003121 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3122 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003123
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003124 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3125
Mahesha S6a682be42012-10-27 07:47:56 +00003126
Daniel Dunbar4930e332009-11-17 08:07:36 +00003127 // -stack-protector=0 is default.
3128 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003129 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3130 options::OPT_fstack_protector_all,
3131 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003132 if (A->getOption().matches(options::OPT_fstack_protector))
3133 StackProtectorLevel = 1;
3134 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3135 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00003136 } else {
3137 StackProtectorLevel =
3138 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3139 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003140 if (StackProtectorLevel) {
3141 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003142 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003143 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003144
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003145 // --param ssp-buffer-size=
3146 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3147 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003148 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003149 if (Str.startswith("ssp-buffer-size=")) {
3150 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003151 CmdArgs.push_back("-stack-protector-buffer-size");
3152 // FIXME: Verify the argument is a valid integer.
3153 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003154 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003155 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003156 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003157 }
3158
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003159 // Translate -mstackrealign
3160 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3161 false)) {
3162 CmdArgs.push_back("-backend-option");
3163 CmdArgs.push_back("-force-align-stack");
3164 }
3165 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3166 false)) {
3167 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3168 }
3169
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003170 if (Args.hasArg(options::OPT_mstack_alignment)) {
3171 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3172 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003173 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003174 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003175 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003176 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3177 options::OPT_munaligned_access)) {
3178 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3179 CmdArgs.push_back("-backend-option");
3180 CmdArgs.push_back("-arm-strict-align");
3181 } else {
3182 CmdArgs.push_back("-backend-option");
3183 CmdArgs.push_back("-arm-no-strict-align");
3184 }
Renato Golina146a482013-08-24 14:44:41 +00003185 }
Chad Rosier60027022012-11-09 17:29:19 +00003186 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003187
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003188 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3189 options::OPT_mno_restrict_it)) {
3190 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3191 CmdArgs.push_back("-backend-option");
3192 CmdArgs.push_back("-arm-restrict-it");
3193 } else {
3194 CmdArgs.push_back("-backend-option");
3195 CmdArgs.push_back("-arm-no-restrict-it");
3196 }
3197 }
3198
Daniel Dunbard18049a2009-04-07 21:16:11 +00003199 // Forward -f options with positive and negative forms; we translate
3200 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003201 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3202 StringRef fname = A->getValue();
3203 if (!llvm::sys::fs::exists(fname))
3204 D.Diag(diag::err_drv_no_such_file) << fname;
3205 else
3206 A->render(Args, CmdArgs);
3207 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003208
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003209 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003210 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003211 CmdArgs.push_back("-fapple-kext");
3212 if (!Args.hasArg(options::OPT_fbuiltin))
3213 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003214 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003215 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003216 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003217 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003218 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003219
Nuno Lopes13c88c72009-12-16 16:59:22 +00003220 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3221 options::OPT_fno_assume_sane_operator_new))
3222 CmdArgs.push_back("-fno-assume-sane-operator-new");
3223
Daniel Dunbar4930e332009-11-17 08:07:36 +00003224 // -fblocks=0 is default.
3225 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003226 getToolChain().IsBlocksDefault()) ||
3227 (Args.hasArg(options::OPT_fgnu_runtime) &&
3228 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3229 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003230 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003231
3232 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3233 !getToolChain().hasBlocksRuntime())
3234 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003235 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003236
Douglas Gregor226173a2012-01-18 15:19:58 +00003237 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3238 // users must also pass -fcxx-modules. The latter flag will disappear once the
3239 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003240 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003241 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3242 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3243 options::OPT_fno_cxx_modules,
3244 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003245 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003246 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003247 HaveModules = true;
3248 }
3249 }
3250
Daniel Jasper07e6c402013-08-05 20:26:17 +00003251 // -fmodule-maps enables module map processing (off by default) for header
3252 // checking. It is implied by -fmodules.
3253 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3254 false)) {
3255 CmdArgs.push_back("-fmodule-maps");
3256 }
3257
Daniel Jasperac42b752013-10-21 06:34:34 +00003258 // -fmodules-decluse checks that modules used are declared so (off by
3259 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003260 if (Args.hasFlag(options::OPT_fmodules_decluse,
3261 options::OPT_fno_modules_decluse,
3262 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003263 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003264 }
3265
Daniel Jasperac42b752013-10-21 06:34:34 +00003266 // -fmodule-name specifies the module that is currently being built (or
3267 // used for header checking by -fmodule-maps).
3268 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3269 A->claim();
3270 A->render(Args, CmdArgs);
3271 }
3272
3273 // -fmodule-map-file can be used to specify a file containing module
3274 // definitions.
3275 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3276 A->claim();
3277 A->render(Args, CmdArgs);
3278 }
3279
Douglas Gregor35b04d62013-02-07 19:01:24 +00003280 // If a module path was provided, pass it along. Otherwise, use a temporary
3281 // directory.
3282 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3283 A->claim();
3284 if (HaveModules) {
3285 A->render(Args, CmdArgs);
3286 }
3287 } else if (HaveModules) {
3288 SmallString<128> DefaultModuleCache;
3289 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3290 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003291 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3292 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003293 const char Arg[] = "-fmodules-cache-path=";
3294 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3295 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003296 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3297 }
3298
3299 // Pass through all -fmodules-ignore-macro arguments.
3300 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003301 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3302 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003303
John McCalldfea9982010-04-09 19:12:06 +00003304 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003305 if (Args.hasFlag(options::OPT_fno_access_control,
3306 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003307 false))
John McCall3155f572010-04-09 19:03:51 +00003308 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003309
Anders Carlssond470fef2010-11-21 00:09:52 +00003310 // -felide-constructors is the default.
3311 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3312 options::OPT_felide_constructors,
3313 false))
3314 CmdArgs.push_back("-fno-elide-constructors");
3315
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003316 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003317 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003318 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003319 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003320
Richard Smith52be6192012-11-05 22:04:41 +00003321 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003322 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003323 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003324 Args.getLastArg(options::OPT_mkernel,
3325 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003326 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003327 D.Diag(diag::err_drv_argument_not_allowed_with)
3328 << "-fsanitize=vptr" << NoRttiArg;
3329 }
3330 }
3331
Tony Linthicum76329bf2011-12-12 21:14:55 +00003332 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003333 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003334 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003335 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003336 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003337 CmdArgs.push_back("-fshort-enums");
3338
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003339 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003340 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003341 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003342 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003343
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003344 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003345 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003346 options::OPT_fno_threadsafe_statics))
3347 CmdArgs.push_back("-fno-threadsafe-statics");
3348
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003349 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003350 if (!Args.hasFlag(
3351 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3352 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3353 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Robert Lytton6b1deb42013-11-12 10:09:22 +00003354 getToolChain().getArch() != llvm::Triple::hexagon &&
3355 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003356 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003357 CmdArgs.push_back("-fno-use-cxa-atexit");
3358
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003359 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003360 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003361 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3362 CmdArgs.push_back("-fms-extensions");
3363
Francois Pichet1b4f1632011-09-17 04:32:15 +00003364 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003365 if (Args.hasFlag(options::OPT_fms_compatibility,
3366 options::OPT_fno_ms_compatibility,
3367 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3368 Args.hasFlag(options::OPT_fms_extensions,
3369 options::OPT_fno_ms_extensions,
3370 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003371 CmdArgs.push_back("-fms-compatibility");
3372
Reid Klecknerc106fda2013-09-18 00:33:59 +00003373 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003374 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3375 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3376 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003377 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003378 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003379 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003380 else
3381 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3382 }
3383
3384
Eric Christopher5ecce122013-02-18 00:38:31 +00003385 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003386 if (Args.hasFlag(options::OPT_fborland_extensions,
3387 options::OPT_fno_borland_extensions, false))
3388 CmdArgs.push_back("-fborland-extensions");
3389
Francois Pichet02744872011-09-01 16:38:08 +00003390 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3391 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003392 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3393 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003394 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003395 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003396
Chandler Carruthe03aa552010-04-17 20:17:31 +00003397 // -fgnu-keywords default varies depending on language; only pass if
3398 // specified.
3399 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003400 options::OPT_fno_gnu_keywords))
3401 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003402
Rafael Espindola922a6242011-06-02 17:30:53 +00003403 if (Args.hasFlag(options::OPT_fgnu89_inline,
3404 options::OPT_fno_gnu89_inline,
3405 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003406 CmdArgs.push_back("-fgnu89-inline");
3407
Chad Rosier9c76d242012-03-15 22:31:42 +00003408 if (Args.hasArg(options::OPT_fno_inline))
3409 CmdArgs.push_back("-fno-inline");
3410
Chad Rosier64d6be92012-03-06 21:17:19 +00003411 if (Args.hasArg(options::OPT_fno_inline_functions))
3412 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003413
John McCall5fb5df92012-06-20 06:18:46 +00003414 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003415
John McCall5fb5df92012-06-20 06:18:46 +00003416 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003417 // legacy is the default. Next runtime is always legacy dispatch and
3418 // -fno-objc-legacy-dispatch gets ignored silently.
3419 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003420 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3421 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003422 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003423 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003424 if (getToolChain().UseObjCMixedDispatch())
3425 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3426 else
3427 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3428 }
3429 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003430
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003431 // When ObjectiveC legacy runtime is in effect on MacOSX,
3432 // turn on the option to do Array/Dictionary subscripting
3433 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003434 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3435 getToolChain().getTriple().isMacOSX() &&
3436 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3437 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003438 objcRuntime.isNeXTFamily())
3439 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3440
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003441 // -fencode-extended-block-signature=1 is default.
3442 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3443 CmdArgs.push_back("-fencode-extended-block-signature");
3444 }
3445
John McCall24fc0de2011-07-06 00:26:06 +00003446 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3447 // NOTE: This logic is duplicated in ToolChains.cpp.
3448 bool ARC = isObjCAutoRefCount(Args);
3449 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003450 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003451
John McCall24fc0de2011-07-06 00:26:06 +00003452 CmdArgs.push_back("-fobjc-arc");
3453
Chandler Carruth491db322011-11-04 07:34:47 +00003454 // FIXME: It seems like this entire block, and several around it should be
3455 // wrapped in isObjC, but for now we just use it here as this is where it
3456 // was being used previously.
3457 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3458 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3459 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3460 else
3461 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3462 }
3463
John McCall24fc0de2011-07-06 00:26:06 +00003464 // Allow the user to enable full exceptions code emission.
3465 // We define off for Objective-CC, on for Objective-C++.
3466 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3467 options::OPT_fno_objc_arc_exceptions,
3468 /*default*/ types::isCXX(InputType)))
3469 CmdArgs.push_back("-fobjc-arc-exceptions");
3470 }
3471
3472 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3473 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003474 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003475 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003476
John McCall24fc0de2011-07-06 00:26:06 +00003477 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3478 // takes precedence.
3479 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3480 if (!GCArg)
3481 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3482 if (GCArg) {
3483 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003484 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003485 << GCArg->getAsString(Args);
3486 } else if (getToolChain().SupportsObjCGC()) {
3487 GCArg->render(Args, CmdArgs);
3488 } else {
3489 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003490 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003491 << GCArg->getAsString(Args);
3492 }
3493 }
3494
John McCallb5f652e2011-06-22 00:53:57 +00003495 // Add exception args.
3496 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003497 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003498
3499 if (getToolChain().UseSjLjExceptions())
3500 CmdArgs.push_back("-fsjlj-exceptions");
3501
3502 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003503 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3504 options::OPT_fno_assume_sane_operator_new))
3505 CmdArgs.push_back("-fno-assume-sane-operator-new");
3506
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003507 // -fconstant-cfstrings is default, and may be subject to argument translation
3508 // on Darwin.
3509 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3510 options::OPT_fno_constant_cfstrings) ||
3511 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3512 options::OPT_mno_constant_cfstrings))
3513 CmdArgs.push_back("-fno-constant-cfstrings");
3514
John Thompsoned4e2952009-11-05 20:14:16 +00003515 // -fshort-wchar default varies depending on platform; only
3516 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003517 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3518 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003519
Hans Wennborg28c96312013-07-31 23:39:13 +00003520 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003521 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003522 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003523 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003524 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003525
Daniel Dunbar096ed292011-10-05 21:04:55 +00003526 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3527 // -fno-pack-struct doesn't apply to -fpack-struct=.
3528 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003529 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003530 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003531 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003532 } else if (Args.hasFlag(options::OPT_fpack_struct,
3533 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003534 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003535 }
3536
Robert Lytton0e076492013-08-13 09:43:10 +00003537 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003538 if (!Args.hasArg(options::OPT_fcommon))
3539 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003540 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003541 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003542
Daniel Dunbard18049a2009-04-07 21:16:11 +00003543 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003544 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003545 CmdArgs.push_back("-fno-common");
3546
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003547 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003548 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003549 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003550 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003551 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003552 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3553
Daniel Dunbar6358d682010-10-15 22:30:42 +00003554 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3555 if (!Args.hasFlag(options::OPT_ffor_scope,
3556 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003557 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003558 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3559
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003560 // -fcaret-diagnostics is default.
3561 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3562 options::OPT_fno_caret_diagnostics, true))
3563 CmdArgs.push_back("-fno-caret-diagnostics");
3564
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003565 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003566 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003567 options::OPT_fno_diagnostics_fixit_info))
3568 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003569
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003570 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003571 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003572 options::OPT_fno_diagnostics_show_option))
3573 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003574
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003575 if (const Arg *A =
3576 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3577 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003578 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003579 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003580
Douglas Gregor643c9222011-05-21 17:07:29 +00003581 if (const Arg *A =
3582 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3583 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003584 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003585 }
3586
Chandler Carruthb6766f02011-03-27 01:50:55 +00003587 if (Arg *A = Args.getLastArg(
3588 options::OPT_fdiagnostics_show_note_include_stack,
3589 options::OPT_fno_diagnostics_show_note_include_stack)) {
3590 if (A->getOption().matches(
3591 options::OPT_fdiagnostics_show_note_include_stack))
3592 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3593 else
3594 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3595 }
3596
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003597 // Color diagnostics are the default, unless the terminal doesn't support
3598 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003599 // Support both clang's -f[no-]color-diagnostics and gcc's
3600 // -f[no-]diagnostics-colors[=never|always|auto].
3601 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3602 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3603 it != ie; ++it) {
3604 const Option &O = (*it)->getOption();
3605 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3606 !O.matches(options::OPT_fdiagnostics_color) &&
3607 !O.matches(options::OPT_fno_color_diagnostics) &&
3608 !O.matches(options::OPT_fno_diagnostics_color) &&
3609 !O.matches(options::OPT_fdiagnostics_color_EQ))
3610 continue;
3611
3612 (*it)->claim();
3613 if (O.matches(options::OPT_fcolor_diagnostics) ||
3614 O.matches(options::OPT_fdiagnostics_color)) {
3615 ShowColors = Colors_On;
3616 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3617 O.matches(options::OPT_fno_diagnostics_color)) {
3618 ShowColors = Colors_Off;
3619 } else {
3620 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3621 StringRef value((*it)->getValue());
3622 if (value == "always")
3623 ShowColors = Colors_On;
3624 else if (value == "never")
3625 ShowColors = Colors_Off;
3626 else if (value == "auto")
3627 ShowColors = Colors_Auto;
3628 else
3629 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3630 << ("-fdiagnostics-color=" + value).str();
3631 }
3632 }
3633 if (ShowColors == Colors_On ||
3634 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003635 CmdArgs.push_back("-fcolor-diagnostics");
3636
Nico Rieck7857d462013-09-11 00:38:02 +00003637 if (Args.hasArg(options::OPT_fansi_escape_codes))
3638 CmdArgs.push_back("-fansi-escape-codes");
3639
Daniel Dunbardb097022009-06-08 21:13:54 +00003640 if (!Args.hasFlag(options::OPT_fshow_source_location,
3641 options::OPT_fno_show_source_location))
3642 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003643
Douglas Gregor643c9222011-05-21 17:07:29 +00003644 if (!Args.hasFlag(options::OPT_fshow_column,
3645 options::OPT_fno_show_column,
3646 true))
3647 CmdArgs.push_back("-fno-show-column");
3648
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003649 if (!Args.hasFlag(options::OPT_fspell_checking,
3650 options::OPT_fno_spell_checking))
3651 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003652
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003653
Chad Rosierc8e56e82012-12-05 21:08:21 +00003654 // -fno-asm-blocks is default.
3655 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3656 false))
3657 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003658
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003659 // Enable vectorization per default according to the optimization level
3660 // selected. For optimization levels that want vectorization we use the alias
3661 // option to simplify the hasFlag logic.
3662 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3663 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003664 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003665 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003666 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003667 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003668
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003669 // -fslp-vectorize is default.
3670 if (Args.hasFlag(options::OPT_fslp_vectorize,
3671 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003672 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003673
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003674 // -fno-slp-vectorize-aggressive is default.
3675 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003676 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003677 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003678
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003679 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3680 A->render(Args, CmdArgs);
3681
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003682 // -fdollars-in-identifiers default varies depending on platform and
3683 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003684 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003685 options::OPT_fno_dollars_in_identifiers)) {
3686 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003687 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003688 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003689 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003690 }
3691
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003692 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3693 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003694 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003695 options::OPT_fno_unit_at_a_time)) {
3696 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003697 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003698 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003699
Eli Friedman055c9702011-11-02 01:53:16 +00003700 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3701 options::OPT_fno_apple_pragma_pack, false))
3702 CmdArgs.push_back("-fapple-pragma-pack");
3703
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003704 // le32-specific flags:
3705 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3706 // by default.
3707 if (getToolChain().getArch() == llvm::Triple::le32) {
3708 CmdArgs.push_back("-fno-math-builtin");
3709 }
3710
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003711 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003712 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003713 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003714#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003715 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003716 (getToolChain().getArch() == llvm::Triple::arm ||
3717 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003718 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3719 CmdArgs.push_back("-fno-builtin-strcat");
3720 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3721 CmdArgs.push_back("-fno-builtin-strcpy");
3722 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003723#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003724
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003725 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003726 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003727 options::OPT_traditional_cpp)) {
3728 if (isa<PreprocessJobAction>(JA))
3729 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003730 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003731 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003732 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003733
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003734 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003735 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003736
3737 // Handle serialized diagnostics.
3738 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3739 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003740 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003741 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003742
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003743 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3744 CmdArgs.push_back("-fretain-comments-from-system-headers");
3745
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003746 // Forward -fcomment-block-commands to -cc1.
3747 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003748 // Forward -fparse-all-comments to -cc1.
3749 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003750
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003751 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3752 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003753 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003754 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3755 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003756 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003757
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003758 // We translate this by hand to the -cc1 argument, since nightly test uses
3759 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003760 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003761 CmdArgs.push_back("-disable-llvm-optzns");
3762 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003763 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003764 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003765
Daniel Dunbard67a3222009-03-30 06:36:42 +00003766 if (Output.getType() == types::TY_Dependencies) {
3767 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003768 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003769 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003770 CmdArgs.push_back(Output.getFilename());
3771 } else {
3772 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003773 }
3774
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003775 for (InputInfoList::const_iterator
3776 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3777 const InputInfo &II = *it;
3778 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003779 if (Args.hasArg(options::OPT_rewrite_objc))
3780 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3781 else
3782 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003783 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003784 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003785 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003786 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003787 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003788
Chris Lattnere9d7d782009-11-03 19:50:27 +00003789 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3790
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003791 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003792
3793 // Optionally embed the -cc1 level arguments into the debug info, for build
3794 // analysis.
3795 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003796 ArgStringList OriginalArgs;
3797 for (ArgList::const_iterator it = Args.begin(),
3798 ie = Args.end(); it != ie; ++it)
3799 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003800
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003801 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003802 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003803 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003804 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003805 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003806 }
3807 CmdArgs.push_back("-dwarf-debug-flags");
3808 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3809 }
3810
Eric Christopherd3804002013-02-22 20:12:52 +00003811 // Add the split debug info name to the command lines here so we
3812 // can propagate it to the backend.
3813 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003814 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003815 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003816 const char *SplitDwarfOut;
3817 if (SplitDwarf) {
3818 CmdArgs.push_back("-split-dwarf-file");
3819 SplitDwarfOut = SplitDebugName(Args, Inputs);
3820 CmdArgs.push_back(SplitDwarfOut);
3821 }
3822
3823 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003824 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3825 tools::visualstudio::Compile CL(getToolChain());
3826 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3827 LinkingOutput);
3828 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3829 } else {
3830 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3831 }
3832
Daniel Dunbar17731772009-03-23 19:03:36 +00003833
Eric Christopherf1545832013-02-22 23:50:16 +00003834 // Handle the debug info splitting at object creation time if we're
3835 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003836 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003837 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003838 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003839
Roman Divacky178e01602011-02-10 16:52:03 +00003840 if (Arg *A = Args.getLastArg(options::OPT_pg))
3841 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003842 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003843 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003844
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003845 // Claim some arguments which clang supports automatically.
3846
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003847 // -fpch-preprocess is used with gcc to add a special marker in the output to
3848 // include the PCH file. Clang's PTH solution is completely transparent, so we
3849 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003850 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003851
Daniel Dunbar17731772009-03-23 19:03:36 +00003852 // Claim some arguments which clang doesn't support, but we don't
3853 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003854 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3855 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003856
Rafael Espindolab0092d72013-09-04 19:37:35 +00003857 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003858 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003859}
3860
John McCall5fb5df92012-06-20 06:18:46 +00003861/// Add options related to the Objective-C runtime/ABI.
3862///
3863/// Returns true if the runtime is non-fragile.
3864ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3865 ArgStringList &cmdArgs,
3866 RewriteKind rewriteKind) const {
3867 // Look for the controlling runtime option.
3868 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3869 options::OPT_fgnu_runtime,
3870 options::OPT_fobjc_runtime_EQ);
3871
3872 // Just forward -fobjc-runtime= to the frontend. This supercedes
3873 // options about fragility.
3874 if (runtimeArg &&
3875 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3876 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003877 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003878 if (runtime.tryParse(value)) {
3879 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3880 << value;
3881 }
3882
3883 runtimeArg->render(args, cmdArgs);
3884 return runtime;
3885 }
3886
3887 // Otherwise, we'll need the ABI "version". Version numbers are
3888 // slightly confusing for historical reasons:
3889 // 1 - Traditional "fragile" ABI
3890 // 2 - Non-fragile ABI, version 1
3891 // 3 - Non-fragile ABI, version 2
3892 unsigned objcABIVersion = 1;
3893 // If -fobjc-abi-version= is present, use that to set the version.
3894 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003895 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003896 if (value == "1")
3897 objcABIVersion = 1;
3898 else if (value == "2")
3899 objcABIVersion = 2;
3900 else if (value == "3")
3901 objcABIVersion = 3;
3902 else
3903 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3904 << value;
3905 } else {
3906 // Otherwise, determine if we are using the non-fragile ABI.
3907 bool nonFragileABIIsDefault =
3908 (rewriteKind == RK_NonFragile ||
3909 (rewriteKind == RK_None &&
3910 getToolChain().IsObjCNonFragileABIDefault()));
3911 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3912 options::OPT_fno_objc_nonfragile_abi,
3913 nonFragileABIIsDefault)) {
3914 // Determine the non-fragile ABI version to use.
3915#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3916 unsigned nonFragileABIVersion = 1;
3917#else
3918 unsigned nonFragileABIVersion = 2;
3919#endif
3920
3921 if (Arg *abiArg = args.getLastArg(
3922 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003923 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003924 if (value == "1")
3925 nonFragileABIVersion = 1;
3926 else if (value == "2")
3927 nonFragileABIVersion = 2;
3928 else
3929 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3930 << value;
3931 }
3932
3933 objcABIVersion = 1 + nonFragileABIVersion;
3934 } else {
3935 objcABIVersion = 1;
3936 }
3937 }
3938
3939 // We don't actually care about the ABI version other than whether
3940 // it's non-fragile.
3941 bool isNonFragile = objcABIVersion != 1;
3942
3943 // If we have no runtime argument, ask the toolchain for its default runtime.
3944 // However, the rewriter only really supports the Mac runtime, so assume that.
3945 ObjCRuntime runtime;
3946 if (!runtimeArg) {
3947 switch (rewriteKind) {
3948 case RK_None:
3949 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3950 break;
3951 case RK_Fragile:
3952 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3953 break;
3954 case RK_NonFragile:
3955 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3956 break;
3957 }
3958
3959 // -fnext-runtime
3960 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3961 // On Darwin, make this use the default behavior for the toolchain.
3962 if (getToolChain().getTriple().isOSDarwin()) {
3963 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3964
3965 // Otherwise, build for a generic macosx port.
3966 } else {
3967 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3968 }
3969
3970 // -fgnu-runtime
3971 } else {
3972 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003973 // Legacy behaviour is to target the gnustep runtime if we are i
3974 // non-fragile mode or the GCC runtime in fragile mode.
3975 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003976 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003977 else
3978 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003979 }
3980
3981 cmdArgs.push_back(args.MakeArgString(
3982 "-fobjc-runtime=" + runtime.getAsString()));
3983 return runtime;
3984}
3985
Hans Wennborg75958c42013-08-08 00:17:41 +00003986void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3987 unsigned RTOptionID = options::OPT__SLASH_MT;
3988
Hans Wennborgf1a74252013-09-10 20:18:04 +00003989 if (Args.hasArg(options::OPT__SLASH_LDd))
3990 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3991 // but defining _DEBUG is sticky.
3992 RTOptionID = options::OPT__SLASH_MTd;
3993
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003994 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003995 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003996
Hans Wennborg75958c42013-08-08 00:17:41 +00003997 switch(RTOptionID) {
3998 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003999 if (Args.hasArg(options::OPT__SLASH_LDd))
4000 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004001 CmdArgs.push_back("-D_MT");
4002 CmdArgs.push_back("-D_DLL");
4003 CmdArgs.push_back("--dependent-lib=msvcrt");
4004 break;
4005 case options::OPT__SLASH_MDd:
4006 CmdArgs.push_back("-D_DEBUG");
4007 CmdArgs.push_back("-D_MT");
4008 CmdArgs.push_back("-D_DLL");
4009 CmdArgs.push_back("--dependent-lib=msvcrtd");
4010 break;
4011 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004012 if (Args.hasArg(options::OPT__SLASH_LDd))
4013 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004014 CmdArgs.push_back("-D_MT");
4015 CmdArgs.push_back("--dependent-lib=libcmt");
4016 break;
4017 case options::OPT__SLASH_MTd:
4018 CmdArgs.push_back("-D_DEBUG");
4019 CmdArgs.push_back("-D_MT");
4020 CmdArgs.push_back("--dependent-lib=libcmtd");
4021 break;
4022 default:
4023 llvm_unreachable("Unexpected option ID.");
4024 }
4025
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004026 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4027 // users want. The /Za flag to cl.exe turns this off, but it's not
4028 // implemented in clang.
4029 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004030
4031 // FIXME: Make this default for the win32 triple.
4032 CmdArgs.push_back("-cxx-abi");
4033 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00004034
4035 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4036 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004037
4038 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4039 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004040 if (Args.hasArg(options::OPT__SLASH_fallback))
4041 CmdArgs.push_back("msvc-fallback");
4042 else
4043 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004044 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004045}
4046
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004047void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004048 const InputInfo &Output,
4049 const InputInfoList &Inputs,
4050 const ArgList &Args,
4051 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004052 ArgStringList CmdArgs;
4053
4054 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4055 const InputInfo &Input = Inputs[0];
4056
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004057 // Don't warn about "clang -w -c foo.s"
4058 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004059 // and "clang -emit-llvm -c foo.s"
4060 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004061
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004062 // Invoke ourselves in -cc1as mode.
4063 //
4064 // FIXME: Implement custom jobs for internal actions.
4065 CmdArgs.push_back("-cc1as");
4066
4067 // Add the "effective" target triple.
4068 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004069 std::string TripleStr =
4070 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004071 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4072
4073 // Set the output mode, we currently only expect to be used as a real
4074 // assembler.
4075 CmdArgs.push_back("-filetype");
4076 CmdArgs.push_back("obj");
4077
Eric Christopher45f2e712012-12-18 00:31:10 +00004078 // Set the main file name, so that debug info works even with
4079 // -save-temps or preprocessed assembly.
4080 CmdArgs.push_back("-main-file-name");
4081 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4082
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004083 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004084 const llvm::Triple &Triple = getToolChain().getTriple();
4085 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004086 if (!CPU.empty()) {
4087 CmdArgs.push_back("-target-cpu");
4088 CmdArgs.push_back(Args.MakeArgString(CPU));
4089 }
4090
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004091 // Add the target features
4092 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004093 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004094
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004095 // Ignore explicit -force_cpusubtype_ALL option.
4096 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004097
Eric Christopherfc3ee562012-01-10 00:38:01 +00004098 // Determine the original source input.
4099 const Action *SourceAction = &JA;
4100 while (SourceAction->getKind() != Action::InputClass) {
4101 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4102 SourceAction = SourceAction->getInputs()[0];
4103 }
4104
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004105 // Forward -g and handle debug info related flags, assuming we are dealing
4106 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004107 if (SourceAction->getType() == types::TY_Asm ||
4108 SourceAction->getType() == types::TY_PP_Asm) {
4109 Args.ClaimAllArgs(options::OPT_g_Group);
4110 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4111 if (!A->getOption().matches(options::OPT_g0))
4112 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004113
4114 // Add the -fdebug-compilation-dir flag if needed.
4115 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004116
4117 // Set the AT_producer to the clang version when using the integrated
4118 // assembler on assembly source files.
4119 CmdArgs.push_back("-dwarf-debug-producer");
4120 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004121 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004122
4123 // Optionally embed the -cc1as level arguments into the debug info, for build
4124 // analysis.
4125 if (getToolChain().UseDwarfDebugFlags()) {
4126 ArgStringList OriginalArgs;
4127 for (ArgList::const_iterator it = Args.begin(),
4128 ie = Args.end(); it != ie; ++it)
4129 (*it)->render(Args, OriginalArgs);
4130
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004131 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004132 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4133 Flags += Exec;
4134 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4135 Flags += " ";
4136 Flags += OriginalArgs[i];
4137 }
4138 CmdArgs.push_back("-dwarf-debug-flags");
4139 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4140 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004141
4142 // FIXME: Add -static support, once we have it.
4143
David Blaikie9260ed62013-07-25 21:19:01 +00004144 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4145 getToolChain().getDriver());
4146
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004147 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004148
4149 assert(Output.isFilename() && "Unexpected lipo output.");
4150 CmdArgs.push_back("-o");
4151 CmdArgs.push_back(Output.getFilename());
4152
Daniel Dunbarb440f562010-08-02 02:38:21 +00004153 assert(Input.isFilename() && "Invalid input.");
4154 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004155
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004156 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004157 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004158
4159 // Handle the debug info splitting at object creation time if we're
4160 // creating an object.
4161 // TODO: Currently only works on linux with newer objcopy.
4162 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004163 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004164 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4165 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004166}
4167
Daniel Dunbara3246a02009-03-18 08:07:30 +00004168void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004169 const InputInfo &Output,
4170 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004171 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004172 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004173 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004174 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004175
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004176 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004177 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004178 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004179 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004180 // Don't forward any -g arguments to assembly steps.
4181 if (isa<AssembleJobAction>(JA) &&
4182 A->getOption().matches(options::OPT_g_Group))
4183 continue;
4184
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004185 // Don't forward any -W arguments to assembly and link steps.
4186 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4187 A->getOption().matches(options::OPT_W_Group))
4188 continue;
4189
Daniel Dunbar2da02722009-03-19 07:55:12 +00004190 // It is unfortunate that we have to claim here, as this means
4191 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004192 // platforms using a generic gcc, even if we are just using gcc
4193 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004194 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004195 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004196 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004197 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004198
Daniel Dunbar4e295052010-01-25 22:35:08 +00004199 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004200
4201 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004202 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004203 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004204 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004205
4206 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004207 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004208 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004209 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004210 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004211 else if (Arch == llvm::Triple::ppc64le)
4212 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004213 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004214 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004215 }
4216
Daniel Dunbar5716d872009-05-02 21:41:52 +00004217 // Try to force gcc to match the tool chain we want, if we recognize
4218 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004219 //
4220 // FIXME: The triple class should directly provide the information we want
4221 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004222 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004223 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004224 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4225 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004226 CmdArgs.push_back("-m64");
4227
Daniel Dunbarb440f562010-08-02 02:38:21 +00004228 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004229 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004230 CmdArgs.push_back(Output.getFilename());
4231 } else {
4232 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004233 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004234 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004235
Tony Linthicum76329bf2011-12-12 21:14:55 +00004236 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4237 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004238
4239 // Only pass -x if gcc will understand it; otherwise hope gcc
4240 // understands the suffix correctly. The main use case this would go
4241 // wrong in is for linker inputs if they happened to have an odd
4242 // suffix; really the only way to get this to happen is a command
4243 // like '-x foobar a.c' which will treat a.c like a linker input.
4244 //
4245 // FIXME: For the linker case specifically, can we safely convert
4246 // inputs into '-Wl,' options?
4247 for (InputInfoList::const_iterator
4248 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4249 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004250
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004251 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004252 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4253 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004254 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004255 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004256 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004257 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004258 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004259 else if (II.getType() == types::TY_ModuleFile)
4260 D.Diag(diag::err_drv_no_module_support)
4261 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004262
Daniel Dunbara3246a02009-03-18 08:07:30 +00004263 if (types::canTypeBeUserSpecified(II.getType())) {
4264 CmdArgs.push_back("-x");
4265 CmdArgs.push_back(types::getTypeName(II.getType()));
4266 }
4267
Daniel Dunbarb440f562010-08-02 02:38:21 +00004268 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004269 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004270 else {
4271 const Arg &A = II.getInputArg();
4272
4273 // Reverse translate some rewritten options.
4274 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4275 CmdArgs.push_back("-lstdc++");
4276 continue;
4277 }
4278
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004279 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004280 A.render(Args, CmdArgs);
4281 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004282 }
4283
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004284 const std::string customGCCName = D.getCCCGenericGCCName();
4285 const char *GCCName;
4286 if (!customGCCName.empty())
4287 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004288 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004289 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004290 } else
4291 GCCName = "gcc";
4292
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004293 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004294 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004295 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004296}
4297
Daniel Dunbar4e295052010-01-25 22:35:08 +00004298void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4299 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004300 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004301}
4302
Daniel Dunbar4e295052010-01-25 22:35:08 +00004303void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4304 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004305 const Driver &D = getToolChain().getDriver();
4306
Daniel Dunbar4e295052010-01-25 22:35:08 +00004307 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004308 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4309 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004310 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004311 else {
4312 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004313 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004314 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004315
Daniel Dunbar4e295052010-01-25 22:35:08 +00004316 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004317 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004318}
4319
Daniel Dunbar4e295052010-01-25 22:35:08 +00004320void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4321 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004322 // The types are (hopefully) good enough.
4323}
4324
Tony Linthicum76329bf2011-12-12 21:14:55 +00004325// Hexagon tools start.
4326void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4327 ArgStringList &CmdArgs) const {
4328
4329}
4330void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4331 const InputInfo &Output,
4332 const InputInfoList &Inputs,
4333 const ArgList &Args,
4334 const char *LinkingOutput) const {
4335
4336 const Driver &D = getToolChain().getDriver();
4337 ArgStringList CmdArgs;
4338
4339 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004340 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004341 CmdArgs.push_back(Args.MakeArgString(MarchString));
4342
4343 RenderExtraToolArgs(JA, CmdArgs);
4344
4345 if (Output.isFilename()) {
4346 CmdArgs.push_back("-o");
4347 CmdArgs.push_back(Output.getFilename());
4348 } else {
4349 assert(Output.isNothing() && "Unexpected output");
4350 CmdArgs.push_back("-fsyntax-only");
4351 }
4352
Matthew Curtise8f80a12012-12-06 17:49:03 +00004353 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4354 if (!SmallDataThreshold.empty())
4355 CmdArgs.push_back(
4356 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004357
Matthew Curtise5df3812012-12-07 17:23:04 +00004358 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4359 options::OPT_Xassembler);
4360
Tony Linthicum76329bf2011-12-12 21:14:55 +00004361 // Only pass -x if gcc will understand it; otherwise hope gcc
4362 // understands the suffix correctly. The main use case this would go
4363 // wrong in is for linker inputs if they happened to have an odd
4364 // suffix; really the only way to get this to happen is a command
4365 // like '-x foobar a.c' which will treat a.c like a linker input.
4366 //
4367 // FIXME: For the linker case specifically, can we safely convert
4368 // inputs into '-Wl,' options?
4369 for (InputInfoList::const_iterator
4370 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4371 const InputInfo &II = *it;
4372
4373 // Don't try to pass LLVM or AST inputs to a generic gcc.
4374 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4375 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4376 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4377 << getToolChain().getTripleString();
4378 else if (II.getType() == types::TY_AST)
4379 D.Diag(clang::diag::err_drv_no_ast_support)
4380 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004381 else if (II.getType() == types::TY_ModuleFile)
4382 D.Diag(diag::err_drv_no_module_support)
4383 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004384
4385 if (II.isFilename())
4386 CmdArgs.push_back(II.getFilename());
4387 else
4388 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4389 II.getInputArg().render(Args, CmdArgs);
4390 }
4391
4392 const char *GCCName = "hexagon-as";
4393 const char *Exec =
4394 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4395 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4396
4397}
4398void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4399 ArgStringList &CmdArgs) const {
4400 // The types are (hopefully) good enough.
4401}
4402
4403void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4404 const InputInfo &Output,
4405 const InputInfoList &Inputs,
4406 const ArgList &Args,
4407 const char *LinkingOutput) const {
4408
Matthew Curtise689b052012-12-06 15:46:07 +00004409 const toolchains::Hexagon_TC& ToolChain =
4410 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4411 const Driver &D = ToolChain.getDriver();
4412
Tony Linthicum76329bf2011-12-12 21:14:55 +00004413 ArgStringList CmdArgs;
4414
Matthew Curtise689b052012-12-06 15:46:07 +00004415 //----------------------------------------------------------------------------
4416 //
4417 //----------------------------------------------------------------------------
4418 bool hasStaticArg = Args.hasArg(options::OPT_static);
4419 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004420 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004421 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4422 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4423 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4424 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004425
Matthew Curtise689b052012-12-06 15:46:07 +00004426 //----------------------------------------------------------------------------
4427 // Silence warnings for various options
4428 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004429
Matthew Curtise689b052012-12-06 15:46:07 +00004430 Args.ClaimAllArgs(options::OPT_g_Group);
4431 Args.ClaimAllArgs(options::OPT_emit_llvm);
4432 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4433 // handled somewhere else.
4434 Args.ClaimAllArgs(options::OPT_static_libgcc);
4435
4436 //----------------------------------------------------------------------------
4437 //
4438 //----------------------------------------------------------------------------
4439 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4440 e = ToolChain.ExtraOpts.end();
4441 i != e; ++i)
4442 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004443
Matthew Curtisf10a5952012-12-06 14:16:43 +00004444 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4445 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004446
Matthew Curtise689b052012-12-06 15:46:07 +00004447 if (buildingLib) {
4448 CmdArgs.push_back("-shared");
4449 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4450 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004451 }
4452
Matthew Curtise689b052012-12-06 15:46:07 +00004453 if (hasStaticArg)
4454 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004455
Matthew Curtise8f80a12012-12-06 17:49:03 +00004456 if (buildPIE && !buildingLib)
4457 CmdArgs.push_back("-pie");
4458
4459 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4460 if (!SmallDataThreshold.empty()) {
4461 CmdArgs.push_back(
4462 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4463 }
4464
Matthew Curtise689b052012-12-06 15:46:07 +00004465 //----------------------------------------------------------------------------
4466 //
4467 //----------------------------------------------------------------------------
4468 CmdArgs.push_back("-o");
4469 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004470
Matthew Curtise689b052012-12-06 15:46:07 +00004471 const std::string MarchSuffix = "/" + MarchString;
4472 const std::string G0Suffix = "/G0";
4473 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4474 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4475 + "/";
4476 const std::string StartFilesDir = RootDir
4477 + "hexagon/lib"
4478 + (buildingLib
4479 ? MarchG0Suffix : MarchSuffix);
4480
4481 //----------------------------------------------------------------------------
4482 // moslib
4483 //----------------------------------------------------------------------------
4484 std::vector<std::string> oslibs;
4485 bool hasStandalone= false;
4486
4487 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4488 ie = Args.filtered_end(); it != ie; ++it) {
4489 (*it)->claim();
4490 oslibs.push_back((*it)->getValue());
4491 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004492 }
Matthew Curtise689b052012-12-06 15:46:07 +00004493 if (oslibs.empty()) {
4494 oslibs.push_back("standalone");
4495 hasStandalone = true;
4496 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004497
Matthew Curtise689b052012-12-06 15:46:07 +00004498 //----------------------------------------------------------------------------
4499 // Start Files
4500 //----------------------------------------------------------------------------
4501 if (incStdLib && incStartFiles) {
4502
4503 if (!buildingLib) {
4504 if (hasStandalone) {
4505 CmdArgs.push_back(
4506 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4507 }
4508 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4509 }
4510 std::string initObj = useShared ? "/initS.o" : "/init.o";
4511 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4512 }
4513
4514 //----------------------------------------------------------------------------
4515 // Library Search Paths
4516 //----------------------------------------------------------------------------
4517 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4518 for (ToolChain::path_list::const_iterator
4519 i = LibPaths.begin(),
4520 e = LibPaths.end();
4521 i != e;
4522 ++i)
4523 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4524
4525 //----------------------------------------------------------------------------
4526 //
4527 //----------------------------------------------------------------------------
4528 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4529 Args.AddAllArgs(CmdArgs, options::OPT_e);
4530 Args.AddAllArgs(CmdArgs, options::OPT_s);
4531 Args.AddAllArgs(CmdArgs, options::OPT_t);
4532 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4533
4534 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4535
4536 //----------------------------------------------------------------------------
4537 // Libraries
4538 //----------------------------------------------------------------------------
4539 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004540 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004541 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4542 CmdArgs.push_back("-lm");
4543 }
4544
4545 CmdArgs.push_back("--start-group");
4546
4547 if (!buildingLib) {
4548 for(std::vector<std::string>::iterator i = oslibs.begin(),
4549 e = oslibs.end(); i != e; ++i)
4550 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4551 CmdArgs.push_back("-lc");
4552 }
4553 CmdArgs.push_back("-lgcc");
4554
4555 CmdArgs.push_back("--end-group");
4556 }
4557
4558 //----------------------------------------------------------------------------
4559 // End files
4560 //----------------------------------------------------------------------------
4561 if (incStdLib && incStartFiles) {
4562 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4563 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4564 }
4565
4566 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004567 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004568}
4569// Hexagon tools end.
4570
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004571llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4572 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4573 // archs which Darwin doesn't use.
4574
4575 // The matching this routine does is fairly pointless, since it is neither the
4576 // complete architecture list, nor a reasonable subset. The problem is that
4577 // historically the driver driver accepts this and also ties its -march=
4578 // handling to the architecture name, so we need to be careful before removing
4579 // support for it.
4580
4581 // This code must be kept in sync with Clang's Darwin specific argument
4582 // translation.
4583
4584 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4585 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4586 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4587 .Case("ppc64", llvm::Triple::ppc64)
4588 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4589 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4590 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004591 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004592 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004593 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4594 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4595 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004596 .Case("r600", llvm::Triple::r600)
4597 .Case("nvptx", llvm::Triple::nvptx)
4598 .Case("nvptx64", llvm::Triple::nvptx64)
4599 .Case("amdil", llvm::Triple::amdil)
4600 .Case("spir", llvm::Triple::spir)
4601 .Default(llvm::Triple::UnknownArch);
4602}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004603
Bob Wilsondecc03e2012-11-23 06:14:39 +00004604const char *Clang::getBaseInputName(const ArgList &Args,
4605 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004606 return Args.MakeArgString(
4607 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004608}
4609
Bob Wilsondecc03e2012-11-23 06:14:39 +00004610const char *Clang::getBaseInputStem(const ArgList &Args,
4611 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004612 const char *Str = getBaseInputName(Args, Inputs);
4613
Chris Lattner906bb902011-01-16 08:14:11 +00004614 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004615 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004616
4617 return Str;
4618}
4619
Bob Wilsondecc03e2012-11-23 06:14:39 +00004620const char *Clang::getDependencyFileName(const ArgList &Args,
4621 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004622 // FIXME: Think about this more.
4623 std::string Res;
4624
4625 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004626 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004627 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004628 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004629 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004630 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004631 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004632}
4633
Daniel Dunbarbe220842009-03-20 16:06:39 +00004634void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004635 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004636 const InputInfoList &Inputs,
4637 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004638 const char *LinkingOutput) const {
4639 ArgStringList CmdArgs;
4640
4641 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4642 const InputInfo &Input = Inputs[0];
4643
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004644 // Determine the original source input.
4645 const Action *SourceAction = &JA;
4646 while (SourceAction->getKind() != Action::InputClass) {
4647 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4648 SourceAction = SourceAction->getInputs()[0];
4649 }
4650
Kevin Enderby319baa42013-11-18 23:30:29 +00004651 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4652 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004653 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4654 // FIXME: at run-time detect assembler capabilities or rely on version
4655 // information forwarded by -target-assembler-version (future)
4656 if (Args.hasArg(options::OPT_no_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004657 const llvm::Triple &T(getToolChain().getTriple());
4658 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004659 CmdArgs.push_back("-Q");
4660 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004661
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004662 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004663 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004664 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004665 if (Args.hasArg(options::OPT_gstabs))
4666 CmdArgs.push_back("--gstabs");
4667 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004668 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004669 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004670
Daniel Dunbarbe220842009-03-20 16:06:39 +00004671 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004672 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004673
Daniel Dunbar6d484762010-07-22 01:47:22 +00004674 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004675 if (getToolChain().getArch() == llvm::Triple::x86 ||
4676 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004677 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4678 CmdArgs.push_back("-force_cpusubtype_ALL");
4679
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004680 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004681 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004682 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004683 (!getDarwinToolChain().isTargetIPhoneOS() ||
4684 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4685 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004686 CmdArgs.push_back("-static");
4687
Daniel Dunbarbe220842009-03-20 16:06:39 +00004688 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4689 options::OPT_Xassembler);
4690
4691 assert(Output.isFilename() && "Unexpected lipo output.");
4692 CmdArgs.push_back("-o");
4693 CmdArgs.push_back(Output.getFilename());
4694
Daniel Dunbarb440f562010-08-02 02:38:21 +00004695 assert(Input.isFilename() && "Invalid input.");
4696 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004697
4698 // asm_final spec is empty.
4699
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004700 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004701 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004702 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004703}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004704
David Blaikie68e081d2011-12-20 02:48:34 +00004705void darwin::DarwinTool::anchor() {}
4706
Daniel Dunbare9ded432009-09-09 18:36:20 +00004707void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4708 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004709 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004710
Daniel Dunbarc1964212009-03-26 16:23:12 +00004711 // Derived from darwin_arch spec.
4712 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004713 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004714
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004715 // FIXME: Is this needed anymore?
4716 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004717 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004718}
4719
Bill Wendling3b2000f2012-10-02 18:02:50 +00004720bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4721 // We only need to generate a temp path for LTO if we aren't compiling object
4722 // files. When compiling source files, we run 'dsymutil' after linking. We
4723 // don't run 'dsymutil' when compiling object files.
4724 for (InputInfoList::const_iterator
4725 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4726 if (it->getType() != types::TY_Object)
4727 return true;
4728
4729 return false;
4730}
4731
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004732void darwin::Link::AddLinkArgs(Compilation &C,
4733 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004734 ArgStringList &CmdArgs,
4735 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004736 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004737 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004738
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004739 unsigned Version[3] = { 0, 0, 0 };
4740 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4741 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004742 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004743 Version[1], Version[2], HadExtra) ||
4744 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004745 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004746 << A->getAsString(Args);
4747 }
4748
4749 // Newer linkers support -demangle, pass it if supported and not disabled by
4750 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004751 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004752 // Don't pass -demangle to ld_classic.
4753 //
4754 // FIXME: This is a temporary workaround, ld should be handling this.
4755 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4756 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004757 if (getToolChain().getArch() == llvm::Triple::x86) {
4758 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4759 options::OPT_Wl_COMMA),
4760 ie = Args.filtered_end(); it != ie; ++it) {
4761 const Arg *A = *it;
4762 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004763 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004764 UsesLdClassic = true;
4765 }
4766 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004767 if (!UsesLdClassic)
4768 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004769 }
4770
Bob Wilson3d27dad2013-08-02 22:25:34 +00004771 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4772 CmdArgs.push_back("-export_dynamic");
4773
Bill Wendling313b6bf2012-11-16 23:03:00 +00004774 // If we are using LTO, then automatically create a temporary file path for
4775 // the linker to use, so that it's lifetime will extend past a possible
4776 // dsymutil step.
4777 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4778 const char *TmpPath = C.getArgs().MakeArgString(
4779 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4780 C.addTempFile(TmpPath);
4781 CmdArgs.push_back("-object_path_lto");
4782 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004783 }
4784
Daniel Dunbarc1964212009-03-26 16:23:12 +00004785 // Derived from the "link" spec.
4786 Args.AddAllArgs(CmdArgs, options::OPT_static);
4787 if (!Args.hasArg(options::OPT_static))
4788 CmdArgs.push_back("-dynamic");
4789 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4790 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4791 // here. How do we wish to handle such things?
4792 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004793
Daniel Dunbarc1964212009-03-26 16:23:12 +00004794 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004795 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004796 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004797 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004798
4799 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4800 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4801 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4802
4803 Arg *A;
4804 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4805 (A = Args.getLastArg(options::OPT_current__version)) ||
4806 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004807 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004808 << A->getAsString(Args) << "-dynamiclib";
4809
4810 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4811 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4812 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4813 } else {
4814 CmdArgs.push_back("-dylib");
4815
4816 Arg *A;
4817 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4818 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4819 (A = Args.getLastArg(options::OPT_client__name)) ||
4820 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4821 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4822 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004823 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004824 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004825
Daniel Dunbarc1964212009-03-26 16:23:12 +00004826 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4827 "-dylib_compatibility_version");
4828 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4829 "-dylib_current_version");
4830
Daniel Dunbara48823f2010-01-22 02:04:52 +00004831 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004832
4833 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4834 "-dylib_install_name");
4835 }
4836
4837 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4838 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4839 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover9c7e0352013-12-12 11:55:52 +00004840 if (DarwinTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004841 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004842 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4843 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4844 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4845 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4846 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4847 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004848 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004849 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4850 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4851 Args.AddAllArgs(CmdArgs, options::OPT_init);
4852
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004853 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004854 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004855
4856 // If we had an explicit -mios-simulator-version-min argument, honor that,
4857 // otherwise use the traditional deployment targets. We can't just check the
4858 // is-sim attribute because existing code follows this path, and the linker
4859 // may not handle the argument.
4860 //
4861 // FIXME: We may be able to remove this, once we can verify no one depends on
4862 // it.
Tim Northover9c7e0352013-12-12 11:55:52 +00004863 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004864 CmdArgs.push_back("-ios_simulator_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004865 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4866 } else if (DarwinTC.isTargetIOSBased()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004867 CmdArgs.push_back("-iphoneos_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004868 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4869 } else if (DarwinTC.isTargetMacOS()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004870 CmdArgs.push_back("-macosx_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004871 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4872 }
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004873
Daniel Dunbarc1964212009-03-26 16:23:12 +00004874 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4875 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4876 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4877 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4878 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004879
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004880 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4881 options::OPT_fno_pie,
4882 options::OPT_fno_PIE)) {
4883 if (A->getOption().matches(options::OPT_fpie) ||
4884 A->getOption().matches(options::OPT_fPIE))
4885 CmdArgs.push_back("-pie");
4886 else
4887 CmdArgs.push_back("-no_pie");
4888 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004889
4890 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4891 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4892 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4893 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4894 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4895 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4896 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4897 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4898 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4899 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4900 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4901 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4902 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4903 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4904 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4905 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004906
Daniel Dunbar84384642011-05-02 21:03:47 +00004907 // Give --sysroot= preference, over the Apple specific behavior to also use
4908 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004909 StringRef sysroot = C.getSysRoot();
4910 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004911 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004912 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004913 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4914 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004915 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004916 }
4917
Daniel Dunbarc1964212009-03-26 16:23:12 +00004918 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4919 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4920 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4921 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4922 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004923 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004924 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4925 Args.AddAllArgs(CmdArgs, options::OPT_y);
4926 Args.AddLastArg(CmdArgs, options::OPT_w);
4927 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4928 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4929 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4930 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4931 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4932 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4933 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4934 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4935 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4936 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4937 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4938 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4939}
4940
4941void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004942 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004943 const InputInfoList &Inputs,
4944 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004945 const char *LinkingOutput) const {
4946 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004947
Daniel Dunbarc1964212009-03-26 16:23:12 +00004948 // The logic here is derived from gcc's behavior; most of which
4949 // comes from specs (starting with link_command). Consult gcc for
4950 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004951 ArgStringList CmdArgs;
4952
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004953 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4954 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4955 options::OPT_ccc_arcmt_migrate)) {
4956 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4957 (*I)->claim();
4958 const char *Exec =
4959 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4960 CmdArgs.push_back(Output.getFilename());
4961 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4962 return;
4963 }
4964
Daniel Dunbarc1964212009-03-26 16:23:12 +00004965 // I'm not sure why this particular decomposition exists in gcc, but
4966 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004967 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004968
Daniel Dunbarc1964212009-03-26 16:23:12 +00004969 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4970 Args.AddAllArgs(CmdArgs, options::OPT_s);
4971 Args.AddAllArgs(CmdArgs, options::OPT_t);
4972 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4973 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004974 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004975 Args.AddAllArgs(CmdArgs, options::OPT_r);
4976
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004977 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4978 // members of static archive libraries which implement Objective-C classes or
4979 // categories.
4980 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4981 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004982
Daniel Dunbarc1964212009-03-26 16:23:12 +00004983 CmdArgs.push_back("-o");
4984 CmdArgs.push_back(Output.getFilename());
4985
Chad Rosier06fd3c62012-05-16 23:45:12 +00004986 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004987 !Args.hasArg(options::OPT_nostartfiles)) {
4988 // Derived from startfile spec.
4989 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004990 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004991 if (getDarwinToolChain().isTargetIOSSimulator()) {
4992 // The simulator doesn't have a versioned crt1 file.
4993 CmdArgs.push_back("-ldylib1.o");
4994 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004995 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4996 CmdArgs.push_back("-ldylib1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00004997 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004998 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004999 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005000 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005001 CmdArgs.push_back("-ldylib1.10.5.o");
5002 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005003 } else {
5004 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005005 if (!Args.hasArg(options::OPT_static)) {
5006 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00005007 if (getDarwinToolChain().isTargetIOSSimulator()) {
5008 // The simulator doesn't have a versioned crt1 file.
5009 CmdArgs.push_back("-lbundle1.o");
5010 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005011 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5012 CmdArgs.push_back("-lbundle1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005013 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005014 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005015 CmdArgs.push_back("-lbundle1.o");
5016 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005017 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005018 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00005019 if (Args.hasArg(options::OPT_pg) &&
5020 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00005021 if (Args.hasArg(options::OPT_static) ||
5022 Args.hasArg(options::OPT_object) ||
5023 Args.hasArg(options::OPT_preload)) {
5024 CmdArgs.push_back("-lgcrt0.o");
5025 } else {
5026 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005027
Daniel Dunbarc1964212009-03-26 16:23:12 +00005028 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005029 }
Bob Wilsonef285b42012-07-04 00:18:41 +00005030 // By default on OS X 10.8 and later, we don't link with a crt1.o
5031 // file and the linker knows to use _main as the entry point. But,
5032 // when compiling with -pg, we need to link with the gcrt1.o file,
5033 // so pass the -no_new_main option to tell the linker to use the
5034 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00005035 if (getDarwinToolChain().isTargetMacOS() &&
5036 !getDarwinToolChain().isMacosxVersionLT(10, 8))
5037 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005038 } else {
5039 if (Args.hasArg(options::OPT_static) ||
5040 Args.hasArg(options::OPT_object) ||
5041 Args.hasArg(options::OPT_preload)) {
5042 CmdArgs.push_back("-lcrt0.o");
5043 } else {
5044 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00005045 if (getDarwinToolChain().isTargetIOSSimulator()) {
5046 // The simulator doesn't have a versioned crt1 file.
5047 CmdArgs.push_back("-lcrt1.o");
5048 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005049 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5050 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005051 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00005052 CmdArgs.push_back("-lcrt1.3.1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005053 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005054 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
5055 CmdArgs.push_back("-lcrt1.o");
5056 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
5057 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005058 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005059 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005060
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005061 // darwin_crt2 spec is empty.
5062 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005063 }
5064 }
5065 }
5066 }
5067
Tim Northover9c7e0352013-12-12 11:55:52 +00005068 if (getDarwinToolChain().isTargetMacOS() &&
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005069 Args.hasArg(options::OPT_shared_libgcc) &&
5070 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005071 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005072 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005073 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005074 }
5075 }
5076
5077 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005078
Daniel Dunbarc1964212009-03-26 16:23:12 +00005079 if (Args.hasArg(options::OPT_fopenmp))
5080 // This is more complicated in gcc...
5081 CmdArgs.push_back("-lgomp");
5082
Douglas Gregor9295df02012-05-15 21:00:27 +00005083 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5084
Bob Wilson16d93952012-05-15 18:57:39 +00005085 if (isObjCRuntimeLinked(Args) &&
5086 !Args.hasArg(options::OPT_nostdlib) &&
5087 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005088 // Avoid linking compatibility stubs on i386 mac.
5089 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005090 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005091 // If we don't have ARC or subscripting runtime support, link in the
5092 // runtime stubs. We have to do this *before* adding any of the normal
5093 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00005094 ObjCRuntime runtime =
5095 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005096 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00005097 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00005098 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00005099 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005100 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005101 CmdArgs.push_back("-framework");
5102 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005103 // Link libobj.
5104 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005105 }
John McCall31168b02011-06-15 23:02:42 +00005106
Daniel Dunbarc1964212009-03-26 16:23:12 +00005107 if (LinkingOutput) {
5108 CmdArgs.push_back("-arch_multiple");
5109 CmdArgs.push_back("-final_output");
5110 CmdArgs.push_back(LinkingOutput);
5111 }
5112
Daniel Dunbarc1964212009-03-26 16:23:12 +00005113 if (Args.hasArg(options::OPT_fnested_functions))
5114 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005115
Daniel Dunbarc1964212009-03-26 16:23:12 +00005116 if (!Args.hasArg(options::OPT_nostdlib) &&
5117 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005118 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005119 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005120
Daniel Dunbarc1964212009-03-26 16:23:12 +00005121 // link_ssp spec is empty.
5122
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005123 // Let the tool chain choose which runtime library to link.
5124 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005125 }
5126
Chad Rosier06fd3c62012-05-16 23:45:12 +00005127 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005128 !Args.hasArg(options::OPT_nostartfiles)) {
5129 // endfile_spec is empty.
5130 }
5131
5132 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5133 Args.AddAllArgs(CmdArgs, options::OPT_F);
5134
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005135 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005136 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005137 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005138}
5139
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005140void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005141 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005142 const InputInfoList &Inputs,
5143 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005144 const char *LinkingOutput) const {
5145 ArgStringList CmdArgs;
5146
5147 CmdArgs.push_back("-create");
5148 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005149
5150 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005151 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005152
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005153 for (InputInfoList::const_iterator
5154 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5155 const InputInfo &II = *it;
5156 assert(II.isFilename() && "Unexpected lipo input.");
5157 CmdArgs.push_back(II.getFilename());
5158 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005159 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005160 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005161 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005162}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005163
Daniel Dunbar88299622010-06-04 18:28:36 +00005164void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005165 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005166 const InputInfoList &Inputs,
5167 const ArgList &Args,
5168 const char *LinkingOutput) const {
5169 ArgStringList CmdArgs;
5170
Daniel Dunbareb86b042011-05-09 17:23:16 +00005171 CmdArgs.push_back("-o");
5172 CmdArgs.push_back(Output.getFilename());
5173
Daniel Dunbar88299622010-06-04 18:28:36 +00005174 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5175 const InputInfo &Input = Inputs[0];
5176 assert(Input.isFilename() && "Unexpected dsymutil input.");
5177 CmdArgs.push_back(Input.getFilename());
5178
Daniel Dunbar88299622010-06-04 18:28:36 +00005179 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005180 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005181 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005182}
5183
Eric Christopher551ef452011-08-23 17:56:55 +00005184void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005185 const InputInfo &Output,
5186 const InputInfoList &Inputs,
5187 const ArgList &Args,
5188 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005189 ArgStringList CmdArgs;
5190 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005191 CmdArgs.push_back("--debug-info");
5192 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005193 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005194
5195 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5196 const InputInfo &Input = Inputs[0];
5197 assert(Input.isFilename() && "Unexpected verify input");
5198
5199 // Grabbing the output of the earlier dsymutil run.
5200 CmdArgs.push_back(Input.getFilename());
5201
5202 const char *Exec =
5203 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5204 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5205}
5206
David Chisnallf571cde2012-02-15 13:39:01 +00005207void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5208 const InputInfo &Output,
5209 const InputInfoList &Inputs,
5210 const ArgList &Args,
5211 const char *LinkingOutput) const {
5212 ArgStringList CmdArgs;
5213
5214 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5215 options::OPT_Xassembler);
5216
5217 CmdArgs.push_back("-o");
5218 CmdArgs.push_back(Output.getFilename());
5219
5220 for (InputInfoList::const_iterator
5221 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5222 const InputInfo &II = *it;
5223 CmdArgs.push_back(II.getFilename());
5224 }
5225
5226 const char *Exec =
5227 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5228 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5229}
5230
5231
5232void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5233 const InputInfo &Output,
5234 const InputInfoList &Inputs,
5235 const ArgList &Args,
5236 const char *LinkingOutput) const {
5237 // FIXME: Find a real GCC, don't hard-code versions here
5238 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5239 const llvm::Triple &T = getToolChain().getTriple();
5240 std::string LibPath = "/usr/lib/";
5241 llvm::Triple::ArchType Arch = T.getArch();
5242 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005243 case llvm::Triple::x86:
5244 GCCLibPath +=
5245 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5246 break;
5247 case llvm::Triple::x86_64:
5248 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5249 GCCLibPath += "/4.5.2/amd64/";
5250 LibPath += "amd64/";
5251 break;
5252 default:
5253 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005254 }
5255
5256 ArgStringList CmdArgs;
5257
David Chisnall272a0712012-02-29 15:06:12 +00005258 // Demangle C++ names in errors
5259 CmdArgs.push_back("-C");
5260
David Chisnallf571cde2012-02-15 13:39:01 +00005261 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5262 (!Args.hasArg(options::OPT_shared))) {
5263 CmdArgs.push_back("-e");
5264 CmdArgs.push_back("_start");
5265 }
5266
5267 if (Args.hasArg(options::OPT_static)) {
5268 CmdArgs.push_back("-Bstatic");
5269 CmdArgs.push_back("-dn");
5270 } else {
5271 CmdArgs.push_back("-Bdynamic");
5272 if (Args.hasArg(options::OPT_shared)) {
5273 CmdArgs.push_back("-shared");
5274 } else {
5275 CmdArgs.push_back("--dynamic-linker");
5276 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5277 }
5278 }
5279
5280 if (Output.isFilename()) {
5281 CmdArgs.push_back("-o");
5282 CmdArgs.push_back(Output.getFilename());
5283 } else {
5284 assert(Output.isNothing() && "Invalid output.");
5285 }
5286
5287 if (!Args.hasArg(options::OPT_nostdlib) &&
5288 !Args.hasArg(options::OPT_nostartfiles)) {
5289 if (!Args.hasArg(options::OPT_shared)) {
5290 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5291 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005292 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005293 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5294 } else {
5295 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005296 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5297 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005298 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005299 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005300 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005301 }
5302
5303 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5304
5305 Args.AddAllArgs(CmdArgs, options::OPT_L);
5306 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5307 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005308 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005309
5310 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5311
5312 if (!Args.hasArg(options::OPT_nostdlib) &&
5313 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005314 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005315 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005316 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005317 if (!Args.hasArg(options::OPT_shared)) {
5318 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005319 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005320 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005321 }
David Chisnallf571cde2012-02-15 13:39:01 +00005322 }
5323
5324 if (!Args.hasArg(options::OPT_nostdlib) &&
5325 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005326 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005327 }
David Chisnall96de9932012-02-16 16:00:47 +00005328 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005329
5330 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5331
5332 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005333 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005334 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5335}
5336
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005337void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005338 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005339 const InputInfoList &Inputs,
5340 const ArgList &Args,
5341 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005342 ArgStringList CmdArgs;
5343
5344 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5345 options::OPT_Xassembler);
5346
5347 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005348 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005349
5350 for (InputInfoList::const_iterator
5351 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5352 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005353 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005354 }
5355
5356 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005357 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005358 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005359}
5360
5361void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005362 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005363 const InputInfoList &Inputs,
5364 const ArgList &Args,
5365 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005366 ArgStringList CmdArgs;
5367
5368 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005369 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005370 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005371 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005372 }
5373
5374 if (Args.hasArg(options::OPT_static)) {
5375 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005376 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005377 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005378// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005379 CmdArgs.push_back("-Bdynamic");
5380 if (Args.hasArg(options::OPT_shared)) {
5381 CmdArgs.push_back("-shared");
5382 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005383 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005384 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5385 }
5386 }
5387
Daniel Dunbarb440f562010-08-02 02:38:21 +00005388 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005389 CmdArgs.push_back("-o");
5390 CmdArgs.push_back(Output.getFilename());
5391 } else {
5392 assert(Output.isNothing() && "Invalid output.");
5393 }
5394
5395 if (!Args.hasArg(options::OPT_nostdlib) &&
5396 !Args.hasArg(options::OPT_nostartfiles)) {
5397 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005398 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005399 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005400 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005401 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005402 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005403 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005404 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005405 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005406 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005407 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005408 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005409 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005410 }
5411
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005412 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5413 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005414 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005415
5416 Args.AddAllArgs(CmdArgs, options::OPT_L);
5417 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5418 Args.AddAllArgs(CmdArgs, options::OPT_e);
5419
Daniel Dunbar54423b22010-09-17 00:24:54 +00005420 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005421
5422 if (!Args.hasArg(options::OPT_nostdlib) &&
5423 !Args.hasArg(options::OPT_nodefaultlibs)) {
5424 // FIXME: For some reason GCC passes -lgcc before adding
5425 // the default system libraries. Just mimic this for now.
5426 CmdArgs.push_back("-lgcc");
5427
5428 if (Args.hasArg(options::OPT_pthread))
5429 CmdArgs.push_back("-pthread");
5430 if (!Args.hasArg(options::OPT_shared))
5431 CmdArgs.push_back("-lc");
5432 CmdArgs.push_back("-lgcc");
5433 }
5434
5435 if (!Args.hasArg(options::OPT_nostdlib) &&
5436 !Args.hasArg(options::OPT_nostartfiles)) {
5437 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005438 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005439 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005440 }
5441
Bill Wendling08760582011-06-27 19:15:03 +00005442 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005443
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005444 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005445 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005446 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005447}
5448
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005449void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005450 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005451 const InputInfoList &Inputs,
5452 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005453 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005454 ArgStringList CmdArgs;
5455
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005456 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5457 // instruct as in the base system to assemble 32-bit code.
5458 if (getToolChain().getArch() == llvm::Triple::x86)
5459 CmdArgs.push_back("--32");
5460 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5461 CmdArgs.push_back("-mppc");
5462 CmdArgs.push_back("-many");
5463 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5464 getToolChain().getArch() == llvm::Triple::mips64el) {
5465 StringRef CPUName;
5466 StringRef ABIName;
5467 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5468
5469 CmdArgs.push_back("-mabi");
5470 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5471
5472 if (getToolChain().getArch() == llvm::Triple::mips64)
5473 CmdArgs.push_back("-EB");
5474 else
5475 CmdArgs.push_back("-EL");
5476
5477 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5478 options::OPT_fpic, options::OPT_fno_pic,
5479 options::OPT_fPIE, options::OPT_fno_PIE,
5480 options::OPT_fpie, options::OPT_fno_pie);
5481 if (LastPICArg &&
5482 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5483 LastPICArg->getOption().matches(options::OPT_fpic) ||
5484 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5485 LastPICArg->getOption().matches(options::OPT_fpie))) {
5486 CmdArgs.push_back("-KPIC");
5487 }
5488 }
5489
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005490 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5491 options::OPT_Xassembler);
5492
5493 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005494 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005495
5496 for (InputInfoList::const_iterator
5497 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5498 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005499 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005500 }
5501
5502 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005503 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005504 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005505}
5506
5507void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005508 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005509 const InputInfoList &Inputs,
5510 const ArgList &Args,
5511 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005512 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005513 ArgStringList CmdArgs;
5514
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005515 // Silence warning for "clang -g foo.o -o foo"
5516 Args.ClaimAllArgs(options::OPT_g_Group);
5517 // and "clang -emit-llvm foo.o -o foo"
5518 Args.ClaimAllArgs(options::OPT_emit_llvm);
5519 // and for "clang -w foo.o -o foo". Other warning options are already
5520 // handled somewhere else.
5521 Args.ClaimAllArgs(options::OPT_w);
5522
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005523 if (getToolChain().getArch() == llvm::Triple::mips64)
5524 CmdArgs.push_back("-EB");
5525 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5526 CmdArgs.push_back("-EL");
5527
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005528 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005529 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005530 CmdArgs.push_back("-e");
5531 CmdArgs.push_back("__start");
5532 }
5533
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005534 if (Args.hasArg(options::OPT_static)) {
5535 CmdArgs.push_back("-Bstatic");
5536 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005537 if (Args.hasArg(options::OPT_rdynamic))
5538 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005539 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005540 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005541 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005542 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005543 } else {
5544 CmdArgs.push_back("-dynamic-linker");
5545 CmdArgs.push_back("/usr/libexec/ld.so");
5546 }
5547 }
5548
Rafael Espindola044f7832013-06-05 04:28:55 +00005549 if (Args.hasArg(options::OPT_nopie))
5550 CmdArgs.push_back("-nopie");
5551
Daniel Dunbarb440f562010-08-02 02:38:21 +00005552 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005553 CmdArgs.push_back("-o");
5554 CmdArgs.push_back(Output.getFilename());
5555 } else {
5556 assert(Output.isNothing() && "Invalid output.");
5557 }
5558
5559 if (!Args.hasArg(options::OPT_nostdlib) &&
5560 !Args.hasArg(options::OPT_nostartfiles)) {
5561 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005562 if (Args.hasArg(options::OPT_pg))
5563 CmdArgs.push_back(Args.MakeArgString(
5564 getToolChain().GetFilePath("gcrt0.o")));
5565 else
5566 CmdArgs.push_back(Args.MakeArgString(
5567 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005568 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005569 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005570 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005571 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005572 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005573 }
5574 }
5575
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005576 std::string Triple = getToolChain().getTripleString();
5577 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005578 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005579 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005580 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005581
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005582 Args.AddAllArgs(CmdArgs, options::OPT_L);
5583 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5584 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005585 Args.AddAllArgs(CmdArgs, options::OPT_s);
5586 Args.AddAllArgs(CmdArgs, options::OPT_t);
5587 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5588 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005589
Daniel Dunbar54423b22010-09-17 00:24:54 +00005590 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005591
5592 if (!Args.hasArg(options::OPT_nostdlib) &&
5593 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005594 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005595 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005596 if (Args.hasArg(options::OPT_pg))
5597 CmdArgs.push_back("-lm_p");
5598 else
5599 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005600 }
5601
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005602 // FIXME: For some reason GCC passes -lgcc before adding
5603 // the default system libraries. Just mimic this for now.
5604 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005605
Eric Christopher17674ec2012-09-13 06:32:34 +00005606 if (Args.hasArg(options::OPT_pthread)) {
5607 if (!Args.hasArg(options::OPT_shared) &&
5608 Args.hasArg(options::OPT_pg))
5609 CmdArgs.push_back("-lpthread_p");
5610 else
5611 CmdArgs.push_back("-lpthread");
5612 }
5613
Chandler Carruth45661652011-12-17 22:32:42 +00005614 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005615 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005616 CmdArgs.push_back("-lc_p");
5617 else
5618 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005619 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005620
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005621 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005622 }
5623
5624 if (!Args.hasArg(options::OPT_nostdlib) &&
5625 !Args.hasArg(options::OPT_nostartfiles)) {
5626 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005627 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005628 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005629 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005630 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005631 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005632 }
5633
5634 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005635 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005636 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005637}
Ed Schoutene33194b2009-04-02 19:13:12 +00005638
Eli Friedman9fa28852012-08-08 23:57:20 +00005639void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5640 const InputInfo &Output,
5641 const InputInfoList &Inputs,
5642 const ArgList &Args,
5643 const char *LinkingOutput) const {
5644 ArgStringList CmdArgs;
5645
5646 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5647 options::OPT_Xassembler);
5648
5649 CmdArgs.push_back("-o");
5650 CmdArgs.push_back(Output.getFilename());
5651
5652 for (InputInfoList::const_iterator
5653 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5654 const InputInfo &II = *it;
5655 CmdArgs.push_back(II.getFilename());
5656 }
5657
5658 const char *Exec =
5659 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5660 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5661}
5662
5663void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5664 const InputInfo &Output,
5665 const InputInfoList &Inputs,
5666 const ArgList &Args,
5667 const char *LinkingOutput) const {
5668 const Driver &D = getToolChain().getDriver();
5669 ArgStringList CmdArgs;
5670
5671 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5672 (!Args.hasArg(options::OPT_shared))) {
5673 CmdArgs.push_back("-e");
5674 CmdArgs.push_back("__start");
5675 }
5676
5677 if (Args.hasArg(options::OPT_static)) {
5678 CmdArgs.push_back("-Bstatic");
5679 } else {
5680 if (Args.hasArg(options::OPT_rdynamic))
5681 CmdArgs.push_back("-export-dynamic");
5682 CmdArgs.push_back("--eh-frame-hdr");
5683 CmdArgs.push_back("-Bdynamic");
5684 if (Args.hasArg(options::OPT_shared)) {
5685 CmdArgs.push_back("-shared");
5686 } else {
5687 CmdArgs.push_back("-dynamic-linker");
5688 CmdArgs.push_back("/usr/libexec/ld.so");
5689 }
5690 }
5691
5692 if (Output.isFilename()) {
5693 CmdArgs.push_back("-o");
5694 CmdArgs.push_back(Output.getFilename());
5695 } else {
5696 assert(Output.isNothing() && "Invalid output.");
5697 }
5698
5699 if (!Args.hasArg(options::OPT_nostdlib) &&
5700 !Args.hasArg(options::OPT_nostartfiles)) {
5701 if (!Args.hasArg(options::OPT_shared)) {
5702 if (Args.hasArg(options::OPT_pg))
5703 CmdArgs.push_back(Args.MakeArgString(
5704 getToolChain().GetFilePath("gcrt0.o")));
5705 else
5706 CmdArgs.push_back(Args.MakeArgString(
5707 getToolChain().GetFilePath("crt0.o")));
5708 CmdArgs.push_back(Args.MakeArgString(
5709 getToolChain().GetFilePath("crtbegin.o")));
5710 } else {
5711 CmdArgs.push_back(Args.MakeArgString(
5712 getToolChain().GetFilePath("crtbeginS.o")));
5713 }
5714 }
5715
5716 Args.AddAllArgs(CmdArgs, options::OPT_L);
5717 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5718 Args.AddAllArgs(CmdArgs, options::OPT_e);
5719
5720 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5721
5722 if (!Args.hasArg(options::OPT_nostdlib) &&
5723 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005724 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005725 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5726 if (Args.hasArg(options::OPT_pg))
5727 CmdArgs.push_back("-lm_p");
5728 else
5729 CmdArgs.push_back("-lm");
5730 }
5731
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005732 if (Args.hasArg(options::OPT_pthread)) {
5733 if (!Args.hasArg(options::OPT_shared) &&
5734 Args.hasArg(options::OPT_pg))
5735 CmdArgs.push_back("-lpthread_p");
5736 else
5737 CmdArgs.push_back("-lpthread");
5738 }
5739
Eli Friedman9fa28852012-08-08 23:57:20 +00005740 if (!Args.hasArg(options::OPT_shared)) {
5741 if (Args.hasArg(options::OPT_pg))
5742 CmdArgs.push_back("-lc_p");
5743 else
5744 CmdArgs.push_back("-lc");
5745 }
5746
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005747 StringRef MyArch;
5748 switch (getToolChain().getTriple().getArch()) {
5749 case llvm::Triple::arm:
5750 MyArch = "arm";
5751 break;
5752 case llvm::Triple::x86:
5753 MyArch = "i386";
5754 break;
5755 case llvm::Triple::x86_64:
5756 MyArch = "amd64";
5757 break;
5758 default:
5759 llvm_unreachable("Unsupported architecture");
5760 }
5761 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005762 }
5763
5764 if (!Args.hasArg(options::OPT_nostdlib) &&
5765 !Args.hasArg(options::OPT_nostartfiles)) {
5766 if (!Args.hasArg(options::OPT_shared))
5767 CmdArgs.push_back(Args.MakeArgString(
5768 getToolChain().GetFilePath("crtend.o")));
5769 else
5770 CmdArgs.push_back(Args.MakeArgString(
5771 getToolChain().GetFilePath("crtendS.o")));
5772 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005773
5774 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005775 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005776 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005777}
5778
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005779void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005780 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005781 const InputInfoList &Inputs,
5782 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005783 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005784 ArgStringList CmdArgs;
5785
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005786 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5787 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005788 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005789 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005790 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005791 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005792 else if (getToolChain().getArch() == llvm::Triple::mips ||
5793 getToolChain().getArch() == llvm::Triple::mipsel ||
5794 getToolChain().getArch() == llvm::Triple::mips64 ||
5795 getToolChain().getArch() == llvm::Triple::mips64el) {
5796 StringRef CPUName;
5797 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005798 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005799
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005800 CmdArgs.push_back("-march");
5801 CmdArgs.push_back(CPUName.data());
5802
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005803 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005804 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005805
5806 if (getToolChain().getArch() == llvm::Triple::mips ||
5807 getToolChain().getArch() == llvm::Triple::mips64)
5808 CmdArgs.push_back("-EB");
5809 else
5810 CmdArgs.push_back("-EL");
5811
5812 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5813 options::OPT_fpic, options::OPT_fno_pic,
5814 options::OPT_fPIE, options::OPT_fno_PIE,
5815 options::OPT_fpie, options::OPT_fno_pie);
5816 if (LastPICArg &&
5817 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5818 LastPICArg->getOption().matches(options::OPT_fpic) ||
5819 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5820 LastPICArg->getOption().matches(options::OPT_fpie))) {
5821 CmdArgs.push_back("-KPIC");
5822 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005823 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5824 getToolChain().getArch() == llvm::Triple::thumb) {
5825 CmdArgs.push_back("-mfpu=softvfp");
5826 switch(getToolChain().getTriple().getEnvironment()) {
5827 case llvm::Triple::GNUEABI:
5828 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005829 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005830 break;
5831
5832 default:
5833 CmdArgs.push_back("-matpcs");
5834 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005835 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005836
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005837 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5838 options::OPT_Xassembler);
5839
5840 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005841 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005842
5843 for (InputInfoList::const_iterator
5844 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5845 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005846 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005847 }
5848
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005849 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005850 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005851 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005852}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005853
5854void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005855 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005856 const InputInfoList &Inputs,
5857 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005858 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005859 const toolchains::FreeBSD& ToolChain =
5860 static_cast<const toolchains::FreeBSD&>(getToolChain());
5861 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005862 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005863
5864 // Silence warning for "clang -g foo.o -o foo"
5865 Args.ClaimAllArgs(options::OPT_g_Group);
5866 // and "clang -emit-llvm foo.o -o foo"
5867 Args.ClaimAllArgs(options::OPT_emit_llvm);
5868 // and for "clang -w foo.o -o foo". Other warning options are already
5869 // handled somewhere else.
5870 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005871
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005872 if (!D.SysRoot.empty())
5873 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5874
Roman Divackyafe2f232012-08-28 15:09:03 +00005875 if (Args.hasArg(options::OPT_pie))
5876 CmdArgs.push_back("-pie");
5877
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005878 if (Args.hasArg(options::OPT_static)) {
5879 CmdArgs.push_back("-Bstatic");
5880 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005881 if (Args.hasArg(options::OPT_rdynamic))
5882 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005883 CmdArgs.push_back("--eh-frame-hdr");
5884 if (Args.hasArg(options::OPT_shared)) {
5885 CmdArgs.push_back("-Bshareable");
5886 } else {
5887 CmdArgs.push_back("-dynamic-linker");
5888 CmdArgs.push_back("/libexec/ld-elf.so.1");
5889 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005890 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5891 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005892 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5893 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5894 CmdArgs.push_back("--hash-style=both");
5895 }
5896 }
5897 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005898 }
5899
5900 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5901 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005902 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005903 CmdArgs.push_back("-m");
5904 CmdArgs.push_back("elf_i386_fbsd");
5905 }
5906
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005907 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005908 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005909 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005910 }
5911
Daniel Dunbarb440f562010-08-02 02:38:21 +00005912 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005913 CmdArgs.push_back("-o");
5914 CmdArgs.push_back(Output.getFilename());
5915 } else {
5916 assert(Output.isNothing() && "Invalid output.");
5917 }
5918
5919 if (!Args.hasArg(options::OPT_nostdlib) &&
5920 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005921 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005922 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005923 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005924 crt1 = "gcrt1.o";
5925 else if (Args.hasArg(options::OPT_pie))
5926 crt1 = "Scrt1.o";
5927 else
5928 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005929 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005930 if (crt1)
5931 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5932
5933 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5934
5935 const char *crtbegin = NULL;
5936 if (Args.hasArg(options::OPT_static))
5937 crtbegin = "crtbeginT.o";
5938 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5939 crtbegin = "crtbeginS.o";
5940 else
5941 crtbegin = "crtbegin.o";
5942
5943 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005944 }
5945
5946 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005947 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005948 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5949 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005950 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005951 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5952 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005953 Args.AddAllArgs(CmdArgs, options::OPT_s);
5954 Args.AddAllArgs(CmdArgs, options::OPT_t);
5955 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5956 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005957
Alp Tokerce365ca2013-12-02 12:43:03 +00005958 if (D.IsUsingLTO(Args))
5959 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00005960
Roman Divackyafe2f232012-08-28 15:09:03 +00005961 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005962
5963 if (!Args.hasArg(options::OPT_nostdlib) &&
5964 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005965 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005966 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005967 if (Args.hasArg(options::OPT_pg))
5968 CmdArgs.push_back("-lm_p");
5969 else
5970 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005971 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005972 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5973 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005974 if (Args.hasArg(options::OPT_pg))
5975 CmdArgs.push_back("-lgcc_p");
5976 else
5977 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005978 if (Args.hasArg(options::OPT_static)) {
5979 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005980 } else if (Args.hasArg(options::OPT_pg)) {
5981 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005982 } else {
5983 CmdArgs.push_back("--as-needed");
5984 CmdArgs.push_back("-lgcc_s");
5985 CmdArgs.push_back("--no-as-needed");
5986 }
5987
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005988 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005989 if (Args.hasArg(options::OPT_pg))
5990 CmdArgs.push_back("-lpthread_p");
5991 else
5992 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005993 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005994
Roman Divacky66f22762011-02-10 16:59:40 +00005995 if (Args.hasArg(options::OPT_pg)) {
5996 if (Args.hasArg(options::OPT_shared))
5997 CmdArgs.push_back("-lc");
5998 else
5999 CmdArgs.push_back("-lc_p");
6000 CmdArgs.push_back("-lgcc_p");
6001 } else {
6002 CmdArgs.push_back("-lc");
6003 CmdArgs.push_back("-lgcc");
6004 }
6005
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006006 if (Args.hasArg(options::OPT_static)) {
6007 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006008 } else if (Args.hasArg(options::OPT_pg)) {
6009 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006010 } else {
6011 CmdArgs.push_back("--as-needed");
6012 CmdArgs.push_back("-lgcc_s");
6013 CmdArgs.push_back("--no-as-needed");
6014 }
6015 }
6016
6017 if (!Args.hasArg(options::OPT_nostdlib) &&
6018 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00006019 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00006020 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006021 else
6022 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006023 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006024 }
6025
Roman Divackyafe2f232012-08-28 15:09:03 +00006026 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006027
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006028 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006029 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006030 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006031}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006032
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006033void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6034 const InputInfo &Output,
6035 const InputInfoList &Inputs,
6036 const ArgList &Args,
6037 const char *LinkingOutput) const {
6038 ArgStringList CmdArgs;
6039
6040 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6041 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006042 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006043 CmdArgs.push_back("--32");
6044
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006045 // Pass the target CPU to GNU as for ARM, since the source code might
6046 // not have the correct .cpu annotation.
6047 if (getToolChain().getArch() == llvm::Triple::arm) {
6048 std::string MArch(getARMTargetCPU(Args, getToolChain().getTriple()));
6049 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6050 }
6051
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006052 if (getToolChain().getArch() == llvm::Triple::mips ||
6053 getToolChain().getArch() == llvm::Triple::mipsel ||
6054 getToolChain().getArch() == llvm::Triple::mips64 ||
6055 getToolChain().getArch() == llvm::Triple::mips64el) {
6056 StringRef CPUName;
6057 StringRef ABIName;
6058 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6059
6060 CmdArgs.push_back("-march");
6061 CmdArgs.push_back(CPUName.data());
6062
6063 CmdArgs.push_back("-mabi");
6064 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6065
6066 if (getToolChain().getArch() == llvm::Triple::mips ||
6067 getToolChain().getArch() == llvm::Triple::mips64)
6068 CmdArgs.push_back("-EB");
6069 else
6070 CmdArgs.push_back("-EL");
6071
6072 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6073 options::OPT_fpic, options::OPT_fno_pic,
6074 options::OPT_fPIE, options::OPT_fno_PIE,
6075 options::OPT_fpie, options::OPT_fno_pie);
6076 if (LastPICArg &&
6077 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6078 LastPICArg->getOption().matches(options::OPT_fpic) ||
6079 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6080 LastPICArg->getOption().matches(options::OPT_fpie))) {
6081 CmdArgs.push_back("-KPIC");
6082 }
6083 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006084
6085 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6086 options::OPT_Xassembler);
6087
6088 CmdArgs.push_back("-o");
6089 CmdArgs.push_back(Output.getFilename());
6090
6091 for (InputInfoList::const_iterator
6092 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6093 const InputInfo &II = *it;
6094 CmdArgs.push_back(II.getFilename());
6095 }
6096
David Chisnallddbd68f2011-09-27 22:03:18 +00006097 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006098 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6099}
6100
6101void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6102 const InputInfo &Output,
6103 const InputInfoList &Inputs,
6104 const ArgList &Args,
6105 const char *LinkingOutput) const {
6106 const Driver &D = getToolChain().getDriver();
6107 ArgStringList CmdArgs;
6108
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006109 if (!D.SysRoot.empty())
6110 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6111
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006112 if (Args.hasArg(options::OPT_static)) {
6113 CmdArgs.push_back("-Bstatic");
6114 } else {
6115 if (Args.hasArg(options::OPT_rdynamic))
6116 CmdArgs.push_back("-export-dynamic");
6117 CmdArgs.push_back("--eh-frame-hdr");
6118 if (Args.hasArg(options::OPT_shared)) {
6119 CmdArgs.push_back("-Bshareable");
6120 } else {
6121 CmdArgs.push_back("-dynamic-linker");
6122 CmdArgs.push_back("/libexec/ld.elf_so");
6123 }
6124 }
6125
6126 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6127 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006128 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006129 CmdArgs.push_back("-m");
6130 CmdArgs.push_back("elf_i386");
6131 }
6132
6133 if (Output.isFilename()) {
6134 CmdArgs.push_back("-o");
6135 CmdArgs.push_back(Output.getFilename());
6136 } else {
6137 assert(Output.isNothing() && "Invalid output.");
6138 }
6139
6140 if (!Args.hasArg(options::OPT_nostdlib) &&
6141 !Args.hasArg(options::OPT_nostartfiles)) {
6142 if (!Args.hasArg(options::OPT_shared)) {
6143 CmdArgs.push_back(Args.MakeArgString(
6144 getToolChain().GetFilePath("crt0.o")));
6145 CmdArgs.push_back(Args.MakeArgString(
6146 getToolChain().GetFilePath("crti.o")));
6147 CmdArgs.push_back(Args.MakeArgString(
6148 getToolChain().GetFilePath("crtbegin.o")));
6149 } else {
6150 CmdArgs.push_back(Args.MakeArgString(
6151 getToolChain().GetFilePath("crti.o")));
6152 CmdArgs.push_back(Args.MakeArgString(
6153 getToolChain().GetFilePath("crtbeginS.o")));
6154 }
6155 }
6156
6157 Args.AddAllArgs(CmdArgs, options::OPT_L);
6158 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6159 Args.AddAllArgs(CmdArgs, options::OPT_e);
6160 Args.AddAllArgs(CmdArgs, options::OPT_s);
6161 Args.AddAllArgs(CmdArgs, options::OPT_t);
6162 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6163 Args.AddAllArgs(CmdArgs, options::OPT_r);
6164
6165 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6166
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006167 unsigned Major, Minor, Micro;
6168 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6169 bool useLibgcc = true;
6170 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
6171 if (getToolChain().getArch() == llvm::Triple::x86 ||
6172 getToolChain().getArch() == llvm::Triple::x86_64)
6173 useLibgcc = false;
6174 }
6175
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006176 if (!Args.hasArg(options::OPT_nostdlib) &&
6177 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006178 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006179 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6180 CmdArgs.push_back("-lm");
6181 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006182 if (Args.hasArg(options::OPT_pthread))
6183 CmdArgs.push_back("-lpthread");
6184 CmdArgs.push_back("-lc");
6185
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006186 if (useLibgcc) {
6187 if (Args.hasArg(options::OPT_static)) {
6188 // libgcc_eh depends on libc, so resolve as much as possible,
6189 // pull in any new requirements from libc and then get the rest
6190 // of libgcc.
6191 CmdArgs.push_back("-lgcc_eh");
6192 CmdArgs.push_back("-lc");
6193 CmdArgs.push_back("-lgcc");
6194 } else {
6195 CmdArgs.push_back("-lgcc");
6196 CmdArgs.push_back("--as-needed");
6197 CmdArgs.push_back("-lgcc_s");
6198 CmdArgs.push_back("--no-as-needed");
6199 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006200 }
6201 }
6202
6203 if (!Args.hasArg(options::OPT_nostdlib) &&
6204 !Args.hasArg(options::OPT_nostartfiles)) {
6205 if (!Args.hasArg(options::OPT_shared))
6206 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6207 "crtend.o")));
6208 else
6209 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6210 "crtendS.o")));
6211 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6212 "crtn.o")));
6213 }
6214
Bill Wendling08760582011-06-27 19:15:03 +00006215 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006216
Rafael Espindola236db462013-11-09 20:07:19 +00006217 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006218 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6219}
6220
Thomas Schwinge4e555262013-03-28 19:04:25 +00006221void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6222 const InputInfo &Output,
6223 const InputInfoList &Inputs,
6224 const ArgList &Args,
6225 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006226 ArgStringList CmdArgs;
6227
6228 // Add --32/--64 to make sure we get the format we want.
6229 // This is incomplete
6230 if (getToolChain().getArch() == llvm::Triple::x86) {
6231 CmdArgs.push_back("--32");
6232 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6233 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006234 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6235 CmdArgs.push_back("-a32");
6236 CmdArgs.push_back("-mppc");
6237 CmdArgs.push_back("-many");
6238 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6239 CmdArgs.push_back("-a64");
6240 CmdArgs.push_back("-mppc64");
6241 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006242 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6243 CmdArgs.push_back("-a64");
6244 CmdArgs.push_back("-mppc64le");
6245 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00006246 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006247 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006248 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6249 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006250 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6251 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006252
Tim Northover9c7e0352013-12-12 11:55:52 +00006253 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6254 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006255 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006256
6257 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006258
6259 // FIXME: remove krait check when GNU tools support krait cpu
6260 // for now replace it with -march=armv7-a to avoid a lower
6261 // march from being picked in the absence of a cpu flag.
6262 Arg *A;
6263 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6264 StringRef(A->getValue()) == "krait")
6265 CmdArgs.push_back("-march=armv7-a");
6266 else
6267 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006268 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006269 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6270 getToolChain().getArch() == llvm::Triple::mipsel ||
6271 getToolChain().getArch() == llvm::Triple::mips64 ||
6272 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006273 StringRef CPUName;
6274 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006275 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006276
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006277 CmdArgs.push_back("-march");
6278 CmdArgs.push_back(CPUName.data());
6279
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006280 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006281 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006282
6283 if (getToolChain().getArch() == llvm::Triple::mips ||
6284 getToolChain().getArch() == llvm::Triple::mips64)
6285 CmdArgs.push_back("-EB");
6286 else
6287 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006288
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006289 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6290 if (StringRef(A->getValue()) == "2008")
6291 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6292 }
6293
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006294 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006295 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6296 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6297 options::OPT_mno_micromips);
6298 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6299 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6300
Simon Atanasyanbd986632013-11-26 11:58:04 +00006301 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6302 // Do not use AddLastArg because not all versions of MIPS assembler
6303 // support -mmsa / -mno-msa options.
6304 if (A->getOption().matches(options::OPT_mmsa))
6305 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6306 }
6307
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006308 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6309 options::OPT_fpic, options::OPT_fno_pic,
6310 options::OPT_fPIE, options::OPT_fno_PIE,
6311 options::OPT_fpie, options::OPT_fno_pie);
6312 if (LastPICArg &&
6313 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6314 LastPICArg->getOption().matches(options::OPT_fpic) ||
6315 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6316 LastPICArg->getOption().matches(options::OPT_fpie))) {
6317 CmdArgs.push_back("-KPIC");
6318 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006319 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006320 // Always pass an -march option, since our default of z10 is later
6321 // than the GNU assembler's default.
6322 StringRef CPUName = getSystemZTargetCPU(Args);
6323 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006324 }
6325
6326 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6327 options::OPT_Xassembler);
6328
6329 CmdArgs.push_back("-o");
6330 CmdArgs.push_back(Output.getFilename());
6331
6332 for (InputInfoList::const_iterator
6333 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6334 const InputInfo &II = *it;
6335 CmdArgs.push_back(II.getFilename());
6336 }
6337
6338 const char *Exec =
6339 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6340 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006341
6342 // Handle the debug info splitting at object creation time if we're
6343 // creating an object.
6344 // TODO: Currently only works on linux with newer objcopy.
6345 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006346 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006347 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6348 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006349}
6350
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006351static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6352 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006353 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006354 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6355 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006356 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006357 CmdArgs.push_back("-lgcc");
6358
Logan Chien3d3373c2012-11-19 12:04:11 +00006359 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006360 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006361 CmdArgs.push_back("-lgcc");
6362 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006363 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006364 CmdArgs.push_back("--as-needed");
6365 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006366 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006367 CmdArgs.push_back("--no-as-needed");
6368 }
6369
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006370 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006371 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006372 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006373 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006374
6375 // According to Android ABI, we have to link with libdl if we are
6376 // linking with non-static libgcc.
6377 //
6378 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6379 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6380 if (isAndroid && !StaticLibgcc)
6381 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006382}
6383
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006384static bool hasMipsN32ABIArg(const ArgList &Args) {
6385 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006386 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006387}
6388
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006389static StringRef getLinuxDynamicLinker(const ArgList &Args,
6390 const toolchains::Linux &ToolChain) {
6391 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6392 return "/system/bin/linker";
6393 else if (ToolChain.getArch() == llvm::Triple::x86)
6394 return "/lib/ld-linux.so.2";
6395 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6396 return "/lib/ld-linux-aarch64.so.1";
6397 else if (ToolChain.getArch() == llvm::Triple::arm ||
6398 ToolChain.getArch() == llvm::Triple::thumb) {
6399 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6400 return "/lib/ld-linux-armhf.so.3";
6401 else
6402 return "/lib/ld-linux.so.3";
6403 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6404 ToolChain.getArch() == llvm::Triple::mipsel)
6405 return "/lib/ld.so.1";
6406 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6407 ToolChain.getArch() == llvm::Triple::mips64el) {
6408 if (hasMipsN32ABIArg(Args))
6409 return "/lib32/ld.so.1";
6410 else
6411 return "/lib64/ld.so.1";
6412 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6413 return "/lib/ld.so.1";
6414 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006415 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006416 ToolChain.getArch() == llvm::Triple::systemz)
6417 return "/lib64/ld64.so.1";
6418 else
6419 return "/lib64/ld-linux-x86-64.so.2";
6420}
6421
Thomas Schwinge4e555262013-03-28 19:04:25 +00006422void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6423 const InputInfo &Output,
6424 const InputInfoList &Inputs,
6425 const ArgList &Args,
6426 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006427 const toolchains::Linux& ToolChain =
6428 static_cast<const toolchains::Linux&>(getToolChain());
6429 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006430 const bool isAndroid =
6431 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006432 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006433 const bool IsPIE =
6434 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006435 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006436
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006437 ArgStringList CmdArgs;
6438
Rafael Espindolad1002f62010-11-15 18:28:16 +00006439 // Silence warning for "clang -g foo.o -o foo"
6440 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006441 // and "clang -emit-llvm foo.o -o foo"
6442 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006443 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006444 // handled somewhere else.
6445 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006446
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006447 if (!D.SysRoot.empty())
6448 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006449
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006450 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006451 CmdArgs.push_back("-pie");
6452
Rafael Espindola1c76c592010-11-07 22:57:16 +00006453 if (Args.hasArg(options::OPT_rdynamic))
6454 CmdArgs.push_back("-export-dynamic");
6455
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006456 if (Args.hasArg(options::OPT_s))
6457 CmdArgs.push_back("-s");
6458
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006459 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6460 e = ToolChain.ExtraOpts.end();
6461 i != e; ++i)
6462 CmdArgs.push_back(i->c_str());
6463
6464 if (!Args.hasArg(options::OPT_static)) {
6465 CmdArgs.push_back("--eh-frame-hdr");
6466 }
6467
6468 CmdArgs.push_back("-m");
6469 if (ToolChain.getArch() == llvm::Triple::x86)
6470 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006471 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6472 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006473 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006474 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006475 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006476 else if (ToolChain.getArch() == llvm::Triple::ppc)
6477 CmdArgs.push_back("elf32ppclinux");
6478 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6479 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006480 else if (ToolChain.getArch() == llvm::Triple::mips)
6481 CmdArgs.push_back("elf32btsmip");
6482 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6483 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006484 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6485 if (hasMipsN32ABIArg(Args))
6486 CmdArgs.push_back("elf32btsmipn32");
6487 else
6488 CmdArgs.push_back("elf64btsmip");
6489 }
6490 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6491 if (hasMipsN32ABIArg(Args))
6492 CmdArgs.push_back("elf32ltsmipn32");
6493 else
6494 CmdArgs.push_back("elf64ltsmip");
6495 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006496 else if (ToolChain.getArch() == llvm::Triple::systemz)
6497 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006498 else
6499 CmdArgs.push_back("elf_x86_64");
6500
6501 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006502 if (ToolChain.getArch() == llvm::Triple::arm
6503 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006504 CmdArgs.push_back("-Bstatic");
6505 else
6506 CmdArgs.push_back("-static");
6507 } else if (Args.hasArg(options::OPT_shared)) {
6508 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006509 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006510 CmdArgs.push_back("-Bsymbolic");
6511 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006512 }
6513
6514 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006515 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006516 (!Args.hasArg(options::OPT_static) &&
6517 !Args.hasArg(options::OPT_shared))) {
6518 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006519 CmdArgs.push_back(Args.MakeArgString(
6520 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006521 }
6522
6523 CmdArgs.push_back("-o");
6524 CmdArgs.push_back(Output.getFilename());
6525
Rafael Espindola81937ec2010-12-01 01:52:43 +00006526 if (!Args.hasArg(options::OPT_nostdlib) &&
6527 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006528 if (!isAndroid) {
6529 const char *crt1 = NULL;
6530 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006531 if (Args.hasArg(options::OPT_pg))
6532 crt1 = "gcrt1.o";
6533 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006534 crt1 = "Scrt1.o";
6535 else
6536 crt1 = "crt1.o";
6537 }
6538 if (crt1)
6539 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006540
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006541 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6542 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006543
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006544 const char *crtbegin;
6545 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006546 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006547 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006548 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006549 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006550 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006551 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006552 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006553 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006554
6555 // Add crtfastmath.o if available and fast math is enabled.
6556 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006557 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006558
6559 Args.AddAllArgs(CmdArgs, options::OPT_L);
6560
6561 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6562
Roman Divackyee8188a2011-03-01 17:53:14 +00006563 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6564 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006565 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006566
Alp Tokerce365ca2013-12-02 12:43:03 +00006567 if (D.IsUsingLTO(Args))
6568 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006569
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006570 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6571 CmdArgs.push_back("--no-demangle");
6572
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006573 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6574
Eric Christopher04997782012-11-29 18:51:05 +00006575 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006576 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006577 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006578 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006579 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006580 if (Sanitize.needsAsanRt())
6581 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6582 if (Sanitize.needsTsanRt())
6583 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006584 if (Sanitize.needsMsanRt())
6585 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006586 if (Sanitize.needsLsanRt())
6587 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006588 if (Sanitize.needsDfsanRt())
6589 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006590
Chandler Carruthe4458b32013-06-24 09:38:45 +00006591 // The profile runtime also needs access to system libraries.
6592 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6593
Hans Wennborg70850d82013-07-18 20:29:38 +00006594 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006595 !Args.hasArg(options::OPT_nostdlib) &&
6596 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006597 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6598 !Args.hasArg(options::OPT_static);
6599 if (OnlyLibstdcxxStatic)
6600 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006601 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006602 if (OnlyLibstdcxxStatic)
6603 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006604 CmdArgs.push_back("-lm");
6605 }
6606
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006607 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006608 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6609 if (Args.hasArg(options::OPT_static))
6610 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006611
Chandler Carruth01538002013-01-17 13:19:29 +00006612 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6613 if (OpenMP) {
6614 CmdArgs.push_back("-lgomp");
6615
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006616 // FIXME: Exclude this for platforms with libgomp that don't require
6617 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006618 CmdArgs.push_back("-lrt");
6619 }
6620
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006621 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006622
Chandler Carruth94a32012012-05-14 18:31:18 +00006623 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006624 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006625 CmdArgs.push_back("-lpthread");
6626
6627 CmdArgs.push_back("-lc");
6628
6629 if (Args.hasArg(options::OPT_static))
6630 CmdArgs.push_back("--end-group");
6631 else
6632 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6633 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006634
Rafael Espindola81937ec2010-12-01 01:52:43 +00006635 if (!Args.hasArg(options::OPT_nostartfiles)) {
6636 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006637 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006638 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006639 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006640 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006641 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006642 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006643
Rafael Espindola81937ec2010-12-01 01:52:43 +00006644 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006645 if (!isAndroid)
6646 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006647 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006648 }
6649
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006650 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6651}
Rafael Espindola92b00932010-08-10 00:25:48 +00006652
Chris Lattner3e2ee142010-07-07 16:01:42 +00006653void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006654 const InputInfo &Output,
6655 const InputInfoList &Inputs,
6656 const ArgList &Args,
6657 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006658 ArgStringList CmdArgs;
6659
6660 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6661 options::OPT_Xassembler);
6662
6663 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006664 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006665
6666 for (InputInfoList::const_iterator
6667 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6668 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006669 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006670 }
6671
6672 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006673 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006674 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006675}
6676
6677void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006678 const InputInfo &Output,
6679 const InputInfoList &Inputs,
6680 const ArgList &Args,
6681 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006682 const Driver &D = getToolChain().getDriver();
6683 ArgStringList CmdArgs;
6684
Daniel Dunbarb440f562010-08-02 02:38:21 +00006685 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006686 CmdArgs.push_back("-o");
6687 CmdArgs.push_back(Output.getFilename());
6688 } else {
6689 assert(Output.isNothing() && "Invalid output.");
6690 }
6691
6692 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006693 !Args.hasArg(options::OPT_nostartfiles)) {
6694 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6695 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6696 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6697 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6698 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006699
6700 Args.AddAllArgs(CmdArgs, options::OPT_L);
6701 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6702 Args.AddAllArgs(CmdArgs, options::OPT_e);
6703
Daniel Dunbar54423b22010-09-17 00:24:54 +00006704 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006705
Eli Friedman83de5132011-12-08 23:54:21 +00006706 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6707
Chris Lattner3e2ee142010-07-07 16:01:42 +00006708 if (!Args.hasArg(options::OPT_nostdlib) &&
6709 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006710 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006711 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006712 CmdArgs.push_back("-lm");
6713 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006714 }
6715
6716 if (!Args.hasArg(options::OPT_nostdlib) &&
6717 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006718 if (Args.hasArg(options::OPT_pthread))
6719 CmdArgs.push_back("-lpthread");
6720 CmdArgs.push_back("-lc");
6721 CmdArgs.push_back("-lCompilerRT-Generic");
6722 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6723 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006724 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006725 }
6726
Rafael Espindola236db462013-11-09 20:07:19 +00006727 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006728 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006729}
6730
Daniel Dunbarcc912342009-05-02 18:28:39 +00006731/// DragonFly Tools
6732
6733// For now, DragonFly Assemble does just about the same as for
6734// FreeBSD, but this may change soon.
6735void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006736 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006737 const InputInfoList &Inputs,
6738 const ArgList &Args,
6739 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006740 ArgStringList CmdArgs;
6741
6742 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6743 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006744 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006745 CmdArgs.push_back("--32");
6746
6747 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6748 options::OPT_Xassembler);
6749
6750 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006751 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006752
6753 for (InputInfoList::const_iterator
6754 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6755 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006756 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006757 }
6758
6759 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006760 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006761 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006762}
6763
6764void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006765 const InputInfo &Output,
6766 const InputInfoList &Inputs,
6767 const ArgList &Args,
6768 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006769 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006770 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006771 ArgStringList CmdArgs;
6772
John McCall65b8da02013-04-11 22:55:55 +00006773 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6774 UseGCC47 = false;
6775
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006776 if (!D.SysRoot.empty())
6777 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6778
John McCall65b8da02013-04-11 22:55:55 +00006779 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006780 if (Args.hasArg(options::OPT_static)) {
6781 CmdArgs.push_back("-Bstatic");
6782 } else {
John McCall65b8da02013-04-11 22:55:55 +00006783 if (Args.hasArg(options::OPT_rdynamic))
6784 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006785 if (Args.hasArg(options::OPT_shared))
6786 CmdArgs.push_back("-Bshareable");
6787 else {
6788 CmdArgs.push_back("-dynamic-linker");
6789 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6790 }
John McCall65b8da02013-04-11 22:55:55 +00006791 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006792 }
6793
6794 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6795 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006796 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006797 CmdArgs.push_back("-m");
6798 CmdArgs.push_back("elf_i386");
6799 }
6800
Daniel Dunbarb440f562010-08-02 02:38:21 +00006801 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006802 CmdArgs.push_back("-o");
6803 CmdArgs.push_back(Output.getFilename());
6804 } else {
6805 assert(Output.isNothing() && "Invalid output.");
6806 }
6807
6808 if (!Args.hasArg(options::OPT_nostdlib) &&
6809 !Args.hasArg(options::OPT_nostartfiles)) {
6810 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006811 if (Args.hasArg(options::OPT_pg))
6812 CmdArgs.push_back(Args.MakeArgString(
6813 getToolChain().GetFilePath("gcrt1.o")));
6814 else {
6815 if (Args.hasArg(options::OPT_pie))
6816 CmdArgs.push_back(Args.MakeArgString(
6817 getToolChain().GetFilePath("Scrt1.o")));
6818 else
6819 CmdArgs.push_back(Args.MakeArgString(
6820 getToolChain().GetFilePath("crt1.o")));
6821 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006822 }
John McCall65b8da02013-04-11 22:55:55 +00006823 CmdArgs.push_back(Args.MakeArgString(
6824 getToolChain().GetFilePath("crti.o")));
6825 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6826 CmdArgs.push_back(Args.MakeArgString(
6827 getToolChain().GetFilePath("crtbeginS.o")));
6828 else
6829 CmdArgs.push_back(Args.MakeArgString(
6830 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006831 }
6832
6833 Args.AddAllArgs(CmdArgs, options::OPT_L);
6834 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6835 Args.AddAllArgs(CmdArgs, options::OPT_e);
6836
Daniel Dunbar54423b22010-09-17 00:24:54 +00006837 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006838
6839 if (!Args.hasArg(options::OPT_nostdlib) &&
6840 !Args.hasArg(options::OPT_nodefaultlibs)) {
6841 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6842 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006843 if (UseGCC47)
6844 CmdArgs.push_back("-L/usr/lib/gcc47");
6845 else
6846 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006847
6848 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006849 if (UseGCC47) {
6850 CmdArgs.push_back("-rpath");
6851 CmdArgs.push_back("/usr/lib/gcc47");
6852 } else {
6853 CmdArgs.push_back("-rpath");
6854 CmdArgs.push_back("/usr/lib/gcc44");
6855 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006856 }
6857
Hans Wennborg70850d82013-07-18 20:29:38 +00006858 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006859 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006860 CmdArgs.push_back("-lm");
6861 }
6862
Daniel Dunbarcc912342009-05-02 18:28:39 +00006863 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006864 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006865
6866 if (!Args.hasArg(options::OPT_nolibc)) {
6867 CmdArgs.push_back("-lc");
6868 }
6869
John McCall65b8da02013-04-11 22:55:55 +00006870 if (UseGCC47) {
6871 if (Args.hasArg(options::OPT_static) ||
6872 Args.hasArg(options::OPT_static_libgcc)) {
6873 CmdArgs.push_back("-lgcc");
6874 CmdArgs.push_back("-lgcc_eh");
6875 } else {
6876 if (Args.hasArg(options::OPT_shared_libgcc)) {
6877 CmdArgs.push_back("-lgcc_pic");
6878 if (!Args.hasArg(options::OPT_shared))
6879 CmdArgs.push_back("-lgcc");
6880 } else {
6881 CmdArgs.push_back("-lgcc");
6882 CmdArgs.push_back("--as-needed");
6883 CmdArgs.push_back("-lgcc_pic");
6884 CmdArgs.push_back("--no-as-needed");
6885 }
6886 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006887 } else {
John McCall65b8da02013-04-11 22:55:55 +00006888 if (Args.hasArg(options::OPT_shared)) {
6889 CmdArgs.push_back("-lgcc_pic");
6890 } else {
6891 CmdArgs.push_back("-lgcc");
6892 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006893 }
6894 }
6895
6896 if (!Args.hasArg(options::OPT_nostdlib) &&
6897 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006898 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006899 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006900 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006901 else
6902 CmdArgs.push_back(Args.MakeArgString(
6903 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006904 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006905 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006906 }
6907
Bill Wendling08760582011-06-27 19:15:03 +00006908 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006909
Daniel Dunbarcc912342009-05-02 18:28:39 +00006910 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006911 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006912 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006913}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006914
6915void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6916 const InputInfo &Output,
6917 const InputInfoList &Inputs,
6918 const ArgList &Args,
6919 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006920 ArgStringList CmdArgs;
6921
6922 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006923 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6924 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006925 } else {
6926 assert(Output.isNothing() && "Invalid output.");
6927 }
6928
6929 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006930 !Args.hasArg(options::OPT_nostartfiles) &&
6931 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006932 CmdArgs.push_back("-defaultlib:libcmt");
6933 }
6934
6935 CmdArgs.push_back("-nologo");
6936
Hans Wennborgf1a74252013-09-10 20:18:04 +00006937 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6938
6939 if (DLL) {
6940 CmdArgs.push_back(Args.MakeArgString("-dll"));
6941
6942 SmallString<128> ImplibName(Output.getFilename());
6943 llvm::sys::path::replace_extension(ImplibName, "lib");
6944 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6945 ImplibName.str()));
6946 }
6947
Peter Collingbourne32701642013-11-01 18:16:25 +00006948 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006949 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006950 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006951 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006952 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6953 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006954 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006955 } else {
6956 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6957 }
6958 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006959 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6960 }
6961
Michael J. Spencere2f49362012-06-18 16:56:04 +00006962 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006963 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006964
6965 // Add filenames immediately.
6966 for (InputInfoList::const_iterator
6967 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6968 if (it->isFilename())
6969 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006970 else
6971 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006972 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006973
6974 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006975 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006976 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6977}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006978
6979void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6980 const InputInfo &Output,
6981 const InputInfoList &Inputs,
6982 const ArgList &Args,
6983 const char *LinkingOutput) const {
6984 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6985}
6986
Hans Wennborg188382e2013-09-20 18:16:35 +00006987// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6988// If one cannot be found, return FallbackName.
6989// We do this special search to prevent clang-cl from falling back onto itself
6990// if it's available as cl.exe on the path.
6991static std::string FindFallback(const char *FallbackName,
6992 const char *ClangProgramPath) {
6993 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6994 if (!OptPath.hasValue())
6995 return FallbackName;
6996
6997#ifdef LLVM_ON_WIN32
6998 const StringRef PathSeparators = ";";
6999#else
7000 const StringRef PathSeparators = ":";
7001#endif
7002
7003 SmallVector<StringRef, 8> PathSegments;
7004 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7005
7006 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7007 const StringRef &PathSegment = PathSegments[i];
7008 if (PathSegment.empty())
7009 continue;
7010
7011 SmallString<128> FilePath(PathSegment);
7012 llvm::sys::path::append(FilePath, FallbackName);
7013 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7014 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7015 return FilePath.str();
7016 }
7017
7018 return FallbackName;
7019}
7020
Hans Wennborg87cfa712013-09-19 20:32:16 +00007021Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7022 const InputInfo &Output,
7023 const InputInfoList &Inputs,
7024 const ArgList &Args,
7025 const char *LinkingOutput) const {
7026 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007027 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007028 CmdArgs.push_back("/c"); // Compile only.
7029 CmdArgs.push_back("/W0"); // No warnings.
7030
7031 // The goal is to be able to invoke this tool correctly based on
7032 // any flag accepted by clang-cl.
7033
7034 // These are spelled the same way in clang and cl.exe,.
7035 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7036 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007037
7038 // Optimization level.
7039 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7040 if (A->getOption().getID() == options::OPT_O0) {
7041 CmdArgs.push_back("/Od");
7042 } else {
7043 StringRef OptLevel = A->getValue();
7044 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7045 A->render(Args, CmdArgs);
7046 else if (OptLevel == "3")
7047 CmdArgs.push_back("/Ox");
7048 }
7049 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007050
7051 // Flags for which clang-cl have an alias.
7052 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7053
7054 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7055 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7056 : "/GR-");
7057 if (Args.hasArg(options::OPT_fsyntax_only))
7058 CmdArgs.push_back("/Zs");
7059
Hans Wennborg260ff402013-09-27 17:54:18 +00007060 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7061 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7062 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7063
Hans Wennborg87cfa712013-09-19 20:32:16 +00007064 // Flags that can simply be passed through.
7065 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7066 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7067
7068 // The order of these flags is relevant, so pick the last one.
7069 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7070 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7071 A->render(Args, CmdArgs);
7072
7073
7074 // Input filename.
7075 assert(Inputs.size() == 1);
7076 const InputInfo &II = Inputs[0];
7077 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7078 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7079 if (II.isFilename())
7080 CmdArgs.push_back(II.getFilename());
7081 else
7082 II.getInputArg().renderAsInput(Args, CmdArgs);
7083
7084 // Output filename.
7085 assert(Output.getType() == types::TY_Object);
7086 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7087 Output.getFilename());
7088 CmdArgs.push_back(Fo);
7089
Hans Wennborg188382e2013-09-20 18:16:35 +00007090 const Driver &D = getToolChain().getDriver();
7091 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007092
Hans Wennborg188382e2013-09-20 18:16:35 +00007093 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007094}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007095
7096
7097/// XCore Tools
7098// We pass assemble and link construction to the xcc tool.
7099
7100void XCore::Assemble::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 CmdArgs.push_back("-o");
7108 CmdArgs.push_back(Output.getFilename());
7109
7110 CmdArgs.push_back("-c");
7111
7112 if (Args.hasArg(options::OPT_g_Group)) {
7113 CmdArgs.push_back("-g");
7114 }
7115
7116 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7117 options::OPT_Xassembler);
7118
7119 for (InputInfoList::const_iterator
7120 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7121 const InputInfo &II = *it;
7122 CmdArgs.push_back(II.getFilename());
7123 }
7124
7125 const char *Exec =
7126 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7127 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7128}
7129
7130void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7131 const InputInfo &Output,
7132 const InputInfoList &Inputs,
7133 const ArgList &Args,
7134 const char *LinkingOutput) const {
7135 ArgStringList CmdArgs;
7136
7137 if (Output.isFilename()) {
7138 CmdArgs.push_back("-o");
7139 CmdArgs.push_back(Output.getFilename());
7140 } else {
7141 assert(Output.isNothing() && "Invalid output.");
7142 }
7143
7144 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7145
7146 const char *Exec =
7147 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7148 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7149}