blob: 7870f424eb46ca67963fbdeac50390930197832a [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")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000525 .Cases("armv5", "armv5t", "arm10tdmi")
526 .Cases("armv5e", "armv5te", "arm1022e")
527 .Case("armv5tej", "arm926ej-s")
528 .Cases("armv6", "armv6k", "arm1136jf-s")
529 .Case("armv6j", "arm1136j-s")
530 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
531 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000532 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000533 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000534 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000535 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
536 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000537 .Cases("armv7r", "armv7-r", "cortex-r4")
538 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Goulyd077bc62013-06-26 17:19:48 +0000539 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000540 .Case("ep9312", "ep9312")
541 .Case("iwmmxt", "iwmmxt")
542 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000543 // If all else failed, return the most base CPU with thumb interworking
544 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000545 .Default("arm7tdmi");
546}
547
Amara Emerson703da2e2013-10-31 09:32:33 +0000548/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
549//
550// FIXME: tblgen this.
551static std::string getAArch64TargetCPU(const ArgList &Args,
552 const llvm::Triple &Triple) {
553 // FIXME: Warn on inconsistent use of -mcpu and -march.
554
555 // If we have -mcpu=, use that.
556 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
557 StringRef MCPU = A->getValue();
558 // Handle -mcpu=native.
559 if (MCPU == "native")
560 return llvm::sys::getHostCPUName();
561 else
562 return MCPU;
563 }
564
565 return "generic";
566}
567
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000568// FIXME: Move to target hook.
569static bool isSignedCharDefault(const llvm::Triple &Triple) {
570 switch (Triple.getArch()) {
571 default:
572 return true;
573
Tim Northover9bb857a2013-01-31 12:13:10 +0000574 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000575 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000576 case llvm::Triple::ppc:
577 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000578 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000579 return true;
580 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000581
Bill Schmidt778d3872013-07-26 01:36:11 +0000582 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000583 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000584 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000585 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000586 }
587}
588
Robert Lytton0e076492013-08-13 09:43:10 +0000589static bool isNoCommonDefault(const llvm::Triple &Triple) {
590 switch (Triple.getArch()) {
591 default:
592 return false;
593
594 case llvm::Triple::xcore:
595 return true;
596 }
597}
598
Chad Rosiercfbfc582012-04-04 20:51:35 +0000599// Handle -mfpu=.
600//
601// FIXME: Centralize feature selection, defaulting shouldn't be also in the
602// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000603static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
604 const ArgList &Args,
605 std::vector<const char *> &Features) {
606 StringRef FPU = A->getValue();
607 if (FPU == "fp-armv8") {
608 Features.push_back("+fp-armv8");
609 } else if (FPU == "neon-fp-armv8") {
610 Features.push_back("+fp-armv8");
611 Features.push_back("+neon");
612 } else if (FPU == "crypto-neon-fp-armv8") {
613 Features.push_back("+fp-armv8");
614 Features.push_back("+neon");
615 Features.push_back("+crypto");
616 } else if (FPU == "neon") {
617 Features.push_back("+neon");
618 } else if (FPU == "none") {
619 Features.push_back("-fp-armv8");
620 Features.push_back("-crypto");
621 Features.push_back("-neon");
622 } else
623 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
624}
625
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000626// Handle -mhwdiv=.
627static void getARMHWDivFeatures(const Driver &D, const Arg *A,
628 const ArgList &Args,
629 std::vector<const char *> &Features) {
630 StringRef HWDiv = A->getValue();
631 if (HWDiv == "arm") {
632 Features.push_back("+hwdiv-arm");
633 Features.push_back("-hwdiv");
634 } else if (HWDiv == "thumb") {
635 Features.push_back("-hwdiv-arm");
636 Features.push_back("+hwdiv");
637 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
638 Features.push_back("+hwdiv-arm");
639 Features.push_back("+hwdiv");
640 } else if (HWDiv == "none") {
641 Features.push_back("-hwdiv-arm");
642 Features.push_back("-hwdiv");
643 } else
644 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
645}
646
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000647// Handle -mfpu=.
648//
649// FIXME: Centralize feature selection, defaulting shouldn't be also in the
650// frontend target.
651static void getARMFPUFeatures(const Driver &D, const Arg *A,
652 const ArgList &Args,
653 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000654 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000655
656 // Set the target features based on the FPU.
657 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
658 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000659 Features.push_back("-vfp2");
660 Features.push_back("-vfp3");
661 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000662 } else if (FPU == "vfp") {
663 Features.push_back("+vfp2");
664 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000665 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000666 Features.push_back("+vfp3");
667 Features.push_back("+d16");
668 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000669 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000670 Features.push_back("+vfp3");
671 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000672 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
673 Features.push_back("+vfp4");
674 Features.push_back("+d16");
675 Features.push_back("-neon");
676 } else if (FPU == "vfp4" || FPU == "vfpv4") {
677 Features.push_back("+vfp4");
678 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000679 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000680 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000681 Features.push_back("-neon");
682 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000683 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000684 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000685 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000686 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000687 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000688 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000689 Features.push_back("+neon");
690 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000691 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000692 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000693 } else if (FPU == "none") {
694 Features.push_back("-vfp2");
695 Features.push_back("-vfp3");
696 Features.push_back("-vfp4");
697 Features.push_back("-fp-armv8");
698 Features.push_back("-crypto");
699 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000700 } else
701 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
702}
703
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000704// Select the float ABI as determined by -msoft-float, -mhard-float, and
705// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000706StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
707 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000708 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000709 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
710 options::OPT_mhard_float,
711 options::OPT_mfloat_abi_EQ)) {
712 if (A->getOption().matches(options::OPT_msoft_float))
713 FloatABI = "soft";
714 else if (A->getOption().matches(options::OPT_mhard_float))
715 FloatABI = "hard";
716 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000717 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000718 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000719 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000720 << A->getAsString(Args);
721 FloatABI = "soft";
722 }
723 }
724 }
725
726 // If unspecified, choose the default based on the platform.
727 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000728 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000729 case llvm::Triple::Darwin:
730 case llvm::Triple::MacOSX:
731 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000732 // Darwin defaults to "softfp" for v6 and v7.
733 //
734 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000735 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000736 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000737 if (StringRef(ArchName).startswith("v6") ||
738 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000739 FloatABI = "softfp";
740 else
741 FloatABI = "soft";
742 break;
743 }
744
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000745 case llvm::Triple::FreeBSD:
746 // FreeBSD defaults to soft float
747 FloatABI = "soft";
748 break;
749
Daniel Dunbar78485922009-09-10 23:00:09 +0000750 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000751 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000752 case llvm::Triple::GNUEABIHF:
753 FloatABI = "hard";
754 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000755 case llvm::Triple::GNUEABI:
756 FloatABI = "softfp";
757 break;
758 case llvm::Triple::EABI:
759 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
760 FloatABI = "softfp";
761 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000762 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000763 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000764 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000765 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000766 FloatABI = "softfp";
767 else
768 FloatABI = "soft";
769 break;
770 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000771 default:
772 // Assume "soft", but warn the user we are guessing.
773 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000774 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000775 break;
776 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000777 }
778 }
779
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000780 return FloatABI;
781}
782
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000783static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
784 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000785 std::vector<const char *> &Features,
786 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000787 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000788 if (!ForAS) {
789 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
790 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
791 // stripped out by the ARM target. We should probably pass this a new
792 // -target-option, which is handled by the -cc1/-cc1as invocation.
793 //
794 // FIXME2: For consistency, it would be ideal if we set up the target
795 // machine state the same when using the frontend or the assembler. We don't
796 // currently do that for the assembler, we pass the options directly to the
797 // backend and never even instantiate the frontend TargetInfo. If we did,
798 // and used its handleTargetFeatures hook, then we could ensure the
799 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000800
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000801 // Use software floating point operations?
802 if (FloatABI == "soft")
803 Features.push_back("+soft-float");
804
805 // Use software floating point argument passing?
806 if (FloatABI != "hard")
807 Features.push_back("+soft-float-abi");
808 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000809
810 // Honor -mfpu=.
811 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000812 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000813 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
814 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000815
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000816 // Setting -msoft-float effectively disables NEON because of the GCC
817 // implementation, although the same isn't true of VFP or VFP3.
818 if (FloatABI == "soft")
819 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000820
821 // En/disable crc
822 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
823 options::OPT_mnocrc)) {
824 if (A->getOption().matches(options::OPT_mcrc))
825 Features.push_back("+crc");
826 else
827 Features.push_back("-crc");
828 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000829}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000830
831void Clang::AddARMTargetArgs(const ArgList &Args,
832 ArgStringList &CmdArgs,
833 bool KernelOrKext) const {
834 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000835 // Get the effective triple, which takes into account the deployment target.
836 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
837 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000838 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000839
840 // Select the ABI to use.
841 //
842 // FIXME: Support -meabi.
843 const char *ABIName = 0;
844 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000845 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000846 } else if (Triple.isOSDarwin()) {
847 // The backend is hardwired to assume AAPCS for M-class processors, ensure
848 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000849 if (Triple.getEnvironment() == llvm::Triple::EABI ||
850 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000851 ABIName = "aapcs";
852 } else {
853 ABIName = "apcs-gnu";
854 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000855 } else {
856 // Select the default based on the platform.
857 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000858 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000860 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000861 ABIName = "aapcs-linux";
862 break;
863 case llvm::Triple::EABI:
864 ABIName = "aapcs";
865 break;
866 default:
867 ABIName = "apcs-gnu";
868 }
869 }
870 CmdArgs.push_back("-target-abi");
871 CmdArgs.push_back(ABIName);
872
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000873 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000874 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000875 if (FloatABI == "soft") {
876 // Floating point operations and argument passing are soft.
877 //
878 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000879 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000880 CmdArgs.push_back("-mfloat-abi");
881 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000882 } else if (FloatABI == "softfp") {
883 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000884 CmdArgs.push_back("-mfloat-abi");
885 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000886 } else {
887 // Floating point operations and argument passing are hard.
888 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000889 CmdArgs.push_back("-mfloat-abi");
890 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000891 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000892
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000893 // Kernel code has more strict alignment requirements.
894 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000895 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000896 CmdArgs.push_back("-backend-option");
897 CmdArgs.push_back("-arm-long-calls");
898 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000899
Daniel Dunbar12100e22011-03-22 16:48:17 +0000900 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000901 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000902
903 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000904 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000905 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000906 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000907
908 // Setting -mno-global-merge disables the codegen global merge pass. Setting
909 // -mglobal-merge has no effect as the pass is enabled by default.
910 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
911 options::OPT_mno_global_merge)) {
912 if (A->getOption().matches(options::OPT_mno_global_merge))
913 CmdArgs.push_back("-mno-global-merge");
914 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000915
Bob Wilson9c8af452013-04-11 18:53:25 +0000916 if (!Args.hasFlag(options::OPT_mimplicit_float,
917 options::OPT_mno_implicit_float,
918 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000919 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000920
921 // llvm does not support reserving registers in general. There is support
922 // for reserving r9 on ARM though (defined as a platform-specific register
923 // in ARM EABI).
924 if (Args.hasArg(options::OPT_ffixed_r9)) {
925 CmdArgs.push_back("-backend-option");
926 CmdArgs.push_back("-arm-reserve-r9");
927 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000928}
929
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000930// Get CPU and ABI names. They are not independent
931// so we have to calculate them together.
932static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000933 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000934 StringRef &CPUName,
935 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000936 const char *DefMips32CPU = "mips32";
937 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000938
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000939 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000940 options::OPT_mcpu_EQ))
941 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000942
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000943 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000944 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000945 // Convert a GNU style Mips ABI name to the name
946 // accepted by LLVM Mips backend.
947 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
948 .Case("32", "o32")
949 .Case("64", "n64")
950 .Default(ABIName);
951 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000952
953 // Setup default CPU and ABI names.
954 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000955 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000956 default:
957 llvm_unreachable("Unexpected triple arch name");
958 case llvm::Triple::mips:
959 case llvm::Triple::mipsel:
960 CPUName = DefMips32CPU;
961 break;
962 case llvm::Triple::mips64:
963 case llvm::Triple::mips64el:
964 CPUName = DefMips64CPU;
965 break;
966 }
967 }
968
969 if (!ABIName.empty()) {
970 // Deduce CPU name from ABI name.
971 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000972 .Cases("32", "o32", "eabi", DefMips32CPU)
973 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000974 .Default("");
975 }
976 else if (!CPUName.empty()) {
977 // Deduce ABI name from CPU name.
978 ABIName = llvm::StringSwitch<const char *>(CPUName)
979 .Cases("mips32", "mips32r2", "o32")
980 .Cases("mips64", "mips64r2", "n64")
981 .Default("");
982 }
983
984 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000985}
986
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000987// Convert ABI name to the GNU tools acceptable variant.
988static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
989 return llvm::StringSwitch<llvm::StringRef>(ABI)
990 .Case("o32", "32")
991 .Case("n64", "64")
992 .Default(ABI);
993}
994
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000995// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
996// and -mfloat-abi=.
997static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000998 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000999 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001000 options::OPT_mhard_float,
1001 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001002 if (A->getOption().matches(options::OPT_msoft_float))
1003 FloatABI = "soft";
1004 else if (A->getOption().matches(options::OPT_mhard_float))
1005 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001006 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001007 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001008 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001009 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001010 FloatABI = "hard";
1011 }
1012 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001013 }
1014
1015 // If unspecified, choose the default based on the platform.
1016 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001017 // Assume "hard", because it's a default value used by gcc.
1018 // When we start to recognize specific target MIPS processors,
1019 // we will be able to select the default more correctly.
1020 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001021 }
1022
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001023 return FloatABI;
1024}
1025
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001026static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001027 std::vector<const char *> &Features,
1028 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001029 StringRef FeatureName) {
1030 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001031 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001032 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001033 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001034 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001035 }
1036}
1037
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001038static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1039 std::vector<const char *> &Features) {
1040 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001041 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001042 // FIXME: Note, this is a hack. We need to pass the selected float
1043 // mode to the MipsTargetInfoBase to define appropriate macros there.
1044 // Now it is the only method.
1045 Features.push_back("+soft-float");
1046 }
1047
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001048 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1049 if (StringRef(A->getValue()) == "2008")
1050 Features.push_back("+nan2008");
1051 }
1052
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001053 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1054 options::OPT_mdouble_float, "single-float");
1055 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1056 "mips16");
1057 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1058 options::OPT_mno_micromips, "micromips");
1059 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1060 "dsp");
1061 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1062 "dspr2");
1063 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1064 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001065 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1066 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001067}
1068
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001069void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001070 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001071 const Driver &D = getToolChain().getDriver();
1072 StringRef CPUName;
1073 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001074 const llvm::Triple &Triple = getToolChain().getTriple();
1075 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001076
1077 CmdArgs.push_back("-target-abi");
1078 CmdArgs.push_back(ABIName.data());
1079
1080 StringRef FloatABI = getMipsFloatABI(D, Args);
1081
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001082 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001083 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001084 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001085 CmdArgs.push_back("-mfloat-abi");
1086 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001087 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001088 else {
1089 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001090 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001091 CmdArgs.push_back("-mfloat-abi");
1092 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001093 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001094
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001095 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1096 if (A->getOption().matches(options::OPT_mxgot)) {
1097 CmdArgs.push_back("-mllvm");
1098 CmdArgs.push_back("-mxgot");
1099 }
1100 }
1101
Simon Atanasyanc580b322013-05-11 06:33:44 +00001102 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1103 options::OPT_mno_ldc1_sdc1)) {
1104 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1105 CmdArgs.push_back("-mllvm");
1106 CmdArgs.push_back("-mno-ldc1-sdc1");
1107 }
1108 }
1109
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001110 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1111 options::OPT_mno_check_zero_division)) {
1112 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1113 CmdArgs.push_back("-mllvm");
1114 CmdArgs.push_back("-mno-check-zero-division");
1115 }
1116 }
1117
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001118 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001119 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001120 CmdArgs.push_back("-mllvm");
1121 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1122 A->claim();
1123 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001124}
1125
Hal Finkel8eb59282012-06-11 22:35:19 +00001126/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1127static std::string getPPCTargetCPU(const ArgList &Args) {
1128 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001129 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001130
1131 if (CPUName == "native") {
1132 std::string CPU = llvm::sys::getHostCPUName();
1133 if (!CPU.empty() && CPU != "generic")
1134 return CPU;
1135 else
1136 return "";
1137 }
1138
1139 return llvm::StringSwitch<const char *>(CPUName)
1140 .Case("common", "generic")
1141 .Case("440", "440")
1142 .Case("440fp", "440")
1143 .Case("450", "450")
1144 .Case("601", "601")
1145 .Case("602", "602")
1146 .Case("603", "603")
1147 .Case("603e", "603e")
1148 .Case("603ev", "603ev")
1149 .Case("604", "604")
1150 .Case("604e", "604e")
1151 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001152 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001153 .Case("G3", "g3")
1154 .Case("7400", "7400")
1155 .Case("G4", "g4")
1156 .Case("7450", "7450")
1157 .Case("G4+", "g4+")
1158 .Case("750", "750")
1159 .Case("970", "970")
1160 .Case("G5", "g5")
1161 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001162 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001163 .Case("e500mc", "e500mc")
1164 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001165 .Case("power3", "pwr3")
1166 .Case("power4", "pwr4")
1167 .Case("power5", "pwr5")
1168 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001169 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001170 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001171 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001172 .Case("pwr3", "pwr3")
1173 .Case("pwr4", "pwr4")
1174 .Case("pwr5", "pwr5")
1175 .Case("pwr5x", "pwr5x")
1176 .Case("pwr6", "pwr6")
1177 .Case("pwr6x", "pwr6x")
1178 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001179 .Case("powerpc", "ppc")
1180 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001181 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001182 .Default("");
1183 }
1184
1185 return "";
1186}
1187
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001188static void getPPCTargetFeatures(const ArgList &Args,
1189 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001190 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1191 ie = Args.filtered_end();
1192 it != ie; ++it) {
1193 StringRef Name = (*it)->getOption().getName();
1194 (*it)->claim();
1195
1196 // Skip over "-m".
1197 assert(Name.startswith("m") && "Invalid feature name.");
1198 Name = Name.substr(1);
1199
1200 bool IsNegative = Name.startswith("no-");
1201 if (IsNegative)
1202 Name = Name.substr(3);
1203
1204 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1205 // pass the correct option to the backend while calling the frontend
1206 // option the same.
1207 // TODO: Change the LLVM backend option maybe?
1208 if (Name == "mfcrf")
1209 Name = "mfocrf";
1210
1211 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1212 }
1213
1214 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001215 AddTargetFeature(Args, Features, options::OPT_faltivec,
1216 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001217}
1218
Tom Stellard6674c702013-04-01 20:56:53 +00001219/// Get the (LLVM) name of the R600 gpu we are targeting.
1220static std::string getR600TargetGPU(const ArgList &Args) {
1221 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001222 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001223 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001224 .Cases("rv630", "rv635", "r600")
1225 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001226 .Case("rv740", "rv770")
1227 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001228 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001229 .Case("hemlock", "cypress")
1230 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001231 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001232 }
1233 return "";
1234}
1235
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001236static void getSparcTargetFeatures(const ArgList &Args,
1237 std::vector<const char *> Features) {
1238 bool SoftFloatABI = true;
1239 if (Arg *A =
1240 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1241 if (A->getOption().matches(options::OPT_mhard_float))
1242 SoftFloatABI = false;
1243 }
1244 if (SoftFloatABI)
1245 Features.push_back("+soft-float");
1246}
1247
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001248void Clang::AddSparcTargetArgs(const ArgList &Args,
1249 ArgStringList &CmdArgs) const {
1250 const Driver &D = getToolChain().getDriver();
1251
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001252 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001253 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001254 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1255 options::OPT_mhard_float)) {
1256 if (A->getOption().matches(options::OPT_msoft_float))
1257 FloatABI = "soft";
1258 else if (A->getOption().matches(options::OPT_mhard_float))
1259 FloatABI = "hard";
1260 }
1261
1262 // If unspecified, choose the default based on the platform.
1263 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001264 // Assume "soft", but warn the user we are guessing.
1265 FloatABI = "soft";
1266 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001267 }
1268
1269 if (FloatABI == "soft") {
1270 // Floating point operations and argument passing are soft.
1271 //
1272 // FIXME: This changes CPP defines, we need -target-soft-float.
1273 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001274 } else {
1275 assert(FloatABI == "hard" && "Invalid float abi!");
1276 CmdArgs.push_back("-mhard-float");
1277 }
1278}
1279
Richard Sandiford4652d892013-07-19 16:51:51 +00001280static const char *getSystemZTargetCPU(const ArgList &Args) {
1281 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1282 return A->getValue();
1283 return "z10";
1284}
1285
Chandler Carruth953fb082013-01-13 11:46:33 +00001286static const char *getX86TargetCPU(const ArgList &Args,
1287 const llvm::Triple &Triple) {
1288 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001289 if (StringRef(A->getValue()) != "native") {
1290 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1291 return "core-avx2";
1292
Chandler Carruth953fb082013-01-13 11:46:33 +00001293 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001294 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001295
1296 // FIXME: Reject attempts to use -march=native unless the target matches
1297 // the host.
1298 //
1299 // FIXME: We should also incorporate the detected target features for use
1300 // with -native.
1301 std::string CPU = llvm::sys::getHostCPUName();
1302 if (!CPU.empty() && CPU != "generic")
1303 return Args.MakeArgString(CPU);
1304 }
1305
1306 // Select the default CPU if none was given (or detection failed).
1307
1308 if (Triple.getArch() != llvm::Triple::x86_64 &&
1309 Triple.getArch() != llvm::Triple::x86)
1310 return 0; // This routine is only handling x86 targets.
1311
1312 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1313
1314 // FIXME: Need target hooks.
Jim Grosbach82eee262013-11-16 00:53:35 +00001315 if (Triple.isOSDarwin()) {
1316 if (Triple.getArchName() == "x86_64h")
1317 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001318 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001319 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001320
Chandler Carruth953fb082013-01-13 11:46:33 +00001321 // All x86 devices running Android have core2 as their common
1322 // denominator. This makes a better choice than pentium4.
1323 if (Triple.getEnvironment() == llvm::Triple::Android)
1324 return "core2";
1325
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001326 // Everything else goes to x86-64 in 64-bit mode.
1327 if (Is64Bit)
1328 return "x86-64";
1329
1330 switch (Triple.getOS()) {
1331 case llvm::Triple::FreeBSD:
1332 case llvm::Triple::NetBSD:
1333 case llvm::Triple::OpenBSD:
1334 return "i486";
1335 case llvm::Triple::Haiku:
1336 return "i586";
1337 case llvm::Triple::Bitrig:
1338 return "i686";
1339 default:
1340 // Fallback to p4.
1341 return "pentium4";
1342 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001343}
1344
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001345static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1346 switch(T.getArch()) {
1347 default:
1348 return "";
1349
Amara Emerson703da2e2013-10-31 09:32:33 +00001350 case llvm::Triple::aarch64:
1351 return getAArch64TargetCPU(Args, T);
1352
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001353 case llvm::Triple::arm:
1354 case llvm::Triple::thumb:
1355 return getARMTargetCPU(Args, T);
1356
1357 case llvm::Triple::mips:
1358 case llvm::Triple::mipsel:
1359 case llvm::Triple::mips64:
1360 case llvm::Triple::mips64el: {
1361 StringRef CPUName;
1362 StringRef ABIName;
1363 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1364 return CPUName;
1365 }
1366
1367 case llvm::Triple::ppc:
1368 case llvm::Triple::ppc64:
1369 case llvm::Triple::ppc64le: {
1370 std::string TargetCPUName = getPPCTargetCPU(Args);
1371 // LLVM may default to generating code for the native CPU,
1372 // but, like gcc, we default to a more generic option for
1373 // each architecture. (except on Darwin)
1374 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1375 if (T.getArch() == llvm::Triple::ppc64)
1376 TargetCPUName = "ppc64";
1377 else if (T.getArch() == llvm::Triple::ppc64le)
1378 TargetCPUName = "ppc64le";
1379 else
1380 TargetCPUName = "ppc";
1381 }
1382 return TargetCPUName;
1383 }
1384
1385 case llvm::Triple::sparc:
1386 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1387 return A->getValue();
1388 return "";
1389
1390 case llvm::Triple::x86:
1391 case llvm::Triple::x86_64:
1392 return getX86TargetCPU(Args, T);
1393
1394 case llvm::Triple::hexagon:
1395 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1396
1397 case llvm::Triple::systemz:
1398 return getSystemZTargetCPU(Args);
1399
1400 case llvm::Triple::r600:
1401 return getR600TargetGPU(Args);
1402 }
1403}
1404
Alp Tokerce365ca2013-12-02 12:43:03 +00001405static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1406 ArgStringList &CmdArgs) {
1407 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1408 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1409 // forward.
1410 CmdArgs.push_back("-plugin");
1411 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1412 CmdArgs.push_back(Args.MakeArgString(Plugin));
1413
1414 // Try to pass driver level flags relevant to LTO code generation down to
1415 // the plugin.
1416
1417 // Handle flags for selecting CPU variants.
1418 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1419 if (!CPU.empty())
1420 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1421}
1422
Jim Grosbach82eee262013-11-16 00:53:35 +00001423static void getX86TargetFeatures(const llvm::Triple &Triple,
1424 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001425 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001426 if (Triple.getArchName() == "x86_64h") {
1427 // x86_64h implies quite a few of the more modern subtarget features
1428 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1429 Features.push_back("-rdrnd");
1430 Features.push_back("-aes");
1431 Features.push_back("-pclmul");
1432 Features.push_back("-rtm");
1433 Features.push_back("-hle");
1434 Features.push_back("-fsgsbase");
1435 }
1436
1437 // Now add any that the user explicitly requested on the command line,
1438 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001439 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1440 ie = Args.filtered_end();
1441 it != ie; ++it) {
1442 StringRef Name = (*it)->getOption().getName();
1443 (*it)->claim();
1444
1445 // Skip over "-m".
1446 assert(Name.startswith("m") && "Invalid feature name.");
1447 Name = Name.substr(1);
1448
1449 bool IsNegative = Name.startswith("no-");
1450 if (IsNegative)
1451 Name = Name.substr(3);
1452
1453 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1454 }
1455}
1456
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001457void Clang::AddX86TargetArgs(const ArgList &Args,
1458 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001459 if (!Args.hasFlag(options::OPT_mred_zone,
1460 options::OPT_mno_red_zone,
1461 true) ||
1462 Args.hasArg(options::OPT_mkernel) ||
1463 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001464 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001465
Bob Wilson2616e2e2013-02-10 16:01:41 +00001466 // Default to avoid implicit floating-point for kernel/kext code, but allow
1467 // that to be overridden with -mno-soft-float.
1468 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1469 Args.hasArg(options::OPT_fapple_kext));
1470 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1471 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001472 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001473 options::OPT_mno_implicit_float)) {
1474 const Option &O = A->getOption();
1475 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1476 O.matches(options::OPT_msoft_float));
1477 }
1478 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001479 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001480}
1481
Matthew Curtise8f80a12012-12-06 17:49:03 +00001482static inline bool HasPICArg(const ArgList &Args) {
1483 return Args.hasArg(options::OPT_fPIC)
1484 || Args.hasArg(options::OPT_fpic);
1485}
1486
1487static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1488 return Args.getLastArg(options::OPT_G,
1489 options::OPT_G_EQ,
1490 options::OPT_msmall_data_threshold_EQ);
1491}
1492
1493static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1494 std::string value;
1495 if (HasPICArg(Args))
1496 value = "0";
1497 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1498 value = A->getValue();
1499 A->claim();
1500 }
1501 return value;
1502}
1503
Tony Linthicum76329bf2011-12-12 21:14:55 +00001504void Clang::AddHexagonTargetArgs(const ArgList &Args,
1505 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001506 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001507 CmdArgs.push_back("-mqdsp6-compat");
1508 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001509
Matthew Curtise8f80a12012-12-06 17:49:03 +00001510 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1511 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001512 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001513 CmdArgs.push_back(Args.MakeArgString(
1514 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001515 }
1516
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001517 if (!Args.hasArg(options::OPT_fno_short_enums))
1518 CmdArgs.push_back("-fshort-enums");
1519 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1520 CmdArgs.push_back ("-mllvm");
1521 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1522 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001523 CmdArgs.push_back ("-mllvm");
1524 CmdArgs.push_back ("-machine-sink-split=0");
1525}
1526
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001527static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1528 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001529 // Honor -mfpu=.
1530 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001531 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001532}
1533
1534static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001535 const ArgList &Args, ArgStringList &CmdArgs,
1536 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001537 std::vector<const char *> Features;
1538 switch (Triple.getArch()) {
1539 default:
1540 break;
1541 case llvm::Triple::mips:
1542 case llvm::Triple::mipsel:
1543 case llvm::Triple::mips64:
1544 case llvm::Triple::mips64el:
1545 getMIPSTargetFeatures(D, Args, Features);
1546 break;
1547
1548 case llvm::Triple::arm:
1549 case llvm::Triple::thumb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001550 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001551 break;
1552
1553 case llvm::Triple::ppc:
1554 case llvm::Triple::ppc64:
1555 case llvm::Triple::ppc64le:
1556 getPPCTargetFeatures(Args, Features);
1557 break;
1558 case llvm::Triple::sparc:
1559 getSparcTargetFeatures(Args, Features);
1560 break;
1561 case llvm::Triple::aarch64:
1562 getAArch64TargetFeatures(D, Args, Features);
1563 break;
1564 case llvm::Triple::x86:
1565 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001566 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001567 break;
1568 }
Rafael Espindola43964802013-08-21 17:34:32 +00001569
1570 // Find the last of each feature.
1571 llvm::StringMap<unsigned> LastOpt;
1572 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1573 const char *Name = Features[I];
1574 assert(Name[0] == '-' || Name[0] == '+');
1575 LastOpt[Name + 1] = I;
1576 }
1577
1578 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1579 // If this feature was overridden, ignore it.
1580 const char *Name = Features[I];
1581 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1582 assert(LastI != LastOpt.end());
1583 unsigned Last = LastI->second;
1584 if (Last != I)
1585 continue;
1586
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001587 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001588 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001589 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001590}
1591
Eric Christopher84fbdb42011-08-19 00:30:14 +00001592static bool
John McCall5fb5df92012-06-20 06:18:46 +00001593shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001594 const llvm::Triple &Triple) {
1595 // We use the zero-cost exception tables for Objective-C if the non-fragile
1596 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1597 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001598 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001599 return true;
1600
Bob Wilson83e723a2013-12-05 19:38:42 +00001601 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001602 return false;
1603
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001604 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001605 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001606 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001607}
1608
Anders Carlssone96ab552011-02-28 02:27:16 +00001609/// addExceptionArgs - Adds exception related arguments to the driver command
1610/// arguments. There's a master flag, -fexceptions and also language specific
1611/// flags to enable/disable C++ and Objective-C exceptions.
1612/// This makes it possible to for example disable C++ exceptions but enable
1613/// Objective-C exceptions.
1614static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1615 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001616 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001617 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001618 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001619 if (KernelOrKext) {
1620 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1621 // arguments now to avoid warnings about unused arguments.
1622 Args.ClaimAllArgs(options::OPT_fexceptions);
1623 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1624 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1625 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1626 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1627 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001628 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001629 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001630
1631 // Exceptions are enabled by default.
1632 bool ExceptionsEnabled = true;
1633
1634 // This keeps track of whether exceptions were explicitly turned on or off.
1635 bool DidHaveExplicitExceptionFlag = false;
1636
Rafael Espindola00a66572009-10-01 13:33:33 +00001637 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1638 options::OPT_fno_exceptions)) {
1639 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001640 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001641 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001642 ExceptionsEnabled = false;
1643
1644 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001645 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001646
Anders Carlssone96ab552011-02-28 02:27:16 +00001647 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001648
Anders Carlssone96ab552011-02-28 02:27:16 +00001649 // Exception tables and cleanups can be enabled with -fexceptions even if the
1650 // language itself doesn't support exceptions.
1651 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1652 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001653
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001654 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1655 // is not necessarily sensible, but follows GCC.
1656 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001657 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001658 options::OPT_fno_objc_exceptions,
1659 true)) {
1660 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001661
Eric Christopher84fbdb42011-08-19 00:30:14 +00001662 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001663 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001664 }
1665
1666 if (types::isCXX(InputType)) {
1667 bool CXXExceptionsEnabled = ExceptionsEnabled;
1668
Eric Christopher84fbdb42011-08-19 00:30:14 +00001669 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1670 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001671 options::OPT_fexceptions,
1672 options::OPT_fno_exceptions)) {
1673 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1674 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001675 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001676 CXXExceptionsEnabled = false;
1677 }
1678
1679 if (CXXExceptionsEnabled) {
1680 CmdArgs.push_back("-fcxx-exceptions");
1681
1682 ShouldUseExceptionTables = true;
1683 }
1684 }
1685
1686 if (ShouldUseExceptionTables)
1687 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001688}
1689
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001690static bool ShouldDisableAutolink(const ArgList &Args,
1691 const ToolChain &TC) {
1692 bool Default = true;
1693 if (TC.getTriple().isOSDarwin()) {
1694 // The native darwin assembler doesn't support the linker_option directives,
1695 // so we disable them if we think the .s file will be passed to it.
1696 Default = TC.useIntegratedAs();
1697 }
1698 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1699 Default);
1700}
1701
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001702static bool ShouldDisableCFI(const ArgList &Args,
1703 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001704 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001705 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001706 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001707 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001708 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001709 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001710 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001711 options::OPT_fno_dwarf2_cfi_asm,
1712 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001713}
1714
Ted Kremenek62093662013-03-12 17:02:12 +00001715static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1716 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001717 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1718 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001719 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001720 return !UseDwarfDirectory;
1721}
1722
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001723/// \brief Check whether the given input tree contains any compilation actions.
1724static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001725 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001726 return true;
1727
1728 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1729 if (ContainsCompileAction(*it))
1730 return true;
1731
1732 return false;
1733}
1734
1735/// \brief Check if -relax-all should be passed to the internal assembler.
1736/// This is done by default when compiling non-assembler source with -O0.
1737static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1738 bool RelaxDefault = true;
1739
1740 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1741 RelaxDefault = A->getOption().matches(options::OPT_O0);
1742
1743 if (RelaxDefault) {
1744 RelaxDefault = false;
1745 for (ActionList::const_iterator it = C.getActions().begin(),
1746 ie = C.getActions().end(); it != ie; ++it) {
1747 if (ContainsCompileAction(*it)) {
1748 RelaxDefault = true;
1749 break;
1750 }
1751 }
1752 }
1753
1754 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1755 RelaxDefault);
1756}
1757
David Blaikie9260ed62013-07-25 21:19:01 +00001758static void CollectArgsForIntegratedAssembler(Compilation &C,
1759 const ArgList &Args,
1760 ArgStringList &CmdArgs,
1761 const Driver &D) {
1762 if (UseRelaxAll(C, Args))
1763 CmdArgs.push_back("-mrelax-all");
1764
David Peixottodfb66142013-11-14 22:52:58 +00001765 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001766 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001767 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1768 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1769 // arg after parsing the '-I' arg.
1770 bool TakeNextArg = false;
1771
David Blaikie9260ed62013-07-25 21:19:01 +00001772 // When using an integrated assembler, translate -Wa, and -Xassembler
1773 // options.
1774 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1775 options::OPT_Xassembler),
1776 ie = Args.filtered_end(); it != ie; ++it) {
1777 const Arg *A = *it;
1778 A->claim();
1779
1780 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1781 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001782 if (TakeNextArg) {
1783 CmdArgs.push_back(Value.data());
1784 TakeNextArg = false;
1785 continue;
1786 }
David Blaikie9260ed62013-07-25 21:19:01 +00001787
1788 if (Value == "-force_cpusubtype_ALL") {
1789 // Do nothing, this is the default and we don't support anything else.
1790 } else if (Value == "-L") {
1791 CmdArgs.push_back("-msave-temp-labels");
1792 } else if (Value == "--fatal-warnings") {
1793 CmdArgs.push_back("-mllvm");
1794 CmdArgs.push_back("-fatal-assembler-warnings");
1795 } else if (Value == "--noexecstack") {
1796 CmdArgs.push_back("-mnoexecstack");
David Peixottodfb66142013-11-14 22:52:58 +00001797 } else if (Value.startswith("-I")) {
1798 CmdArgs.push_back(Value.data());
1799 // We need to consume the next argument if the current arg is a plain
1800 // -I. The next arg will be the include directory.
1801 if (Value == "-I")
1802 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001803 } else {
1804 D.Diag(diag::err_drv_unsupported_option_argument)
1805 << A->getOption().getName() << Value;
1806 }
1807 }
1808 }
1809}
1810
Chandler Carruth36381702013-06-23 11:28:48 +00001811static void addProfileRTLinux(
1812 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1813 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1814 Args.hasArg(options::OPT_fprofile_generate) ||
1815 Args.hasArg(options::OPT_fcreate_profile) ||
1816 Args.hasArg(options::OPT_coverage)))
1817 return;
1818
1819 // The profile runtime is located in the Linux library directory and has name
1820 // "libclang_rt.profile-<ArchName>.a".
1821 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1822 llvm::sys::path::append(
1823 LibProfile, "lib", "linux",
1824 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1825
1826 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1827}
1828
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001829static void addSanitizerRTLinkFlagsLinux(
1830 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001831 const StringRef Sanitizer, bool BeforeLibStdCXX,
1832 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001833 // Sanitizer runtime is located in the Linux library directory and
1834 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1835 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1836 llvm::sys::path::append(
1837 LibSanitizer, "lib", "linux",
1838 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001839
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001840 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1841 // etc.) so that the linker picks custom versions of the global 'operator
1842 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001843 // strategy of inserting it at the front of the link command. It also
1844 // needs to be forced to end up in the executable, so wrap it in
1845 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001846 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001847 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001848 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001849 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001850
1851 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1852 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1853
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001854 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001855 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001856 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001857 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001858
1859 // If possible, use a dynamic symbols file to export the symbols from the
1860 // runtime library. If we can't do so, use -export-dynamic instead to export
1861 // all symbols from the binary.
1862 if (ExportSymbols) {
1863 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1864 CmdArgs.push_back(
1865 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1866 else
1867 CmdArgs.push_back("-export-dynamic");
1868 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001869}
1870
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001871/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1872/// This needs to be called before we add the C run-time (malloc, etc).
1873static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001874 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001875 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001876 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1877 llvm::sys::path::append(LibAsan, "lib", "linux",
1878 (Twine("libclang_rt.asan-") +
1879 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001880 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001881 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001882 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001883 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001884 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001885}
1886
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001887/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1888/// This needs to be called before we add the C run-time (malloc, etc).
1889static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1890 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001891 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001892 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001893}
1894
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001895/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1896/// This needs to be called before we add the C run-time (malloc, etc).
1897static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1898 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001899 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001900 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001901}
1902
1903/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1904/// This needs to be called before we add the C run-time (malloc, etc).
1905static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1906 ArgStringList &CmdArgs) {
1907 if (!Args.hasArg(options::OPT_shared))
1908 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001909}
1910
Richard Smithe30752c2012-10-09 19:52:38 +00001911/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1912/// (Linux).
1913static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001914 ArgStringList &CmdArgs, bool IsCXX,
1915 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001916 // Need a copy of sanitizer_common. This could come from another sanitizer
1917 // runtime; if we're not including one, include our own copy.
1918 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001919 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1920
1921 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1922
1923 // Only include the bits of the runtime which need a C++ ABI library if
1924 // we're linking in C++ mode.
1925 if (IsCXX)
1926 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001927}
1928
Peter Collingbournec3772752013-08-07 22:47:34 +00001929static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1930 ArgStringList &CmdArgs) {
1931 if (!Args.hasArg(options::OPT_shared))
1932 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1933}
1934
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001935static bool shouldUseFramePointerForTarget(const ArgList &Args,
1936 const llvm::Triple &Triple) {
1937 switch (Triple.getArch()) {
1938 // Don't use a frame pointer on linux if optimizing for certain targets.
1939 case llvm::Triple::mips64:
1940 case llvm::Triple::mips64el:
1941 case llvm::Triple::mips:
1942 case llvm::Triple::mipsel:
1943 case llvm::Triple::systemz:
1944 case llvm::Triple::x86:
1945 case llvm::Triple::x86_64:
1946 if (Triple.isOSLinux())
1947 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1948 if (!A->getOption().matches(options::OPT_O0))
1949 return false;
1950 return true;
1951 case llvm::Triple::xcore:
1952 return false;
1953 default:
1954 return true;
1955 }
1956}
1957
Rafael Espindola224dd632011-12-14 21:02:23 +00001958static bool shouldUseFramePointer(const ArgList &Args,
1959 const llvm::Triple &Triple) {
1960 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1961 options::OPT_fomit_frame_pointer))
1962 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1963
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001964 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001965}
1966
Eric Christopherb7d97e92013-04-03 01:58:53 +00001967static bool shouldUseLeafFramePointer(const ArgList &Args,
1968 const llvm::Triple &Triple) {
1969 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1970 options::OPT_momit_leaf_frame_pointer))
1971 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1972
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001973 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001974}
1975
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001976/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001977static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001978 SmallString<128> cwd;
1979 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001980 CmdArgs.push_back("-fdebug-compilation-dir");
1981 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001982 }
1983}
1984
Eric Christopherd3804002013-02-22 20:12:52 +00001985static const char *SplitDebugName(const ArgList &Args,
1986 const InputInfoList &Inputs) {
1987 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1988 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1989 SmallString<128> T(FinalOutput->getValue());
1990 llvm::sys::path::replace_extension(T, "dwo");
1991 return Args.MakeArgString(T);
1992 } else {
1993 // Use the compilation dir.
1994 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1995 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1996 llvm::sys::path::replace_extension(F, "dwo");
1997 T += F;
1998 return Args.MakeArgString(F);
1999 }
2000}
2001
2002static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2003 const Tool &T, const JobAction &JA,
2004 const ArgList &Args, const InputInfo &Output,
2005 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002006 ArgStringList ExtractArgs;
2007 ExtractArgs.push_back("--extract-dwo");
2008
2009 ArgStringList StripArgs;
2010 StripArgs.push_back("--strip-dwo");
2011
2012 // Grabbing the output of the earlier compile step.
2013 StripArgs.push_back(Output.getFilename());
2014 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002015 ExtractArgs.push_back(OutFile);
2016
2017 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002018 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002019
2020 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002021 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002022
2023 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002024 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002025}
2026
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002027static bool isOptimizationLevelFast(const ArgList &Args) {
2028 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2029 if (A->getOption().matches(options::OPT_Ofast))
2030 return true;
2031 return false;
2032}
2033
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002034/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2035static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2036 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002037 if (A->getOption().matches(options::OPT_O4) ||
2038 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002039 return true;
2040
2041 if (A->getOption().matches(options::OPT_O0))
2042 return false;
2043
2044 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2045
Rafael Espindola91780de2013-08-26 14:05:41 +00002046 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002047 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002048 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002049 return true;
2050
2051 // Don't vectorize -Oz.
2052 if (S == "z")
2053 return false;
2054
2055 unsigned OptLevel = 0;
2056 if (S.getAsInteger(10, OptLevel))
2057 return false;
2058
2059 return OptLevel > 1;
2060 }
2061
2062 return false;
2063}
2064
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002065void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002066 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002067 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002068 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002069 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002070 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2071 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002072 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002073 ArgStringList CmdArgs;
2074
Daniel Dunbare521a892009-03-31 20:53:55 +00002075 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2076
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002077 // Invoke ourselves in -cc1 mode.
2078 //
2079 // FIXME: Implement custom jobs for internal actions.
2080 CmdArgs.push_back("-cc1");
2081
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002082 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002083 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002084 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002085 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002086
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002087 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002088 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002089
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002090 if (isa<AnalyzeJobAction>(JA)) {
2091 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2092 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002093 } else if (isa<MigrateJobAction>(JA)) {
2094 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002095 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002096 if (Output.getType() == types::TY_Dependencies)
2097 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002098 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002099 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002100 if (Args.hasArg(options::OPT_rewrite_objc) &&
2101 !Args.hasArg(options::OPT_g_Group))
2102 CmdArgs.push_back("-P");
2103 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002104 } else if (isa<AssembleJobAction>(JA)) {
2105 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002106
David Blaikie9260ed62013-07-25 21:19:01 +00002107 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002108
2109 // Also ignore explicit -force_cpusubtype_ALL option.
2110 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002111 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002112 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002113 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002114
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002115 if (JA.getType() == types::TY_Nothing)
2116 CmdArgs.push_back("-fsyntax-only");
2117 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002118 CmdArgs.push_back("-emit-pch");
2119 else
2120 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002121 } else {
2122 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002123
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002124 if (JA.getType() == types::TY_Nothing) {
2125 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002126 } else if (JA.getType() == types::TY_LLVM_IR ||
2127 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002128 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002129 } else if (JA.getType() == types::TY_LLVM_BC ||
2130 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002131 CmdArgs.push_back("-emit-llvm-bc");
2132 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002133 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002134 } else if (JA.getType() == types::TY_AST) {
2135 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002136 } else if (JA.getType() == types::TY_ModuleFile) {
2137 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002138 } else if (JA.getType() == types::TY_RewrittenObjC) {
2139 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002140 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002141 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2142 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002143 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002144 } else {
2145 assert(JA.getType() == types::TY_PP_Asm &&
2146 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002147 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002148 }
2149
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002150 // The make clang go fast button.
2151 CmdArgs.push_back("-disable-free");
2152
John McCallbb79b5f2010-02-13 03:50:24 +00002153 // Disable the verification pass in -asserts builds.
2154#ifdef NDEBUG
2155 CmdArgs.push_back("-disable-llvm-verifier");
2156#endif
2157
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002158 // Set the main file name, so that debug info works even with
2159 // -save-temps.
2160 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002161 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002162
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002163 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002164 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002165 if (Args.hasArg(options::OPT_static))
2166 CmdArgs.push_back("-static-define");
2167
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002168 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002169 // Enable region store model by default.
2170 CmdArgs.push_back("-analyzer-store=region");
2171
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002172 // Treat blocks as analysis entry points.
2173 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2174
Ted Kremenek49c79792011-03-24 00:28:47 +00002175 CmdArgs.push_back("-analyzer-eagerly-assume");
2176
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002177 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002178 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002179 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002180
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002181 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2182 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002183
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002184 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002185 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002186
2187 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002188
Jordan Rose10ad0812013-04-05 17:55:07 +00002189 if (types::isCXX(Inputs[0].getType()))
2190 CmdArgs.push_back("-analyzer-checker=cplusplus");
2191
Ted Kremenek37e96522012-01-26 02:27:38 +00002192 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002193 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2194 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2195 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2196 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2197 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2198 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002199 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002200
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002201 // Set the output format. The default is plist, for (lame) historical
2202 // reasons.
2203 CmdArgs.push_back("-analyzer-output");
2204 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002205 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002206 else
2207 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002208
Ted Kremenekfe449a22010-03-22 22:32:05 +00002209 // Disable the presentation of standard compiler warnings when
2210 // using --analyze. We only want to show static analyzer diagnostics
2211 // or frontend errors.
2212 CmdArgs.push_back("-w");
2213
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002214 // Add -Xanalyzer arguments when running as analyzer.
2215 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002216 }
2217
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002218 CheckCodeGenerationOptions(D, Args);
2219
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002220 bool PIE = getToolChain().isPIEDefault();
2221 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002222 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002223
Alexey Samsonov090301e2013-04-09 12:28:19 +00002224 // For the PIC and PIE flag options, this logic is different from the
2225 // legacy logic in very old versions of GCC, as that logic was just
2226 // a bug no one had ever fixed. This logic is both more rational and
2227 // consistent with GCC's new logic now that the bugs are fixed. The last
2228 // argument relating to either PIC or PIE wins, and no other argument is
2229 // used. If the last argument is any flavor of the '-fno-...' arguments,
2230 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2231 // at the same level.
2232 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2233 options::OPT_fpic, options::OPT_fno_pic,
2234 options::OPT_fPIE, options::OPT_fno_PIE,
2235 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002236 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2237 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002238 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002239 if (LastPICArg) {
2240 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002241 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2242 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2243 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2244 PIC = PIE || O.matches(options::OPT_fPIC) ||
2245 O.matches(options::OPT_fpic);
2246 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2247 O.matches(options::OPT_fPIC);
2248 } else {
2249 PIE = PIC = false;
2250 }
2251 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002252 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002253
Nick Lewycky609dd662013-10-11 03:33:53 +00002254 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002255 // specified while enabling PIC enabled level 1 PIC, just force it back to
2256 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2257 // informal testing).
2258 if (PIC && getToolChain().getTriple().isOSDarwin())
2259 IsPICLevelTwo |= getToolChain().isPICDefault();
2260
Chandler Carruthc0c04552012-04-08 16:40:35 +00002261 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2262 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002263 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002264 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002265 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002266 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002267 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002268 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002269
Chandler Carruth76a943b2012-11-19 03:52:03 +00002270 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2271 // This is a very special mode. It trumps the other modes, almost no one
2272 // uses it, and it isn't even valid on any OS but Darwin.
2273 if (!getToolChain().getTriple().isOSDarwin())
2274 D.Diag(diag::err_drv_unsupported_opt_for_target)
2275 << A->getSpelling() << getToolChain().getTriple().str();
2276
2277 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2278
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002279 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002280 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002281
Chandler Carruth76a943b2012-11-19 03:52:03 +00002282 // Only a forced PIC mode can cause the actual compile to have PIC defines
2283 // etc., no flags are sufficient. This behavior was selected to closely
2284 // match that of llvm-gcc and Apple GCC before that.
2285 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2286 CmdArgs.push_back("-pic-level");
2287 CmdArgs.push_back("2");
2288 }
2289 } else {
2290 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2291 // handled in Clang's IRGen by the -pie-level flag.
2292 CmdArgs.push_back("-mrelocation-model");
2293 CmdArgs.push_back(PIC ? "pic" : "static");
2294
2295 if (PIC) {
2296 CmdArgs.push_back("-pic-level");
2297 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2298 if (PIE) {
2299 CmdArgs.push_back("-pie-level");
2300 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2301 }
2302 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002303 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002304
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002305 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2306 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002307 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002308
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002309 // LLVM Code Generator Options.
2310
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002311 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2312 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002313 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002314 }
2315
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002316 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2317 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002318 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002319 D.Diag(diag::err_drv_unsupported_opt_for_target)
2320 << A->getSpelling() << getToolChain().getTriple().str();
2321 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2322 CmdArgs.push_back("-fpcc-struct-return");
2323 } else {
2324 assert(A->getOption().matches(options::OPT_freg_struct_return));
2325 CmdArgs.push_back("-freg-struct-return");
2326 }
2327 }
2328
Roman Divacky65b88cd2011-03-01 17:40:53 +00002329 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2330 CmdArgs.push_back("-mrtd");
2331
Rafael Espindola224dd632011-12-14 21:02:23 +00002332 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002333 CmdArgs.push_back("-mdisable-fp-elim");
2334 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2335 options::OPT_fno_zero_initialized_in_bss))
2336 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002337
2338 bool OFastEnabled = isOptimizationLevelFast(Args);
2339 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2340 // enabled. This alias option is being used to simplify the hasFlag logic.
2341 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2342 options::OPT_fstrict_aliasing;
2343 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002344 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002345 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002346 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2347 options::OPT_fno_struct_path_tbaa))
2348 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002349 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2350 false))
2351 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002352 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2353 options::OPT_fno_optimize_sibling_calls))
2354 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002355
Eric Christopher006208c2013-04-04 06:29:47 +00002356 // Handle segmented stacks.
2357 if (Args.hasArg(options::OPT_fsplit_stack))
2358 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002359
2360 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2361 // This alias option is being used to simplify the getLastArg logic.
2362 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2363 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002364
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002365 // Handle various floating point optimization flags, mapping them to the
2366 // appropriate LLVM code generation flags. The pattern for all of these is to
2367 // default off the codegen optimizations, and if any flag enables them and no
2368 // flag disables them after the flag enabling them, enable the codegen
2369 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002370 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002371 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002372 options::OPT_ffinite_math_only,
2373 options::OPT_fno_finite_math_only,
2374 options::OPT_fhonor_infinities,
2375 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002376 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2377 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002378 A->getOption().getID() != options::OPT_fhonor_infinities)
2379 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002380 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002381 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002382 options::OPT_ffinite_math_only,
2383 options::OPT_fno_finite_math_only,
2384 options::OPT_fhonor_nans,
2385 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002386 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2387 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002388 A->getOption().getID() != options::OPT_fhonor_nans)
2389 CmdArgs.push_back("-menable-no-nans");
2390
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002391 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2392 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002393 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002394 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002395 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002396 options::OPT_fno_math_errno)) {
2397 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2398 // However, turning *off* -ffast_math merely restores the toolchain default
2399 // (which may be false).
2400 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2401 A->getOption().getID() == options::OPT_ffast_math ||
2402 A->getOption().getID() == options::OPT_Ofast)
2403 MathErrno = false;
2404 else if (A->getOption().getID() == options::OPT_fmath_errno)
2405 MathErrno = true;
2406 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002407 if (MathErrno)
2408 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002409
2410 // There are several flags which require disabling very specific
2411 // optimizations. Any of these being disabled forces us to turn off the
2412 // entire set of LLVM optimizations, so collect them through all the flag
2413 // madness.
2414 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002415 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002416 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002417 options::OPT_funsafe_math_optimizations,
2418 options::OPT_fno_unsafe_math_optimizations,
2419 options::OPT_fassociative_math,
2420 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002421 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2422 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002423 A->getOption().getID() != options::OPT_fno_associative_math)
2424 AssociativeMath = true;
2425 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002426 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002427 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002428 options::OPT_funsafe_math_optimizations,
2429 options::OPT_fno_unsafe_math_optimizations,
2430 options::OPT_freciprocal_math,
2431 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002432 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2433 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002434 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2435 ReciprocalMath = true;
2436 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002437 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002438 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002439 options::OPT_funsafe_math_optimizations,
2440 options::OPT_fno_unsafe_math_optimizations,
2441 options::OPT_fsigned_zeros,
2442 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002443 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2444 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002445 A->getOption().getID() != options::OPT_fsigned_zeros)
2446 SignedZeros = false;
2447 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002448 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002449 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002450 options::OPT_funsafe_math_optimizations,
2451 options::OPT_fno_unsafe_math_optimizations,
2452 options::OPT_ftrapping_math,
2453 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002454 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2455 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002456 A->getOption().getID() != options::OPT_ftrapping_math)
2457 TrappingMath = false;
2458 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2459 !TrappingMath)
2460 CmdArgs.push_back("-menable-unsafe-fp-math");
2461
Lang Hamesaa53b932012-07-06 00:59:19 +00002462
2463 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002464 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002465 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002466 options::OPT_ffp_contract)) {
2467 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002468 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002469 if (Val == "fast" || Val == "on" || Val == "off") {
2470 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2471 } else {
2472 D.Diag(diag::err_drv_unsupported_option_argument)
2473 << A->getOption().getName() << Val;
2474 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002475 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2476 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002477 // If fast-math is set then set the fp-contract mode to fast.
2478 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2479 }
2480 }
2481
Bob Wilson6a039162012-07-19 03:52:53 +00002482 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2483 // and if we find them, tell the frontend to provide the appropriate
2484 // preprocessor macros. This is distinct from enabling any optimizations as
2485 // these options induce language changes which must survive serialization
2486 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002487 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2488 options::OPT_fno_fast_math))
2489 if (!A->getOption().matches(options::OPT_fno_fast_math))
2490 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002491 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2492 if (A->getOption().matches(options::OPT_ffinite_math_only))
2493 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002494
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002495 // Decide whether to use verbose asm. Verbose assembly is the default on
2496 // toolchains which have the integrated assembler on by default.
2497 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2498 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002499 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002500 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002501 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002502
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002503 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2504 CmdArgs.push_back("-mdebug-pass");
2505 CmdArgs.push_back("Structure");
2506 }
2507 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2508 CmdArgs.push_back("-mdebug-pass");
2509 CmdArgs.push_back("Arguments");
2510 }
2511
John McCall8517abc2010-02-19 02:45:38 +00002512 // Enable -mconstructor-aliases except on darwin, where we have to
2513 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002514 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002515 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002516
John McCall7ef5cb32011-03-18 02:56:14 +00002517 // Darwin's kernel doesn't support guard variables; just die if we
2518 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002519 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002520 CmdArgs.push_back("-fforbid-guard-variables");
2521
Douglas Gregordbe39272011-02-01 15:15:22 +00002522 if (Args.hasArg(options::OPT_mms_bitfields)) {
2523 CmdArgs.push_back("-mms-bitfields");
2524 }
John McCall8517abc2010-02-19 02:45:38 +00002525
Daniel Dunbar306945d2009-09-16 06:17:29 +00002526 // This is a coarse approximation of what llvm-gcc actually does, both
2527 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2528 // complicated ways.
2529 bool AsynchronousUnwindTables =
2530 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2531 options::OPT_fno_asynchronous_unwind_tables,
2532 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002533 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002534 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2535 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002536 CmdArgs.push_back("-munwind-tables");
2537
Chandler Carruth05fb5852012-11-21 23:40:23 +00002538 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002539
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002540 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2541 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002542 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002543 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002544
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002545 // FIXME: Handle -mtune=.
2546 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002547
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002548 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002549 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002550 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002551 }
2552
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002553 // Add the target cpu
2554 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2555 llvm::Triple ETriple(ETripleStr);
2556 std::string CPU = getCPUName(Args, ETriple);
2557 if (!CPU.empty()) {
2558 CmdArgs.push_back("-target-cpu");
2559 CmdArgs.push_back(Args.MakeArgString(CPU));
2560 }
2561
Rafael Espindolaeb265472013-08-21 21:59:03 +00002562 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2563 CmdArgs.push_back("-mfpmath");
2564 CmdArgs.push_back(A->getValue());
2565 }
2566
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002567 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002568 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002569
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002570 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002571 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002572 default:
2573 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002574
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002575 case llvm::Triple::arm:
2576 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002577 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002578 break;
2579
Eric Christopher0b26a612010-03-02 02:41:08 +00002580 case llvm::Triple::mips:
2581 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002582 case llvm::Triple::mips64:
2583 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002584 AddMIPSTargetArgs(Args, CmdArgs);
2585 break;
2586
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002587 case llvm::Triple::sparc:
2588 AddSparcTargetArgs(Args, CmdArgs);
2589 break;
2590
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002591 case llvm::Triple::x86:
2592 case llvm::Triple::x86_64:
2593 AddX86TargetArgs(Args, CmdArgs);
2594 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002595
2596 case llvm::Triple::hexagon:
2597 AddHexagonTargetArgs(Args, CmdArgs);
2598 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002599 }
2600
Hans Wennborg75958c42013-08-08 00:17:41 +00002601 // Add clang-cl arguments.
2602 if (getToolChain().getDriver().IsCLMode())
2603 AddClangCLArgs(Args, CmdArgs);
2604
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002605 // Pass the linker version in use.
2606 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2607 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002608 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002609 }
2610
Eric Christopherb7d97e92013-04-03 01:58:53 +00002611 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002612 CmdArgs.push_back("-momit-leaf-frame-pointer");
2613
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002614 // Explicitly error on some things we know we don't support and can't just
2615 // ignore.
2616 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002617 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2618 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002619 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002620 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002621 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002622 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2623 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002624 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002625 << Unsupported->getOption().getName();
2626 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002627 }
2628
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002629 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002630 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002631 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002632 CmdArgs.push_back("-header-include-file");
2633 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2634 D.CCPrintHeadersFilename : "-");
2635 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002636 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002637 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002638
Chad Rosierbe10f982011-08-02 17:58:04 +00002639 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002640 CmdArgs.push_back("-diagnostic-log-file");
2641 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2642 D.CCLogDiagnosticsFilename : "-");
2643 }
2644
Manman Ren17bdb0f2013-11-20 20:22:14 +00002645 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2646 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002647 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002648 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002649 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2650 // FIXME: we should support specifying dwarf version with
2651 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002652 CmdArgs.push_back("-gline-tables-only");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002653 // Default is dwarf-2 for darwin.
2654 if (getToolChain().getTriple().isOSDarwin())
2655 CmdArgs.push_back("-gdwarf-2");
2656 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002657 CmdArgs.push_back("-gdwarf-2");
2658 else if (A->getOption().matches(options::OPT_gdwarf_3))
2659 CmdArgs.push_back("-gdwarf-3");
2660 else if (A->getOption().matches(options::OPT_gdwarf_4))
2661 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002662 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002663 !A->getOption().matches(options::OPT_ggdb0)) {
2664 // Default is dwarf-2 for darwin.
2665 if (getToolChain().getTriple().isOSDarwin())
2666 CmdArgs.push_back("-gdwarf-2");
2667 else
2668 CmdArgs.push_back("-g");
2669 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002670 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002671
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002672 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2673 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002674 if (Args.hasArg(options::OPT_gcolumn_info))
2675 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002676
Eric Christopher138c32b2013-09-13 22:37:55 +00002677 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002678 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2679 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002680 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002681 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002682 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002683 CmdArgs.push_back("-g");
2684 CmdArgs.push_back("-backend-option");
2685 CmdArgs.push_back("-split-dwarf=Enable");
2686 }
2687
Eric Christopher138c32b2013-09-13 22:37:55 +00002688 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2689 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2690 CmdArgs.push_back("-backend-option");
2691 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2692 }
Eric Christophereec89c22013-06-18 00:03:50 +00002693
2694 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2695
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002696 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2697 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2698
Chris Lattner3c77a352010-06-22 00:03:40 +00002699 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2700
Nick Lewycky207bce32011-04-21 23:44:07 +00002701 if (Args.hasArg(options::OPT_ftest_coverage) ||
2702 Args.hasArg(options::OPT_coverage))
2703 CmdArgs.push_back("-femit-coverage-notes");
2704 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2705 Args.hasArg(options::OPT_coverage))
2706 CmdArgs.push_back("-femit-coverage-data");
2707
Nick Lewycky480cb992011-05-04 20:46:58 +00002708 if (C.getArgs().hasArg(options::OPT_c) ||
2709 C.getArgs().hasArg(options::OPT_S)) {
2710 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002711 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002712 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002713 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002714 SmallString<128> Pwd;
2715 if (!llvm::sys::fs::current_path(Pwd)) {
2716 llvm::sys::path::append(Pwd, CoverageFilename.str());
2717 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002718 }
2719 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002720 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002721 }
2722 }
2723
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002724 // Pass options for controlling the default header search paths.
2725 if (Args.hasArg(options::OPT_nostdinc)) {
2726 CmdArgs.push_back("-nostdsysteminc");
2727 CmdArgs.push_back("-nobuiltininc");
2728 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002729 if (Args.hasArg(options::OPT_nostdlibinc))
2730 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002731 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2732 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2733 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002734
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002735 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002736 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002737 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002738
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002739 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2740
Ted Kremenekf7639e12012-03-06 20:06:33 +00002741 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002742 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002743 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002744 options::OPT_ccc_arcmt_modify,
2745 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002746 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002747 switch (A->getOption().getID()) {
2748 default:
2749 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002750 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002751 CmdArgs.push_back("-arcmt-check");
2752 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002753 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002754 CmdArgs.push_back("-arcmt-modify");
2755 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002756 case options::OPT_ccc_arcmt_migrate:
2757 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002758 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002759 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002760
2761 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2762 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002763 break;
John McCalld70fb982011-06-15 23:25:17 +00002764 }
2765 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002766 } else {
2767 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2768 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2769 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002770 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002771
Ted Kremenekf7639e12012-03-06 20:06:33 +00002772 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2773 if (ARCMTEnabled) {
2774 D.Diag(diag::err_drv_argument_not_allowed_with)
2775 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2776 }
2777 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002778 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002779
2780 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002781 options::OPT_objcmt_migrate_subscripting,
2782 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002783 // None specified, means enable them all.
2784 CmdArgs.push_back("-objcmt-migrate-literals");
2785 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002786 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002787 } else {
2788 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2789 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002790 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002791 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002792 } else {
2793 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2794 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2795 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2796 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2797 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2798 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2799 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2800 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2801 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2802 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2803 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2804 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2805 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002806 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002807 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002808 }
2809
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002810 // Add preprocessing options like -I, -D, etc. if we are using the
2811 // preprocessor.
2812 //
2813 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002814 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002815 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002816
Rafael Espindolaa7431922011-07-21 23:40:37 +00002817 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2818 // that "The compiler can only warn and ignore the option if not recognized".
2819 // When building with ccache, it will pass -D options to clang even on
2820 // preprocessed inputs and configure concludes that -fPIC is not supported.
2821 Args.ClaimAllArgs(options::OPT_D);
2822
Alp Toker7874bdc2013-11-15 20:40:58 +00002823 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002824 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2825 if (A->getOption().matches(options::OPT_O4)) {
2826 CmdArgs.push_back("-O3");
2827 D.Diag(diag::warn_O4_is_O3);
2828 } else {
2829 A->render(Args, CmdArgs);
2830 }
2831 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002832
Chad Rosier86b82082012-12-12 20:06:31 +00002833 // Don't warn about unused -flto. This can happen when we're preprocessing or
2834 // precompiling.
2835 Args.ClaimAllArgs(options::OPT_flto);
2836
Daniel Dunbar945577c2009-10-29 02:24:45 +00002837 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002838 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2839 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002840 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002841 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002842
2843 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002844 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002845 //
2846 // If a std is supplied, only add -trigraphs if it follows the
2847 // option.
2848 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2849 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002850 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002851 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002852 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002853 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002854 else
2855 Std->render(Args, CmdArgs);
2856
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002857 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2858 options::OPT_trigraphs))
2859 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002860 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002861 } else {
2862 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002863 //
2864 // FIXME: Clang doesn't correctly handle -std= when the input language
2865 // doesn't match. For the time being just ignore this for C++ inputs;
2866 // eventually we want to do all the standard defaulting here instead of
2867 // splitting it between the driver and clang -cc1.
2868 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002869 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2870 "-std=", /*Joined=*/true);
2871 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2872 CmdArgs.push_back("-std=c++11");
2873
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002874 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002875 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002876
Richard Smith282b4492013-09-04 22:50:31 +00002877 // GCC's behavior for -Wwrite-strings is a bit strange:
2878 // * In C, this "warning flag" changes the types of string literals from
2879 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2880 // for the discarded qualifier.
2881 // * In C++, this is just a normal warning flag.
2882 //
2883 // Implementing this warning correctly in C is hard, so we follow GCC's
2884 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2885 // a non-const char* in C, rather than using this crude hack.
2886 if (!types::isCXX(InputType)) {
Rafael Espindola0df9e162013-11-05 21:43:54 +00002887 DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel(
2888 diag::warn_deprecated_string_literal_conversion_c, SourceLocation());
2889 if (DiagLevel > DiagnosticsEngine::Ignored)
Richard Smith282b4492013-09-04 22:50:31 +00002890 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002891 }
2892
Chandler Carruth61fbf622011-04-23 09:27:53 +00002893 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002894 // during C++ compilation, which it is by default. GCC keeps this define even
2895 // in the presence of '-w', match this behavior bug-for-bug.
2896 if (types::isCXX(InputType) &&
2897 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2898 true)) {
2899 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002900 }
2901
Chandler Carruthe0391482010-05-22 02:21:53 +00002902 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2903 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2904 if (Asm->getOption().matches(options::OPT_fasm))
2905 CmdArgs.push_back("-fgnu-keywords");
2906 else
2907 CmdArgs.push_back("-fno-gnu-keywords");
2908 }
2909
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002910 if (ShouldDisableCFI(Args, getToolChain()))
2911 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002912
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002913 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2914 CmdArgs.push_back("-fno-dwarf-directory-asm");
2915
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002916 if (ShouldDisableAutolink(Args, getToolChain()))
2917 CmdArgs.push_back("-fno-autolink");
2918
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002919 // Add in -fdebug-compilation-dir if necessary.
2920 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002921
Richard Smith9a568822011-11-21 19:36:32 +00002922 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2923 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002924 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002925 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002926 }
2927
Richard Smith79c927b2013-11-06 19:31:51 +00002928 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2929 CmdArgs.push_back("-foperator-arrow-depth");
2930 CmdArgs.push_back(A->getValue());
2931 }
2932
Richard Smith9a568822011-11-21 19:36:32 +00002933 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2934 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002935 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002936 }
2937
Richard Smitha3d3bd22013-05-08 02:12:03 +00002938 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2939 CmdArgs.push_back("-fconstexpr-steps");
2940 CmdArgs.push_back(A->getValue());
2941 }
2942
Richard Smithb3a14522013-02-22 01:59:51 +00002943 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2944 CmdArgs.push_back("-fbracket-depth");
2945 CmdArgs.push_back(A->getValue());
2946 }
2947
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002948 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2949 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002950 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002951 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002952 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2953 } else
2954 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002955 }
2956
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002957
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002958 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002959 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002960
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002961 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2962 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002963 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002964 }
David Chisnall5778fce2009-08-31 16:41:57 +00002965
Chris Lattnere23003d2010-01-09 21:54:33 +00002966 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2967 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002968 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002969 }
2970
Chris Lattnerb35583d2010-04-07 20:49:23 +00002971 CmdArgs.push_back("-ferror-limit");
2972 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002973 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002974 else
2975 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002976
Chandler Carrutha77a7272010-05-06 04:55:18 +00002977 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2978 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002979 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002980 }
2981
2982 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2983 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002984 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002985 }
2986
Richard Smithf6f003a2011-12-16 19:06:07 +00002987 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2988 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002989 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002990 }
2991
Daniel Dunbar2c978472009-11-04 06:24:47 +00002992 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002993 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002994 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002995 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002996 } else {
2997 // If -fmessage-length=N was not specified, determine whether this is a
2998 // terminal and, if so, implicitly define -fmessage-length appropriately.
2999 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003000 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003001 }
3002
John McCallb4a99d32013-02-19 01:57:35 +00003003 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3004 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3005 options::OPT_fvisibility_ms_compat)) {
3006 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3007 CmdArgs.push_back("-fvisibility");
3008 CmdArgs.push_back(A->getValue());
3009 } else {
3010 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3011 CmdArgs.push_back("-fvisibility");
3012 CmdArgs.push_back("hidden");
3013 CmdArgs.push_back("-ftype-visibility");
3014 CmdArgs.push_back("default");
3015 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003016 }
3017
Douglas Gregor08329632010-06-15 17:05:35 +00003018 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003019
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003020 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3021
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003022 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003023 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3024 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003025 CmdArgs.push_back("-ffreestanding");
3026
Daniel Dunbare357d562009-12-03 18:42:11 +00003027 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003028 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003029 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00003030 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00003031 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00003032 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003033 // AltiVec language extensions aren't relevant for assembling.
3034 if (!isa<PreprocessJobAction>(JA) ||
3035 Output.getType() != types::TY_PP_Asm)
3036 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003037 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3038 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003039
Peter Collingbourne32701642013-11-01 18:16:25 +00003040 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3041 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003042
Will Dietz3676d562012-12-30 20:53:28 +00003043 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3044 options::OPT_fno_sanitize_recover,
3045 true))
3046 CmdArgs.push_back("-fno-sanitize-recover");
3047
Chad Rosierae229d52013-01-29 23:31:22 +00003048 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
3049 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3050 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3051 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3052
Eric Christopher459d2712013-02-19 06:16:53 +00003053 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003054 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003055 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003056 getToolChain().getArch() == llvm::Triple::ppc64 ||
3057 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003058 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003059 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003060
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003061 if (getToolChain().SupportsProfiling())
3062 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003063
3064 // -flax-vector-conversions is default.
3065 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3066 options::OPT_fno_lax_vector_conversions))
3067 CmdArgs.push_back("-fno-lax-vector-conversions");
3068
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003069 if (Args.getLastArg(options::OPT_fapple_kext))
3070 CmdArgs.push_back("-fapple-kext");
3071
David Blaikie690f21e2012-06-14 18:55:27 +00003072 if (Args.hasFlag(options::OPT_frewrite_includes,
3073 options::OPT_fno_rewrite_includes, false))
3074 CmdArgs.push_back("-frewrite-includes");
3075
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003076 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003077 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003078 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003079 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3080 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003081
3082 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3083 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003084 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003085 }
3086
Bob Wilson14adb362012-02-03 06:27:22 +00003087 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003088
Chandler Carruth6e501032011-03-27 00:04:55 +00003089 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3090 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3091 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3092 options::OPT_fno_wrapv)) {
3093 if (A->getOption().matches(options::OPT_fwrapv))
3094 CmdArgs.push_back("-fwrapv");
3095 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3096 options::OPT_fno_strict_overflow)) {
3097 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3098 CmdArgs.push_back("-fwrapv");
3099 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003100
3101 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3102 options::OPT_fno_reroll_loops))
3103 if (A->getOption().matches(options::OPT_freroll_loops))
3104 CmdArgs.push_back("-freroll-loops");
3105
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003106 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003107 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3108 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003109
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003110 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3111
Mahesha S6a682be42012-10-27 07:47:56 +00003112
Daniel Dunbar4930e332009-11-17 08:07:36 +00003113 // -stack-protector=0 is default.
3114 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003115 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3116 options::OPT_fstack_protector_all,
3117 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003118 if (A->getOption().matches(options::OPT_fstack_protector))
3119 StackProtectorLevel = 1;
3120 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3121 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00003122 } else {
3123 StackProtectorLevel =
3124 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3125 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003126 if (StackProtectorLevel) {
3127 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003128 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003129 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003130
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003131 // --param ssp-buffer-size=
3132 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3133 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003134 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003135 if (Str.startswith("ssp-buffer-size=")) {
3136 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003137 CmdArgs.push_back("-stack-protector-buffer-size");
3138 // FIXME: Verify the argument is a valid integer.
3139 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003140 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003141 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003142 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003143 }
3144
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003145 // Translate -mstackrealign
3146 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3147 false)) {
3148 CmdArgs.push_back("-backend-option");
3149 CmdArgs.push_back("-force-align-stack");
3150 }
3151 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3152 false)) {
3153 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3154 }
3155
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003156 if (Args.hasArg(options::OPT_mstack_alignment)) {
3157 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3158 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003159 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003160 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003161 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003162 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3163 options::OPT_munaligned_access)) {
3164 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3165 CmdArgs.push_back("-backend-option");
3166 CmdArgs.push_back("-arm-strict-align");
3167 } else {
3168 CmdArgs.push_back("-backend-option");
3169 CmdArgs.push_back("-arm-no-strict-align");
3170 }
Renato Golina146a482013-08-24 14:44:41 +00003171 }
Chad Rosier60027022012-11-09 17:29:19 +00003172 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003173
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003174 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3175 options::OPT_mno_restrict_it)) {
3176 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3177 CmdArgs.push_back("-backend-option");
3178 CmdArgs.push_back("-arm-restrict-it");
3179 } else {
3180 CmdArgs.push_back("-backend-option");
3181 CmdArgs.push_back("-arm-no-restrict-it");
3182 }
3183 }
3184
Daniel Dunbard18049a2009-04-07 21:16:11 +00003185 // Forward -f options with positive and negative forms; we translate
3186 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003187 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3188 StringRef fname = A->getValue();
3189 if (!llvm::sys::fs::exists(fname))
3190 D.Diag(diag::err_drv_no_such_file) << fname;
3191 else
3192 A->render(Args, CmdArgs);
3193 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003194
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003195 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003196 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003197 CmdArgs.push_back("-fapple-kext");
3198 if (!Args.hasArg(options::OPT_fbuiltin))
3199 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003200 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003201 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003202 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003203 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003204 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003205
Nuno Lopes13c88c72009-12-16 16:59:22 +00003206 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3207 options::OPT_fno_assume_sane_operator_new))
3208 CmdArgs.push_back("-fno-assume-sane-operator-new");
3209
Daniel Dunbar4930e332009-11-17 08:07:36 +00003210 // -fblocks=0 is default.
3211 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003212 getToolChain().IsBlocksDefault()) ||
3213 (Args.hasArg(options::OPT_fgnu_runtime) &&
3214 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3215 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003216 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003217
3218 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3219 !getToolChain().hasBlocksRuntime())
3220 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003221 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003222
Douglas Gregor226173a2012-01-18 15:19:58 +00003223 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3224 // users must also pass -fcxx-modules. The latter flag will disappear once the
3225 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003226 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003227 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3228 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3229 options::OPT_fno_cxx_modules,
3230 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003231 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003232 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003233 HaveModules = true;
3234 }
3235 }
3236
Daniel Jasper07e6c402013-08-05 20:26:17 +00003237 // -fmodule-maps enables module map processing (off by default) for header
3238 // checking. It is implied by -fmodules.
3239 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3240 false)) {
3241 CmdArgs.push_back("-fmodule-maps");
3242 }
3243
Daniel Jasperac42b752013-10-21 06:34:34 +00003244 // -fmodules-decluse checks that modules used are declared so (off by
3245 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003246 if (Args.hasFlag(options::OPT_fmodules_decluse,
3247 options::OPT_fno_modules_decluse,
3248 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003249 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003250 }
3251
Daniel Jasperac42b752013-10-21 06:34:34 +00003252 // -fmodule-name specifies the module that is currently being built (or
3253 // used for header checking by -fmodule-maps).
3254 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3255 A->claim();
3256 A->render(Args, CmdArgs);
3257 }
3258
3259 // -fmodule-map-file can be used to specify a file containing module
3260 // definitions.
3261 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3262 A->claim();
3263 A->render(Args, CmdArgs);
3264 }
3265
Douglas Gregor35b04d62013-02-07 19:01:24 +00003266 // If a module path was provided, pass it along. Otherwise, use a temporary
3267 // directory.
3268 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3269 A->claim();
3270 if (HaveModules) {
3271 A->render(Args, CmdArgs);
3272 }
3273 } else if (HaveModules) {
3274 SmallString<128> DefaultModuleCache;
3275 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3276 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003277 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3278 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003279 const char Arg[] = "-fmodules-cache-path=";
3280 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3281 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003282 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3283 }
3284
3285 // Pass through all -fmodules-ignore-macro arguments.
3286 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003287 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3288 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003289
John McCalldfea9982010-04-09 19:12:06 +00003290 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003291 if (Args.hasFlag(options::OPT_fno_access_control,
3292 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003293 false))
John McCall3155f572010-04-09 19:03:51 +00003294 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003295
Anders Carlssond470fef2010-11-21 00:09:52 +00003296 // -felide-constructors is the default.
3297 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3298 options::OPT_felide_constructors,
3299 false))
3300 CmdArgs.push_back("-fno-elide-constructors");
3301
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003302 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003303 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003304 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003305 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003306
Richard Smith52be6192012-11-05 22:04:41 +00003307 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003308 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003309 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003310 Args.getLastArg(options::OPT_mkernel,
3311 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003312 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003313 D.Diag(diag::err_drv_argument_not_allowed_with)
3314 << "-fsanitize=vptr" << NoRttiArg;
3315 }
3316 }
3317
Tony Linthicum76329bf2011-12-12 21:14:55 +00003318 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003319 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003320 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003321 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003322 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003323 CmdArgs.push_back("-fshort-enums");
3324
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003325 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003326 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003327 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003328 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003329
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003330 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003331 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003332 options::OPT_fno_threadsafe_statics))
3333 CmdArgs.push_back("-fno-threadsafe-statics");
3334
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003335 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003336 if (!Args.hasFlag(
3337 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3338 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3339 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Robert Lytton6b1deb42013-11-12 10:09:22 +00003340 getToolChain().getArch() != llvm::Triple::hexagon &&
3341 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003342 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003343 CmdArgs.push_back("-fno-use-cxa-atexit");
3344
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003345 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003346 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003347 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3348 CmdArgs.push_back("-fms-extensions");
3349
Francois Pichet1b4f1632011-09-17 04:32:15 +00003350 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003351 if (Args.hasFlag(options::OPT_fms_compatibility,
3352 options::OPT_fno_ms_compatibility,
3353 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3354 Args.hasFlag(options::OPT_fms_extensions,
3355 options::OPT_fno_ms_extensions,
3356 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003357 CmdArgs.push_back("-fms-compatibility");
3358
Reid Klecknerc106fda2013-09-18 00:33:59 +00003359 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003360 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3361 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3362 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003363 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003364 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003365 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003366 else
3367 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3368 }
3369
3370
Eric Christopher5ecce122013-02-18 00:38:31 +00003371 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003372 if (Args.hasFlag(options::OPT_fborland_extensions,
3373 options::OPT_fno_borland_extensions, false))
3374 CmdArgs.push_back("-fborland-extensions");
3375
Francois Pichet02744872011-09-01 16:38:08 +00003376 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3377 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003378 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3379 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003380 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003381 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003382
Chandler Carruthe03aa552010-04-17 20:17:31 +00003383 // -fgnu-keywords default varies depending on language; only pass if
3384 // specified.
3385 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003386 options::OPT_fno_gnu_keywords))
3387 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003388
Rafael Espindola922a6242011-06-02 17:30:53 +00003389 if (Args.hasFlag(options::OPT_fgnu89_inline,
3390 options::OPT_fno_gnu89_inline,
3391 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003392 CmdArgs.push_back("-fgnu89-inline");
3393
Chad Rosier9c76d242012-03-15 22:31:42 +00003394 if (Args.hasArg(options::OPT_fno_inline))
3395 CmdArgs.push_back("-fno-inline");
3396
Chad Rosier64d6be92012-03-06 21:17:19 +00003397 if (Args.hasArg(options::OPT_fno_inline_functions))
3398 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003399
John McCall5fb5df92012-06-20 06:18:46 +00003400 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003401
John McCall5fb5df92012-06-20 06:18:46 +00003402 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003403 // legacy is the default. Next runtime is always legacy dispatch and
3404 // -fno-objc-legacy-dispatch gets ignored silently.
3405 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003406 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3407 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003408 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003409 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003410 if (getToolChain().UseObjCMixedDispatch())
3411 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3412 else
3413 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3414 }
3415 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003416
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003417 // When ObjectiveC legacy runtime is in effect on MacOSX,
3418 // turn on the option to do Array/Dictionary subscripting
3419 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003420 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3421 getToolChain().getTriple().isMacOSX() &&
3422 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3423 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003424 objcRuntime.isNeXTFamily())
3425 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3426
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003427 // -fencode-extended-block-signature=1 is default.
3428 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3429 CmdArgs.push_back("-fencode-extended-block-signature");
3430 }
3431
John McCall24fc0de2011-07-06 00:26:06 +00003432 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3433 // NOTE: This logic is duplicated in ToolChains.cpp.
3434 bool ARC = isObjCAutoRefCount(Args);
3435 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003436 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003437
John McCall24fc0de2011-07-06 00:26:06 +00003438 CmdArgs.push_back("-fobjc-arc");
3439
Chandler Carruth491db322011-11-04 07:34:47 +00003440 // FIXME: It seems like this entire block, and several around it should be
3441 // wrapped in isObjC, but for now we just use it here as this is where it
3442 // was being used previously.
3443 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3444 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3445 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3446 else
3447 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3448 }
3449
John McCall24fc0de2011-07-06 00:26:06 +00003450 // Allow the user to enable full exceptions code emission.
3451 // We define off for Objective-CC, on for Objective-C++.
3452 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3453 options::OPT_fno_objc_arc_exceptions,
3454 /*default*/ types::isCXX(InputType)))
3455 CmdArgs.push_back("-fobjc-arc-exceptions");
3456 }
3457
3458 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3459 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003460 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003461 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003462
John McCall24fc0de2011-07-06 00:26:06 +00003463 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3464 // takes precedence.
3465 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3466 if (!GCArg)
3467 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3468 if (GCArg) {
3469 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003470 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003471 << GCArg->getAsString(Args);
3472 } else if (getToolChain().SupportsObjCGC()) {
3473 GCArg->render(Args, CmdArgs);
3474 } else {
3475 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003476 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003477 << GCArg->getAsString(Args);
3478 }
3479 }
3480
John McCallb5f652e2011-06-22 00:53:57 +00003481 // Add exception args.
3482 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003483 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003484
3485 if (getToolChain().UseSjLjExceptions())
3486 CmdArgs.push_back("-fsjlj-exceptions");
3487
3488 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003489 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3490 options::OPT_fno_assume_sane_operator_new))
3491 CmdArgs.push_back("-fno-assume-sane-operator-new");
3492
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003493 // -fconstant-cfstrings is default, and may be subject to argument translation
3494 // on Darwin.
3495 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3496 options::OPT_fno_constant_cfstrings) ||
3497 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3498 options::OPT_mno_constant_cfstrings))
3499 CmdArgs.push_back("-fno-constant-cfstrings");
3500
John Thompsoned4e2952009-11-05 20:14:16 +00003501 // -fshort-wchar default varies depending on platform; only
3502 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003503 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3504 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003505
Hans Wennborg28c96312013-07-31 23:39:13 +00003506 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003507 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003508 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003509 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003510 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003511
Daniel Dunbar096ed292011-10-05 21:04:55 +00003512 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3513 // -fno-pack-struct doesn't apply to -fpack-struct=.
3514 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003515 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003516 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003517 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003518 } else if (Args.hasFlag(options::OPT_fpack_struct,
3519 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003520 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003521 }
3522
Robert Lytton0e076492013-08-13 09:43:10 +00003523 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003524 if (!Args.hasArg(options::OPT_fcommon))
3525 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003526 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003527 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003528
Daniel Dunbard18049a2009-04-07 21:16:11 +00003529 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003530 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003531 CmdArgs.push_back("-fno-common");
3532
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003533 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003534 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003535 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003536 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003537 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003538 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3539
Daniel Dunbar6358d682010-10-15 22:30:42 +00003540 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3541 if (!Args.hasFlag(options::OPT_ffor_scope,
3542 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003543 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003544 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3545
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003546 // -fcaret-diagnostics is default.
3547 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3548 options::OPT_fno_caret_diagnostics, true))
3549 CmdArgs.push_back("-fno-caret-diagnostics");
3550
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003551 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003552 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003553 options::OPT_fno_diagnostics_fixit_info))
3554 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003555
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003556 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003557 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003558 options::OPT_fno_diagnostics_show_option))
3559 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003560
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003561 if (const Arg *A =
3562 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3563 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003564 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003565 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003566
Douglas Gregor643c9222011-05-21 17:07:29 +00003567 if (const Arg *A =
3568 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3569 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003570 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003571 }
3572
Chandler Carruthb6766f02011-03-27 01:50:55 +00003573 if (Arg *A = Args.getLastArg(
3574 options::OPT_fdiagnostics_show_note_include_stack,
3575 options::OPT_fno_diagnostics_show_note_include_stack)) {
3576 if (A->getOption().matches(
3577 options::OPT_fdiagnostics_show_note_include_stack))
3578 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3579 else
3580 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3581 }
3582
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003583 // Color diagnostics are the default, unless the terminal doesn't support
3584 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003585 // Support both clang's -f[no-]color-diagnostics and gcc's
3586 // -f[no-]diagnostics-colors[=never|always|auto].
3587 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3588 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3589 it != ie; ++it) {
3590 const Option &O = (*it)->getOption();
3591 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3592 !O.matches(options::OPT_fdiagnostics_color) &&
3593 !O.matches(options::OPT_fno_color_diagnostics) &&
3594 !O.matches(options::OPT_fno_diagnostics_color) &&
3595 !O.matches(options::OPT_fdiagnostics_color_EQ))
3596 continue;
3597
3598 (*it)->claim();
3599 if (O.matches(options::OPT_fcolor_diagnostics) ||
3600 O.matches(options::OPT_fdiagnostics_color)) {
3601 ShowColors = Colors_On;
3602 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3603 O.matches(options::OPT_fno_diagnostics_color)) {
3604 ShowColors = Colors_Off;
3605 } else {
3606 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3607 StringRef value((*it)->getValue());
3608 if (value == "always")
3609 ShowColors = Colors_On;
3610 else if (value == "never")
3611 ShowColors = Colors_Off;
3612 else if (value == "auto")
3613 ShowColors = Colors_Auto;
3614 else
3615 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3616 << ("-fdiagnostics-color=" + value).str();
3617 }
3618 }
3619 if (ShowColors == Colors_On ||
3620 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003621 CmdArgs.push_back("-fcolor-diagnostics");
3622
Nico Rieck7857d462013-09-11 00:38:02 +00003623 if (Args.hasArg(options::OPT_fansi_escape_codes))
3624 CmdArgs.push_back("-fansi-escape-codes");
3625
Daniel Dunbardb097022009-06-08 21:13:54 +00003626 if (!Args.hasFlag(options::OPT_fshow_source_location,
3627 options::OPT_fno_show_source_location))
3628 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003629
Douglas Gregor643c9222011-05-21 17:07:29 +00003630 if (!Args.hasFlag(options::OPT_fshow_column,
3631 options::OPT_fno_show_column,
3632 true))
3633 CmdArgs.push_back("-fno-show-column");
3634
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003635 if (!Args.hasFlag(options::OPT_fspell_checking,
3636 options::OPT_fno_spell_checking))
3637 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003638
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003639
Chad Rosierc8e56e82012-12-05 21:08:21 +00003640 // -fno-asm-blocks is default.
3641 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3642 false))
3643 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003644
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003645 // Enable vectorization per default according to the optimization level
3646 // selected. For optimization levels that want vectorization we use the alias
3647 // option to simplify the hasFlag logic.
3648 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3649 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003650 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003651 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003652 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003653 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003654
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003655 // -fslp-vectorize is default.
3656 if (Args.hasFlag(options::OPT_fslp_vectorize,
3657 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003658 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003659
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003660 // -fno-slp-vectorize-aggressive is default.
3661 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003662 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003663 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003664
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003665 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3666 A->render(Args, CmdArgs);
3667
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003668 // -fdollars-in-identifiers default varies depending on platform and
3669 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003670 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003671 options::OPT_fno_dollars_in_identifiers)) {
3672 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003673 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003674 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003675 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003676 }
3677
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003678 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3679 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003680 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003681 options::OPT_fno_unit_at_a_time)) {
3682 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003683 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003684 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003685
Eli Friedman055c9702011-11-02 01:53:16 +00003686 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3687 options::OPT_fno_apple_pragma_pack, false))
3688 CmdArgs.push_back("-fapple-pragma-pack");
3689
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003690 // le32-specific flags:
3691 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3692 // by default.
3693 if (getToolChain().getArch() == llvm::Triple::le32) {
3694 CmdArgs.push_back("-fno-math-builtin");
3695 }
3696
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003697 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003698 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003699 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003700#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003701 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003702 (getToolChain().getArch() == llvm::Triple::arm ||
3703 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003704 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3705 CmdArgs.push_back("-fno-builtin-strcat");
3706 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3707 CmdArgs.push_back("-fno-builtin-strcpy");
3708 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003709#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003710
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003711 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003712 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003713 options::OPT_traditional_cpp)) {
3714 if (isa<PreprocessJobAction>(JA))
3715 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003716 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003717 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003718 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003719
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003720 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003721 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003722
3723 // Handle serialized diagnostics.
3724 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3725 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003726 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003727 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003728
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003729 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3730 CmdArgs.push_back("-fretain-comments-from-system-headers");
3731
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003732 // Forward -fcomment-block-commands to -cc1.
3733 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003734 // Forward -fparse-all-comments to -cc1.
3735 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003736
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003737 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3738 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003739 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003740 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3741 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003742 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003743
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003744 // We translate this by hand to the -cc1 argument, since nightly test uses
3745 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003746 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003747 CmdArgs.push_back("-disable-llvm-optzns");
3748 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003749 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003750 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003751
Daniel Dunbard67a3222009-03-30 06:36:42 +00003752 if (Output.getType() == types::TY_Dependencies) {
3753 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003754 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003755 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003756 CmdArgs.push_back(Output.getFilename());
3757 } else {
3758 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003759 }
3760
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003761 for (InputInfoList::const_iterator
3762 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3763 const InputInfo &II = *it;
3764 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003765 if (Args.hasArg(options::OPT_rewrite_objc))
3766 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3767 else
3768 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003769 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003770 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003771 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003772 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003773 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003774
Chris Lattnere9d7d782009-11-03 19:50:27 +00003775 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3776
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003777 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003778
3779 // Optionally embed the -cc1 level arguments into the debug info, for build
3780 // analysis.
3781 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003782 ArgStringList OriginalArgs;
3783 for (ArgList::const_iterator it = Args.begin(),
3784 ie = Args.end(); it != ie; ++it)
3785 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003786
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003787 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003788 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003789 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003790 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003791 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003792 }
3793 CmdArgs.push_back("-dwarf-debug-flags");
3794 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3795 }
3796
Eric Christopherd3804002013-02-22 20:12:52 +00003797 // Add the split debug info name to the command lines here so we
3798 // can propagate it to the backend.
3799 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003800 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003801 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003802 const char *SplitDwarfOut;
3803 if (SplitDwarf) {
3804 CmdArgs.push_back("-split-dwarf-file");
3805 SplitDwarfOut = SplitDebugName(Args, Inputs);
3806 CmdArgs.push_back(SplitDwarfOut);
3807 }
3808
3809 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003810 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3811 tools::visualstudio::Compile CL(getToolChain());
3812 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3813 LinkingOutput);
3814 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3815 } else {
3816 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3817 }
3818
Daniel Dunbar17731772009-03-23 19:03:36 +00003819
Eric Christopherf1545832013-02-22 23:50:16 +00003820 // Handle the debug info splitting at object creation time if we're
3821 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003822 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003823 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003824 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003825
Roman Divacky178e01602011-02-10 16:52:03 +00003826 if (Arg *A = Args.getLastArg(options::OPT_pg))
3827 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003828 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003829 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003830
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003831 // Claim some arguments which clang supports automatically.
3832
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003833 // -fpch-preprocess is used with gcc to add a special marker in the output to
3834 // include the PCH file. Clang's PTH solution is completely transparent, so we
3835 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003836 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003837
Daniel Dunbar17731772009-03-23 19:03:36 +00003838 // Claim some arguments which clang doesn't support, but we don't
3839 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003840 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3841 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003842
Rafael Espindolab0092d72013-09-04 19:37:35 +00003843 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003844 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003845}
3846
John McCall5fb5df92012-06-20 06:18:46 +00003847/// Add options related to the Objective-C runtime/ABI.
3848///
3849/// Returns true if the runtime is non-fragile.
3850ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3851 ArgStringList &cmdArgs,
3852 RewriteKind rewriteKind) const {
3853 // Look for the controlling runtime option.
3854 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3855 options::OPT_fgnu_runtime,
3856 options::OPT_fobjc_runtime_EQ);
3857
3858 // Just forward -fobjc-runtime= to the frontend. This supercedes
3859 // options about fragility.
3860 if (runtimeArg &&
3861 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3862 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003863 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003864 if (runtime.tryParse(value)) {
3865 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3866 << value;
3867 }
3868
3869 runtimeArg->render(args, cmdArgs);
3870 return runtime;
3871 }
3872
3873 // Otherwise, we'll need the ABI "version". Version numbers are
3874 // slightly confusing for historical reasons:
3875 // 1 - Traditional "fragile" ABI
3876 // 2 - Non-fragile ABI, version 1
3877 // 3 - Non-fragile ABI, version 2
3878 unsigned objcABIVersion = 1;
3879 // If -fobjc-abi-version= is present, use that to set the version.
3880 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003881 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003882 if (value == "1")
3883 objcABIVersion = 1;
3884 else if (value == "2")
3885 objcABIVersion = 2;
3886 else if (value == "3")
3887 objcABIVersion = 3;
3888 else
3889 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3890 << value;
3891 } else {
3892 // Otherwise, determine if we are using the non-fragile ABI.
3893 bool nonFragileABIIsDefault =
3894 (rewriteKind == RK_NonFragile ||
3895 (rewriteKind == RK_None &&
3896 getToolChain().IsObjCNonFragileABIDefault()));
3897 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3898 options::OPT_fno_objc_nonfragile_abi,
3899 nonFragileABIIsDefault)) {
3900 // Determine the non-fragile ABI version to use.
3901#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3902 unsigned nonFragileABIVersion = 1;
3903#else
3904 unsigned nonFragileABIVersion = 2;
3905#endif
3906
3907 if (Arg *abiArg = args.getLastArg(
3908 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003909 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003910 if (value == "1")
3911 nonFragileABIVersion = 1;
3912 else if (value == "2")
3913 nonFragileABIVersion = 2;
3914 else
3915 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3916 << value;
3917 }
3918
3919 objcABIVersion = 1 + nonFragileABIVersion;
3920 } else {
3921 objcABIVersion = 1;
3922 }
3923 }
3924
3925 // We don't actually care about the ABI version other than whether
3926 // it's non-fragile.
3927 bool isNonFragile = objcABIVersion != 1;
3928
3929 // If we have no runtime argument, ask the toolchain for its default runtime.
3930 // However, the rewriter only really supports the Mac runtime, so assume that.
3931 ObjCRuntime runtime;
3932 if (!runtimeArg) {
3933 switch (rewriteKind) {
3934 case RK_None:
3935 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3936 break;
3937 case RK_Fragile:
3938 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3939 break;
3940 case RK_NonFragile:
3941 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3942 break;
3943 }
3944
3945 // -fnext-runtime
3946 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3947 // On Darwin, make this use the default behavior for the toolchain.
3948 if (getToolChain().getTriple().isOSDarwin()) {
3949 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3950
3951 // Otherwise, build for a generic macosx port.
3952 } else {
3953 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3954 }
3955
3956 // -fgnu-runtime
3957 } else {
3958 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003959 // Legacy behaviour is to target the gnustep runtime if we are i
3960 // non-fragile mode or the GCC runtime in fragile mode.
3961 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003962 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003963 else
3964 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003965 }
3966
3967 cmdArgs.push_back(args.MakeArgString(
3968 "-fobjc-runtime=" + runtime.getAsString()));
3969 return runtime;
3970}
3971
Hans Wennborg75958c42013-08-08 00:17:41 +00003972void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3973 unsigned RTOptionID = options::OPT__SLASH_MT;
3974
Hans Wennborgf1a74252013-09-10 20:18:04 +00003975 if (Args.hasArg(options::OPT__SLASH_LDd))
3976 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3977 // but defining _DEBUG is sticky.
3978 RTOptionID = options::OPT__SLASH_MTd;
3979
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003980 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003981 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003982
Hans Wennborg75958c42013-08-08 00:17:41 +00003983 switch(RTOptionID) {
3984 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003985 if (Args.hasArg(options::OPT__SLASH_LDd))
3986 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003987 CmdArgs.push_back("-D_MT");
3988 CmdArgs.push_back("-D_DLL");
3989 CmdArgs.push_back("--dependent-lib=msvcrt");
3990 break;
3991 case options::OPT__SLASH_MDd:
3992 CmdArgs.push_back("-D_DEBUG");
3993 CmdArgs.push_back("-D_MT");
3994 CmdArgs.push_back("-D_DLL");
3995 CmdArgs.push_back("--dependent-lib=msvcrtd");
3996 break;
3997 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003998 if (Args.hasArg(options::OPT__SLASH_LDd))
3999 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004000 CmdArgs.push_back("-D_MT");
4001 CmdArgs.push_back("--dependent-lib=libcmt");
4002 break;
4003 case options::OPT__SLASH_MTd:
4004 CmdArgs.push_back("-D_DEBUG");
4005 CmdArgs.push_back("-D_MT");
4006 CmdArgs.push_back("--dependent-lib=libcmtd");
4007 break;
4008 default:
4009 llvm_unreachable("Unexpected option ID.");
4010 }
4011
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004012 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4013 // users want. The /Za flag to cl.exe turns this off, but it's not
4014 // implemented in clang.
4015 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004016
4017 // FIXME: Make this default for the win32 triple.
4018 CmdArgs.push_back("-cxx-abi");
4019 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00004020
4021 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4022 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004023
4024 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4025 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004026 if (Args.hasArg(options::OPT__SLASH_fallback))
4027 CmdArgs.push_back("msvc-fallback");
4028 else
4029 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004030 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004031}
4032
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004033void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004034 const InputInfo &Output,
4035 const InputInfoList &Inputs,
4036 const ArgList &Args,
4037 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004038 ArgStringList CmdArgs;
4039
4040 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4041 const InputInfo &Input = Inputs[0];
4042
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004043 // Don't warn about "clang -w -c foo.s"
4044 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004045 // and "clang -emit-llvm -c foo.s"
4046 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004047
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004048 // Invoke ourselves in -cc1as mode.
4049 //
4050 // FIXME: Implement custom jobs for internal actions.
4051 CmdArgs.push_back("-cc1as");
4052
4053 // Add the "effective" target triple.
4054 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004055 std::string TripleStr =
4056 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004057 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4058
4059 // Set the output mode, we currently only expect to be used as a real
4060 // assembler.
4061 CmdArgs.push_back("-filetype");
4062 CmdArgs.push_back("obj");
4063
Eric Christopher45f2e712012-12-18 00:31:10 +00004064 // Set the main file name, so that debug info works even with
4065 // -save-temps or preprocessed assembly.
4066 CmdArgs.push_back("-main-file-name");
4067 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4068
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004069 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004070 const llvm::Triple &Triple = getToolChain().getTriple();
4071 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004072 if (!CPU.empty()) {
4073 CmdArgs.push_back("-target-cpu");
4074 CmdArgs.push_back(Args.MakeArgString(CPU));
4075 }
4076
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004077 // Add the target features
4078 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004079 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004080
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004081 // Ignore explicit -force_cpusubtype_ALL option.
4082 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004083
Eric Christopherfc3ee562012-01-10 00:38:01 +00004084 // Determine the original source input.
4085 const Action *SourceAction = &JA;
4086 while (SourceAction->getKind() != Action::InputClass) {
4087 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4088 SourceAction = SourceAction->getInputs()[0];
4089 }
4090
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004091 // Forward -g and handle debug info related flags, assuming we are dealing
4092 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004093 if (SourceAction->getType() == types::TY_Asm ||
4094 SourceAction->getType() == types::TY_PP_Asm) {
4095 Args.ClaimAllArgs(options::OPT_g_Group);
4096 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4097 if (!A->getOption().matches(options::OPT_g0))
4098 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004099
4100 // Add the -fdebug-compilation-dir flag if needed.
4101 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004102
4103 // Set the AT_producer to the clang version when using the integrated
4104 // assembler on assembly source files.
4105 CmdArgs.push_back("-dwarf-debug-producer");
4106 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004107 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004108
4109 // Optionally embed the -cc1as level arguments into the debug info, for build
4110 // analysis.
4111 if (getToolChain().UseDwarfDebugFlags()) {
4112 ArgStringList OriginalArgs;
4113 for (ArgList::const_iterator it = Args.begin(),
4114 ie = Args.end(); it != ie; ++it)
4115 (*it)->render(Args, OriginalArgs);
4116
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004117 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004118 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4119 Flags += Exec;
4120 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4121 Flags += " ";
4122 Flags += OriginalArgs[i];
4123 }
4124 CmdArgs.push_back("-dwarf-debug-flags");
4125 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4126 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004127
4128 // FIXME: Add -static support, once we have it.
4129
David Blaikie9260ed62013-07-25 21:19:01 +00004130 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4131 getToolChain().getDriver());
4132
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004133 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004134
4135 assert(Output.isFilename() && "Unexpected lipo output.");
4136 CmdArgs.push_back("-o");
4137 CmdArgs.push_back(Output.getFilename());
4138
Daniel Dunbarb440f562010-08-02 02:38:21 +00004139 assert(Input.isFilename() && "Invalid input.");
4140 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004141
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004142 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004143 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004144
4145 // Handle the debug info splitting at object creation time if we're
4146 // creating an object.
4147 // TODO: Currently only works on linux with newer objcopy.
4148 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004149 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004150 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4151 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004152}
4153
Daniel Dunbara3246a02009-03-18 08:07:30 +00004154void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004155 const InputInfo &Output,
4156 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004157 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004158 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004159 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004160 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004161
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004162 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004163 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004164 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004165 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004166 // Don't forward any -g arguments to assembly steps.
4167 if (isa<AssembleJobAction>(JA) &&
4168 A->getOption().matches(options::OPT_g_Group))
4169 continue;
4170
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004171 // Don't forward any -W arguments to assembly and link steps.
4172 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4173 A->getOption().matches(options::OPT_W_Group))
4174 continue;
4175
Daniel Dunbar2da02722009-03-19 07:55:12 +00004176 // It is unfortunate that we have to claim here, as this means
4177 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004178 // platforms using a generic gcc, even if we are just using gcc
4179 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004180 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004181 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004182 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004183 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004184
Daniel Dunbar4e295052010-01-25 22:35:08 +00004185 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004186
4187 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004188 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004189 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004190 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004191
4192 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004193 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004194 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004195 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004196 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004197 else if (Arch == llvm::Triple::ppc64le)
4198 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004199 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004200 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004201 }
4202
Daniel Dunbar5716d872009-05-02 21:41:52 +00004203 // Try to force gcc to match the tool chain we want, if we recognize
4204 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004205 //
4206 // FIXME: The triple class should directly provide the information we want
4207 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004208 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004209 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004210 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4211 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004212 CmdArgs.push_back("-m64");
4213
Daniel Dunbarb440f562010-08-02 02:38:21 +00004214 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004215 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004216 CmdArgs.push_back(Output.getFilename());
4217 } else {
4218 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004219 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004220 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004221
Tony Linthicum76329bf2011-12-12 21:14:55 +00004222 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4223 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004224
4225 // Only pass -x if gcc will understand it; otherwise hope gcc
4226 // understands the suffix correctly. The main use case this would go
4227 // wrong in is for linker inputs if they happened to have an odd
4228 // suffix; really the only way to get this to happen is a command
4229 // like '-x foobar a.c' which will treat a.c like a linker input.
4230 //
4231 // FIXME: For the linker case specifically, can we safely convert
4232 // inputs into '-Wl,' options?
4233 for (InputInfoList::const_iterator
4234 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4235 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004236
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004237 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004238 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4239 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004240 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004241 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004242 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004243 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004244 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004245 else if (II.getType() == types::TY_ModuleFile)
4246 D.Diag(diag::err_drv_no_module_support)
4247 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004248
Daniel Dunbara3246a02009-03-18 08:07:30 +00004249 if (types::canTypeBeUserSpecified(II.getType())) {
4250 CmdArgs.push_back("-x");
4251 CmdArgs.push_back(types::getTypeName(II.getType()));
4252 }
4253
Daniel Dunbarb440f562010-08-02 02:38:21 +00004254 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004255 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004256 else {
4257 const Arg &A = II.getInputArg();
4258
4259 // Reverse translate some rewritten options.
4260 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4261 CmdArgs.push_back("-lstdc++");
4262 continue;
4263 }
4264
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004265 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004266 A.render(Args, CmdArgs);
4267 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004268 }
4269
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004270 const std::string customGCCName = D.getCCCGenericGCCName();
4271 const char *GCCName;
4272 if (!customGCCName.empty())
4273 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004274 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004275 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004276 } else
4277 GCCName = "gcc";
4278
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004279 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004280 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004281 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004282}
4283
Daniel Dunbar4e295052010-01-25 22:35:08 +00004284void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4285 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004286 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004287}
4288
Daniel Dunbar4e295052010-01-25 22:35:08 +00004289void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4290 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004291 const Driver &D = getToolChain().getDriver();
4292
Daniel Dunbar4e295052010-01-25 22:35:08 +00004293 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004294 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4295 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004296 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004297 else {
4298 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004299 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004300 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004301
Daniel Dunbar4e295052010-01-25 22:35:08 +00004302 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004303 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004304}
4305
Daniel Dunbar4e295052010-01-25 22:35:08 +00004306void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4307 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004308 // The types are (hopefully) good enough.
4309}
4310
Tony Linthicum76329bf2011-12-12 21:14:55 +00004311// Hexagon tools start.
4312void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4313 ArgStringList &CmdArgs) const {
4314
4315}
4316void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4317 const InputInfo &Output,
4318 const InputInfoList &Inputs,
4319 const ArgList &Args,
4320 const char *LinkingOutput) const {
4321
4322 const Driver &D = getToolChain().getDriver();
4323 ArgStringList CmdArgs;
4324
4325 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004326 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004327 CmdArgs.push_back(Args.MakeArgString(MarchString));
4328
4329 RenderExtraToolArgs(JA, CmdArgs);
4330
4331 if (Output.isFilename()) {
4332 CmdArgs.push_back("-o");
4333 CmdArgs.push_back(Output.getFilename());
4334 } else {
4335 assert(Output.isNothing() && "Unexpected output");
4336 CmdArgs.push_back("-fsyntax-only");
4337 }
4338
Matthew Curtise8f80a12012-12-06 17:49:03 +00004339 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4340 if (!SmallDataThreshold.empty())
4341 CmdArgs.push_back(
4342 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004343
Matthew Curtise5df3812012-12-07 17:23:04 +00004344 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4345 options::OPT_Xassembler);
4346
Tony Linthicum76329bf2011-12-12 21:14:55 +00004347 // Only pass -x if gcc will understand it; otherwise hope gcc
4348 // understands the suffix correctly. The main use case this would go
4349 // wrong in is for linker inputs if they happened to have an odd
4350 // suffix; really the only way to get this to happen is a command
4351 // like '-x foobar a.c' which will treat a.c like a linker input.
4352 //
4353 // FIXME: For the linker case specifically, can we safely convert
4354 // inputs into '-Wl,' options?
4355 for (InputInfoList::const_iterator
4356 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4357 const InputInfo &II = *it;
4358
4359 // Don't try to pass LLVM or AST inputs to a generic gcc.
4360 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4361 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4362 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4363 << getToolChain().getTripleString();
4364 else if (II.getType() == types::TY_AST)
4365 D.Diag(clang::diag::err_drv_no_ast_support)
4366 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004367 else if (II.getType() == types::TY_ModuleFile)
4368 D.Diag(diag::err_drv_no_module_support)
4369 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004370
4371 if (II.isFilename())
4372 CmdArgs.push_back(II.getFilename());
4373 else
4374 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4375 II.getInputArg().render(Args, CmdArgs);
4376 }
4377
4378 const char *GCCName = "hexagon-as";
4379 const char *Exec =
4380 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4381 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4382
4383}
4384void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4385 ArgStringList &CmdArgs) const {
4386 // The types are (hopefully) good enough.
4387}
4388
4389void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4390 const InputInfo &Output,
4391 const InputInfoList &Inputs,
4392 const ArgList &Args,
4393 const char *LinkingOutput) const {
4394
Matthew Curtise689b052012-12-06 15:46:07 +00004395 const toolchains::Hexagon_TC& ToolChain =
4396 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4397 const Driver &D = ToolChain.getDriver();
4398
Tony Linthicum76329bf2011-12-12 21:14:55 +00004399 ArgStringList CmdArgs;
4400
Matthew Curtise689b052012-12-06 15:46:07 +00004401 //----------------------------------------------------------------------------
4402 //
4403 //----------------------------------------------------------------------------
4404 bool hasStaticArg = Args.hasArg(options::OPT_static);
4405 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004406 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004407 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4408 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4409 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4410 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004411
Matthew Curtise689b052012-12-06 15:46:07 +00004412 //----------------------------------------------------------------------------
4413 // Silence warnings for various options
4414 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004415
Matthew Curtise689b052012-12-06 15:46:07 +00004416 Args.ClaimAllArgs(options::OPT_g_Group);
4417 Args.ClaimAllArgs(options::OPT_emit_llvm);
4418 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4419 // handled somewhere else.
4420 Args.ClaimAllArgs(options::OPT_static_libgcc);
4421
4422 //----------------------------------------------------------------------------
4423 //
4424 //----------------------------------------------------------------------------
4425 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4426 e = ToolChain.ExtraOpts.end();
4427 i != e; ++i)
4428 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004429
Matthew Curtisf10a5952012-12-06 14:16:43 +00004430 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4431 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004432
Matthew Curtise689b052012-12-06 15:46:07 +00004433 if (buildingLib) {
4434 CmdArgs.push_back("-shared");
4435 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4436 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004437 }
4438
Matthew Curtise689b052012-12-06 15:46:07 +00004439 if (hasStaticArg)
4440 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004441
Matthew Curtise8f80a12012-12-06 17:49:03 +00004442 if (buildPIE && !buildingLib)
4443 CmdArgs.push_back("-pie");
4444
4445 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4446 if (!SmallDataThreshold.empty()) {
4447 CmdArgs.push_back(
4448 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4449 }
4450
Matthew Curtise689b052012-12-06 15:46:07 +00004451 //----------------------------------------------------------------------------
4452 //
4453 //----------------------------------------------------------------------------
4454 CmdArgs.push_back("-o");
4455 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004456
Matthew Curtise689b052012-12-06 15:46:07 +00004457 const std::string MarchSuffix = "/" + MarchString;
4458 const std::string G0Suffix = "/G0";
4459 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4460 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4461 + "/";
4462 const std::string StartFilesDir = RootDir
4463 + "hexagon/lib"
4464 + (buildingLib
4465 ? MarchG0Suffix : MarchSuffix);
4466
4467 //----------------------------------------------------------------------------
4468 // moslib
4469 //----------------------------------------------------------------------------
4470 std::vector<std::string> oslibs;
4471 bool hasStandalone= false;
4472
4473 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4474 ie = Args.filtered_end(); it != ie; ++it) {
4475 (*it)->claim();
4476 oslibs.push_back((*it)->getValue());
4477 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004478 }
Matthew Curtise689b052012-12-06 15:46:07 +00004479 if (oslibs.empty()) {
4480 oslibs.push_back("standalone");
4481 hasStandalone = true;
4482 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004483
Matthew Curtise689b052012-12-06 15:46:07 +00004484 //----------------------------------------------------------------------------
4485 // Start Files
4486 //----------------------------------------------------------------------------
4487 if (incStdLib && incStartFiles) {
4488
4489 if (!buildingLib) {
4490 if (hasStandalone) {
4491 CmdArgs.push_back(
4492 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4493 }
4494 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4495 }
4496 std::string initObj = useShared ? "/initS.o" : "/init.o";
4497 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4498 }
4499
4500 //----------------------------------------------------------------------------
4501 // Library Search Paths
4502 //----------------------------------------------------------------------------
4503 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4504 for (ToolChain::path_list::const_iterator
4505 i = LibPaths.begin(),
4506 e = LibPaths.end();
4507 i != e;
4508 ++i)
4509 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4510
4511 //----------------------------------------------------------------------------
4512 //
4513 //----------------------------------------------------------------------------
4514 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4515 Args.AddAllArgs(CmdArgs, options::OPT_e);
4516 Args.AddAllArgs(CmdArgs, options::OPT_s);
4517 Args.AddAllArgs(CmdArgs, options::OPT_t);
4518 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4519
4520 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4521
4522 //----------------------------------------------------------------------------
4523 // Libraries
4524 //----------------------------------------------------------------------------
4525 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004526 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004527 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4528 CmdArgs.push_back("-lm");
4529 }
4530
4531 CmdArgs.push_back("--start-group");
4532
4533 if (!buildingLib) {
4534 for(std::vector<std::string>::iterator i = oslibs.begin(),
4535 e = oslibs.end(); i != e; ++i)
4536 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4537 CmdArgs.push_back("-lc");
4538 }
4539 CmdArgs.push_back("-lgcc");
4540
4541 CmdArgs.push_back("--end-group");
4542 }
4543
4544 //----------------------------------------------------------------------------
4545 // End files
4546 //----------------------------------------------------------------------------
4547 if (incStdLib && incStartFiles) {
4548 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4549 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4550 }
4551
4552 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004553 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004554}
4555// Hexagon tools end.
4556
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004557llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4558 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4559 // archs which Darwin doesn't use.
4560
4561 // The matching this routine does is fairly pointless, since it is neither the
4562 // complete architecture list, nor a reasonable subset. The problem is that
4563 // historically the driver driver accepts this and also ties its -march=
4564 // handling to the architecture name, so we need to be careful before removing
4565 // support for it.
4566
4567 // This code must be kept in sync with Clang's Darwin specific argument
4568 // translation.
4569
4570 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4571 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4572 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4573 .Case("ppc64", llvm::Triple::ppc64)
4574 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4575 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4576 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004577 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004578 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004579 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4580 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4581 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004582 .Case("r600", llvm::Triple::r600)
4583 .Case("nvptx", llvm::Triple::nvptx)
4584 .Case("nvptx64", llvm::Triple::nvptx64)
4585 .Case("amdil", llvm::Triple::amdil)
4586 .Case("spir", llvm::Triple::spir)
4587 .Default(llvm::Triple::UnknownArch);
4588}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004589
Bob Wilsondecc03e2012-11-23 06:14:39 +00004590const char *Clang::getBaseInputName(const ArgList &Args,
4591 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004592 return Args.MakeArgString(
4593 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004594}
4595
Bob Wilsondecc03e2012-11-23 06:14:39 +00004596const char *Clang::getBaseInputStem(const ArgList &Args,
4597 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004598 const char *Str = getBaseInputName(Args, Inputs);
4599
Chris Lattner906bb902011-01-16 08:14:11 +00004600 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004601 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004602
4603 return Str;
4604}
4605
Bob Wilsondecc03e2012-11-23 06:14:39 +00004606const char *Clang::getDependencyFileName(const ArgList &Args,
4607 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004608 // FIXME: Think about this more.
4609 std::string Res;
4610
4611 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004612 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004613 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004614 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004615 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004616 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004617 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004618}
4619
Daniel Dunbarbe220842009-03-20 16:06:39 +00004620void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004621 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004622 const InputInfoList &Inputs,
4623 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004624 const char *LinkingOutput) const {
4625 ArgStringList CmdArgs;
4626
4627 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4628 const InputInfo &Input = Inputs[0];
4629
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004630 // Determine the original source input.
4631 const Action *SourceAction = &JA;
4632 while (SourceAction->getKind() != Action::InputClass) {
4633 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4634 SourceAction = SourceAction->getInputs()[0];
4635 }
4636
Kevin Enderby319baa42013-11-18 23:30:29 +00004637 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4638 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004639 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4640 // FIXME: at run-time detect assembler capabilities or rely on version
4641 // information forwarded by -target-assembler-version (future)
4642 if (Args.hasArg(options::OPT_no_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004643 const llvm::Triple &T(getToolChain().getTriple());
4644 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004645 CmdArgs.push_back("-Q");
4646 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004647
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004648 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004649 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004650 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004651 if (Args.hasArg(options::OPT_gstabs))
4652 CmdArgs.push_back("--gstabs");
4653 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004654 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004655 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004656
Daniel Dunbarbe220842009-03-20 16:06:39 +00004657 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004658 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004659
Daniel Dunbar6d484762010-07-22 01:47:22 +00004660 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004661 if (getToolChain().getArch() == llvm::Triple::x86 ||
4662 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004663 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4664 CmdArgs.push_back("-force_cpusubtype_ALL");
4665
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004666 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004667 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004668 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004669 (!getDarwinToolChain().isTargetIPhoneOS() ||
4670 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4671 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004672 CmdArgs.push_back("-static");
4673
Daniel Dunbarbe220842009-03-20 16:06:39 +00004674 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4675 options::OPT_Xassembler);
4676
4677 assert(Output.isFilename() && "Unexpected lipo output.");
4678 CmdArgs.push_back("-o");
4679 CmdArgs.push_back(Output.getFilename());
4680
Daniel Dunbarb440f562010-08-02 02:38:21 +00004681 assert(Input.isFilename() && "Invalid input.");
4682 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004683
4684 // asm_final spec is empty.
4685
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004686 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004687 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004688 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004689}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004690
David Blaikie68e081d2011-12-20 02:48:34 +00004691void darwin::DarwinTool::anchor() {}
4692
Daniel Dunbare9ded432009-09-09 18:36:20 +00004693void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4694 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004695 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004696
Daniel Dunbarc1964212009-03-26 16:23:12 +00004697 // Derived from darwin_arch spec.
4698 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004699 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004700
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004701 // FIXME: Is this needed anymore?
4702 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004703 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004704}
4705
Bill Wendling3b2000f2012-10-02 18:02:50 +00004706bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4707 // We only need to generate a temp path for LTO if we aren't compiling object
4708 // files. When compiling source files, we run 'dsymutil' after linking. We
4709 // don't run 'dsymutil' when compiling object files.
4710 for (InputInfoList::const_iterator
4711 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4712 if (it->getType() != types::TY_Object)
4713 return true;
4714
4715 return false;
4716}
4717
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004718void darwin::Link::AddLinkArgs(Compilation &C,
4719 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004720 ArgStringList &CmdArgs,
4721 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004722 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004723 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004724
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004725 unsigned Version[3] = { 0, 0, 0 };
4726 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4727 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004728 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004729 Version[1], Version[2], HadExtra) ||
4730 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004731 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004732 << A->getAsString(Args);
4733 }
4734
4735 // Newer linkers support -demangle, pass it if supported and not disabled by
4736 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004737 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004738 // Don't pass -demangle to ld_classic.
4739 //
4740 // FIXME: This is a temporary workaround, ld should be handling this.
4741 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4742 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004743 if (getToolChain().getArch() == llvm::Triple::x86) {
4744 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4745 options::OPT_Wl_COMMA),
4746 ie = Args.filtered_end(); it != ie; ++it) {
4747 const Arg *A = *it;
4748 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004749 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004750 UsesLdClassic = true;
4751 }
4752 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004753 if (!UsesLdClassic)
4754 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004755 }
4756
Bob Wilson3d27dad2013-08-02 22:25:34 +00004757 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4758 CmdArgs.push_back("-export_dynamic");
4759
Bill Wendling313b6bf2012-11-16 23:03:00 +00004760 // If we are using LTO, then automatically create a temporary file path for
4761 // the linker to use, so that it's lifetime will extend past a possible
4762 // dsymutil step.
4763 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4764 const char *TmpPath = C.getArgs().MakeArgString(
4765 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4766 C.addTempFile(TmpPath);
4767 CmdArgs.push_back("-object_path_lto");
4768 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004769 }
4770
Daniel Dunbarc1964212009-03-26 16:23:12 +00004771 // Derived from the "link" spec.
4772 Args.AddAllArgs(CmdArgs, options::OPT_static);
4773 if (!Args.hasArg(options::OPT_static))
4774 CmdArgs.push_back("-dynamic");
4775 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4776 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4777 // here. How do we wish to handle such things?
4778 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004779
Daniel Dunbarc1964212009-03-26 16:23:12 +00004780 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004781 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004782 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004783 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004784
4785 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4786 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4787 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4788
4789 Arg *A;
4790 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4791 (A = Args.getLastArg(options::OPT_current__version)) ||
4792 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004793 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004794 << A->getAsString(Args) << "-dynamiclib";
4795
4796 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4797 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4798 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4799 } else {
4800 CmdArgs.push_back("-dylib");
4801
4802 Arg *A;
4803 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4804 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4805 (A = Args.getLastArg(options::OPT_client__name)) ||
4806 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4807 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4808 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004809 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004810 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004811
Daniel Dunbarc1964212009-03-26 16:23:12 +00004812 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4813 "-dylib_compatibility_version");
4814 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4815 "-dylib_current_version");
4816
Daniel Dunbara48823f2010-01-22 02:04:52 +00004817 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004818
4819 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4820 "-dylib_install_name");
4821 }
4822
4823 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4824 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4825 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover9c7e0352013-12-12 11:55:52 +00004826 if (DarwinTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004827 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004828 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4829 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4830 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4831 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4832 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4833 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004834 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004835 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4836 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4837 Args.AddAllArgs(CmdArgs, options::OPT_init);
4838
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004839 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004840 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004841
4842 // If we had an explicit -mios-simulator-version-min argument, honor that,
4843 // otherwise use the traditional deployment targets. We can't just check the
4844 // is-sim attribute because existing code follows this path, and the linker
4845 // may not handle the argument.
4846 //
4847 // FIXME: We may be able to remove this, once we can verify no one depends on
4848 // it.
Tim Northover9c7e0352013-12-12 11:55:52 +00004849 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004850 CmdArgs.push_back("-ios_simulator_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004851 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4852 } else if (DarwinTC.isTargetIOSBased()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004853 CmdArgs.push_back("-iphoneos_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004854 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4855 } else if (DarwinTC.isTargetMacOS()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004856 CmdArgs.push_back("-macosx_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004857 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4858 }
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004859
Daniel Dunbarc1964212009-03-26 16:23:12 +00004860 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4861 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4862 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4863 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4864 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004865
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004866 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4867 options::OPT_fno_pie,
4868 options::OPT_fno_PIE)) {
4869 if (A->getOption().matches(options::OPT_fpie) ||
4870 A->getOption().matches(options::OPT_fPIE))
4871 CmdArgs.push_back("-pie");
4872 else
4873 CmdArgs.push_back("-no_pie");
4874 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004875
4876 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4877 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4878 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4879 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4880 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4881 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4882 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4883 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4884 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4885 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4886 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4887 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4888 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4889 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4890 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4891 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004892
Daniel Dunbar84384642011-05-02 21:03:47 +00004893 // Give --sysroot= preference, over the Apple specific behavior to also use
4894 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004895 StringRef sysroot = C.getSysRoot();
4896 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004897 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004898 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004899 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4900 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004901 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004902 }
4903
Daniel Dunbarc1964212009-03-26 16:23:12 +00004904 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4905 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4906 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4907 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4908 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004909 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004910 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4911 Args.AddAllArgs(CmdArgs, options::OPT_y);
4912 Args.AddLastArg(CmdArgs, options::OPT_w);
4913 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4914 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4915 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4916 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4917 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4918 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4919 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4920 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4921 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4922 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4923 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4924 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4925}
4926
4927void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004928 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004929 const InputInfoList &Inputs,
4930 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004931 const char *LinkingOutput) const {
4932 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004933
Daniel Dunbarc1964212009-03-26 16:23:12 +00004934 // The logic here is derived from gcc's behavior; most of which
4935 // comes from specs (starting with link_command). Consult gcc for
4936 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004937 ArgStringList CmdArgs;
4938
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004939 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4940 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4941 options::OPT_ccc_arcmt_migrate)) {
4942 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4943 (*I)->claim();
4944 const char *Exec =
4945 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4946 CmdArgs.push_back(Output.getFilename());
4947 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4948 return;
4949 }
4950
Daniel Dunbarc1964212009-03-26 16:23:12 +00004951 // I'm not sure why this particular decomposition exists in gcc, but
4952 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004953 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004954
Daniel Dunbarc1964212009-03-26 16:23:12 +00004955 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4956 Args.AddAllArgs(CmdArgs, options::OPT_s);
4957 Args.AddAllArgs(CmdArgs, options::OPT_t);
4958 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4959 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004960 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004961 Args.AddAllArgs(CmdArgs, options::OPT_r);
4962
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004963 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4964 // members of static archive libraries which implement Objective-C classes or
4965 // categories.
4966 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4967 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004968
Daniel Dunbarc1964212009-03-26 16:23:12 +00004969 CmdArgs.push_back("-o");
4970 CmdArgs.push_back(Output.getFilename());
4971
Chad Rosier06fd3c62012-05-16 23:45:12 +00004972 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004973 !Args.hasArg(options::OPT_nostartfiles)) {
4974 // Derived from startfile spec.
4975 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004976 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004977 if (getDarwinToolChain().isTargetIOSSimulator()) {
4978 // The simulator doesn't have a versioned crt1 file.
4979 CmdArgs.push_back("-ldylib1.o");
4980 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004981 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4982 CmdArgs.push_back("-ldylib1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00004983 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004984 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004985 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004986 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004987 CmdArgs.push_back("-ldylib1.10.5.o");
4988 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004989 } else {
4990 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004991 if (!Args.hasArg(options::OPT_static)) {
4992 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004993 if (getDarwinToolChain().isTargetIOSSimulator()) {
4994 // The simulator doesn't have a versioned crt1 file.
4995 CmdArgs.push_back("-lbundle1.o");
4996 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004997 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4998 CmdArgs.push_back("-lbundle1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00004999 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005000 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005001 CmdArgs.push_back("-lbundle1.o");
5002 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005003 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005004 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00005005 if (Args.hasArg(options::OPT_pg) &&
5006 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00005007 if (Args.hasArg(options::OPT_static) ||
5008 Args.hasArg(options::OPT_object) ||
5009 Args.hasArg(options::OPT_preload)) {
5010 CmdArgs.push_back("-lgcrt0.o");
5011 } else {
5012 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005013
Daniel Dunbarc1964212009-03-26 16:23:12 +00005014 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005015 }
Bob Wilsonef285b42012-07-04 00:18:41 +00005016 // By default on OS X 10.8 and later, we don't link with a crt1.o
5017 // file and the linker knows to use _main as the entry point. But,
5018 // when compiling with -pg, we need to link with the gcrt1.o file,
5019 // so pass the -no_new_main option to tell the linker to use the
5020 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00005021 if (getDarwinToolChain().isTargetMacOS() &&
5022 !getDarwinToolChain().isMacosxVersionLT(10, 8))
5023 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005024 } else {
5025 if (Args.hasArg(options::OPT_static) ||
5026 Args.hasArg(options::OPT_object) ||
5027 Args.hasArg(options::OPT_preload)) {
5028 CmdArgs.push_back("-lcrt0.o");
5029 } else {
5030 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00005031 if (getDarwinToolChain().isTargetIOSSimulator()) {
5032 // The simulator doesn't have a versioned crt1 file.
5033 CmdArgs.push_back("-lcrt1.o");
5034 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005035 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5036 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005037 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00005038 CmdArgs.push_back("-lcrt1.3.1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005039 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005040 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
5041 CmdArgs.push_back("-lcrt1.o");
5042 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
5043 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005044 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005045 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005046
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005047 // darwin_crt2 spec is empty.
5048 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005049 }
5050 }
5051 }
5052 }
5053
Tim Northover9c7e0352013-12-12 11:55:52 +00005054 if (getDarwinToolChain().isTargetMacOS() &&
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005055 Args.hasArg(options::OPT_shared_libgcc) &&
5056 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005057 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005058 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005059 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005060 }
5061 }
5062
5063 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005064
Daniel Dunbarc1964212009-03-26 16:23:12 +00005065 if (Args.hasArg(options::OPT_fopenmp))
5066 // This is more complicated in gcc...
5067 CmdArgs.push_back("-lgomp");
5068
Douglas Gregor9295df02012-05-15 21:00:27 +00005069 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5070
Bob Wilson16d93952012-05-15 18:57:39 +00005071 if (isObjCRuntimeLinked(Args) &&
5072 !Args.hasArg(options::OPT_nostdlib) &&
5073 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005074 // Avoid linking compatibility stubs on i386 mac.
5075 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005076 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005077 // If we don't have ARC or subscripting runtime support, link in the
5078 // runtime stubs. We have to do this *before* adding any of the normal
5079 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00005080 ObjCRuntime runtime =
5081 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005082 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00005083 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00005084 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00005085 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005086 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005087 CmdArgs.push_back("-framework");
5088 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005089 // Link libobj.
5090 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005091 }
John McCall31168b02011-06-15 23:02:42 +00005092
Daniel Dunbarc1964212009-03-26 16:23:12 +00005093 if (LinkingOutput) {
5094 CmdArgs.push_back("-arch_multiple");
5095 CmdArgs.push_back("-final_output");
5096 CmdArgs.push_back(LinkingOutput);
5097 }
5098
Daniel Dunbarc1964212009-03-26 16:23:12 +00005099 if (Args.hasArg(options::OPT_fnested_functions))
5100 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005101
Daniel Dunbarc1964212009-03-26 16:23:12 +00005102 if (!Args.hasArg(options::OPT_nostdlib) &&
5103 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005104 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005105 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005106
Daniel Dunbarc1964212009-03-26 16:23:12 +00005107 // link_ssp spec is empty.
5108
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005109 // Let the tool chain choose which runtime library to link.
5110 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005111 }
5112
Chad Rosier06fd3c62012-05-16 23:45:12 +00005113 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005114 !Args.hasArg(options::OPT_nostartfiles)) {
5115 // endfile_spec is empty.
5116 }
5117
5118 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5119 Args.AddAllArgs(CmdArgs, options::OPT_F);
5120
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005121 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005122 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005123 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005124}
5125
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005126void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005127 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005128 const InputInfoList &Inputs,
5129 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005130 const char *LinkingOutput) const {
5131 ArgStringList CmdArgs;
5132
5133 CmdArgs.push_back("-create");
5134 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005135
5136 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005137 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005138
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005139 for (InputInfoList::const_iterator
5140 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5141 const InputInfo &II = *it;
5142 assert(II.isFilename() && "Unexpected lipo input.");
5143 CmdArgs.push_back(II.getFilename());
5144 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005145 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005146 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005147 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005148}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005149
Daniel Dunbar88299622010-06-04 18:28:36 +00005150void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005151 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005152 const InputInfoList &Inputs,
5153 const ArgList &Args,
5154 const char *LinkingOutput) const {
5155 ArgStringList CmdArgs;
5156
Daniel Dunbareb86b042011-05-09 17:23:16 +00005157 CmdArgs.push_back("-o");
5158 CmdArgs.push_back(Output.getFilename());
5159
Daniel Dunbar88299622010-06-04 18:28:36 +00005160 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5161 const InputInfo &Input = Inputs[0];
5162 assert(Input.isFilename() && "Unexpected dsymutil input.");
5163 CmdArgs.push_back(Input.getFilename());
5164
Daniel Dunbar88299622010-06-04 18:28:36 +00005165 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005166 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005167 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005168}
5169
Eric Christopher551ef452011-08-23 17:56:55 +00005170void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005171 const InputInfo &Output,
5172 const InputInfoList &Inputs,
5173 const ArgList &Args,
5174 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005175 ArgStringList CmdArgs;
5176 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005177 CmdArgs.push_back("--debug-info");
5178 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005179 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005180
5181 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5182 const InputInfo &Input = Inputs[0];
5183 assert(Input.isFilename() && "Unexpected verify input");
5184
5185 // Grabbing the output of the earlier dsymutil run.
5186 CmdArgs.push_back(Input.getFilename());
5187
5188 const char *Exec =
5189 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5190 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5191}
5192
David Chisnallf571cde2012-02-15 13:39:01 +00005193void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5194 const InputInfo &Output,
5195 const InputInfoList &Inputs,
5196 const ArgList &Args,
5197 const char *LinkingOutput) const {
5198 ArgStringList CmdArgs;
5199
5200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5201 options::OPT_Xassembler);
5202
5203 CmdArgs.push_back("-o");
5204 CmdArgs.push_back(Output.getFilename());
5205
5206 for (InputInfoList::const_iterator
5207 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5208 const InputInfo &II = *it;
5209 CmdArgs.push_back(II.getFilename());
5210 }
5211
5212 const char *Exec =
5213 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5214 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5215}
5216
5217
5218void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5219 const InputInfo &Output,
5220 const InputInfoList &Inputs,
5221 const ArgList &Args,
5222 const char *LinkingOutput) const {
5223 // FIXME: Find a real GCC, don't hard-code versions here
5224 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5225 const llvm::Triple &T = getToolChain().getTriple();
5226 std::string LibPath = "/usr/lib/";
5227 llvm::Triple::ArchType Arch = T.getArch();
5228 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005229 case llvm::Triple::x86:
5230 GCCLibPath +=
5231 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5232 break;
5233 case llvm::Triple::x86_64:
5234 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5235 GCCLibPath += "/4.5.2/amd64/";
5236 LibPath += "amd64/";
5237 break;
5238 default:
5239 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005240 }
5241
5242 ArgStringList CmdArgs;
5243
David Chisnall272a0712012-02-29 15:06:12 +00005244 // Demangle C++ names in errors
5245 CmdArgs.push_back("-C");
5246
David Chisnallf571cde2012-02-15 13:39:01 +00005247 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5248 (!Args.hasArg(options::OPT_shared))) {
5249 CmdArgs.push_back("-e");
5250 CmdArgs.push_back("_start");
5251 }
5252
5253 if (Args.hasArg(options::OPT_static)) {
5254 CmdArgs.push_back("-Bstatic");
5255 CmdArgs.push_back("-dn");
5256 } else {
5257 CmdArgs.push_back("-Bdynamic");
5258 if (Args.hasArg(options::OPT_shared)) {
5259 CmdArgs.push_back("-shared");
5260 } else {
5261 CmdArgs.push_back("--dynamic-linker");
5262 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5263 }
5264 }
5265
5266 if (Output.isFilename()) {
5267 CmdArgs.push_back("-o");
5268 CmdArgs.push_back(Output.getFilename());
5269 } else {
5270 assert(Output.isNothing() && "Invalid output.");
5271 }
5272
5273 if (!Args.hasArg(options::OPT_nostdlib) &&
5274 !Args.hasArg(options::OPT_nostartfiles)) {
5275 if (!Args.hasArg(options::OPT_shared)) {
5276 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5277 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005278 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005279 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5280 } else {
5281 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005282 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5283 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005284 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005285 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005286 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005287 }
5288
5289 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5290
5291 Args.AddAllArgs(CmdArgs, options::OPT_L);
5292 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5293 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005294 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005295
5296 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5297
5298 if (!Args.hasArg(options::OPT_nostdlib) &&
5299 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005300 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005301 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005302 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005303 if (!Args.hasArg(options::OPT_shared)) {
5304 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005305 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005306 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005307 }
David Chisnallf571cde2012-02-15 13:39:01 +00005308 }
5309
5310 if (!Args.hasArg(options::OPT_nostdlib) &&
5311 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005312 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005313 }
David Chisnall96de9932012-02-16 16:00:47 +00005314 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005315
5316 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5317
5318 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005319 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005320 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5321}
5322
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005323void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005324 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005325 const InputInfoList &Inputs,
5326 const ArgList &Args,
5327 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005328 ArgStringList CmdArgs;
5329
5330 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5331 options::OPT_Xassembler);
5332
5333 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005334 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005335
5336 for (InputInfoList::const_iterator
5337 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5338 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005339 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005340 }
5341
5342 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005343 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005344 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005345}
5346
5347void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005348 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005349 const InputInfoList &Inputs,
5350 const ArgList &Args,
5351 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005352 ArgStringList CmdArgs;
5353
5354 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005355 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005356 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005357 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005358 }
5359
5360 if (Args.hasArg(options::OPT_static)) {
5361 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005362 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005363 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005364// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005365 CmdArgs.push_back("-Bdynamic");
5366 if (Args.hasArg(options::OPT_shared)) {
5367 CmdArgs.push_back("-shared");
5368 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005369 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005370 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5371 }
5372 }
5373
Daniel Dunbarb440f562010-08-02 02:38:21 +00005374 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005375 CmdArgs.push_back("-o");
5376 CmdArgs.push_back(Output.getFilename());
5377 } else {
5378 assert(Output.isNothing() && "Invalid output.");
5379 }
5380
5381 if (!Args.hasArg(options::OPT_nostdlib) &&
5382 !Args.hasArg(options::OPT_nostartfiles)) {
5383 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005384 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005385 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005386 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005387 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005388 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005389 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005390 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005391 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005392 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005393 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005394 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005395 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005396 }
5397
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005398 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5399 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005400 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005401
5402 Args.AddAllArgs(CmdArgs, options::OPT_L);
5403 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5404 Args.AddAllArgs(CmdArgs, options::OPT_e);
5405
Daniel Dunbar54423b22010-09-17 00:24:54 +00005406 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005407
5408 if (!Args.hasArg(options::OPT_nostdlib) &&
5409 !Args.hasArg(options::OPT_nodefaultlibs)) {
5410 // FIXME: For some reason GCC passes -lgcc before adding
5411 // the default system libraries. Just mimic this for now.
5412 CmdArgs.push_back("-lgcc");
5413
5414 if (Args.hasArg(options::OPT_pthread))
5415 CmdArgs.push_back("-pthread");
5416 if (!Args.hasArg(options::OPT_shared))
5417 CmdArgs.push_back("-lc");
5418 CmdArgs.push_back("-lgcc");
5419 }
5420
5421 if (!Args.hasArg(options::OPT_nostdlib) &&
5422 !Args.hasArg(options::OPT_nostartfiles)) {
5423 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005424 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005425 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005426 }
5427
Bill Wendling08760582011-06-27 19:15:03 +00005428 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005429
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005430 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005431 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005432 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005433}
5434
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005435void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005436 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005437 const InputInfoList &Inputs,
5438 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005439 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005440 ArgStringList CmdArgs;
5441
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005442 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5443 // instruct as in the base system to assemble 32-bit code.
5444 if (getToolChain().getArch() == llvm::Triple::x86)
5445 CmdArgs.push_back("--32");
5446 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5447 CmdArgs.push_back("-mppc");
5448 CmdArgs.push_back("-many");
5449 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5450 getToolChain().getArch() == llvm::Triple::mips64el) {
5451 StringRef CPUName;
5452 StringRef ABIName;
5453 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5454
5455 CmdArgs.push_back("-mabi");
5456 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5457
5458 if (getToolChain().getArch() == llvm::Triple::mips64)
5459 CmdArgs.push_back("-EB");
5460 else
5461 CmdArgs.push_back("-EL");
5462
5463 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5464 options::OPT_fpic, options::OPT_fno_pic,
5465 options::OPT_fPIE, options::OPT_fno_PIE,
5466 options::OPT_fpie, options::OPT_fno_pie);
5467 if (LastPICArg &&
5468 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5469 LastPICArg->getOption().matches(options::OPT_fpic) ||
5470 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5471 LastPICArg->getOption().matches(options::OPT_fpie))) {
5472 CmdArgs.push_back("-KPIC");
5473 }
5474 }
5475
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005476 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5477 options::OPT_Xassembler);
5478
5479 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005480 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005481
5482 for (InputInfoList::const_iterator
5483 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5484 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005485 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005486 }
5487
5488 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005489 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005490 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005491}
5492
5493void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005494 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005495 const InputInfoList &Inputs,
5496 const ArgList &Args,
5497 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005498 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005499 ArgStringList CmdArgs;
5500
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005501 // Silence warning for "clang -g foo.o -o foo"
5502 Args.ClaimAllArgs(options::OPT_g_Group);
5503 // and "clang -emit-llvm foo.o -o foo"
5504 Args.ClaimAllArgs(options::OPT_emit_llvm);
5505 // and for "clang -w foo.o -o foo". Other warning options are already
5506 // handled somewhere else.
5507 Args.ClaimAllArgs(options::OPT_w);
5508
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005509 if (getToolChain().getArch() == llvm::Triple::mips64)
5510 CmdArgs.push_back("-EB");
5511 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5512 CmdArgs.push_back("-EL");
5513
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005514 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005515 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005516 CmdArgs.push_back("-e");
5517 CmdArgs.push_back("__start");
5518 }
5519
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005520 if (Args.hasArg(options::OPT_static)) {
5521 CmdArgs.push_back("-Bstatic");
5522 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005523 if (Args.hasArg(options::OPT_rdynamic))
5524 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005525 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005526 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005527 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005528 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005529 } else {
5530 CmdArgs.push_back("-dynamic-linker");
5531 CmdArgs.push_back("/usr/libexec/ld.so");
5532 }
5533 }
5534
Rafael Espindola044f7832013-06-05 04:28:55 +00005535 if (Args.hasArg(options::OPT_nopie))
5536 CmdArgs.push_back("-nopie");
5537
Daniel Dunbarb440f562010-08-02 02:38:21 +00005538 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005539 CmdArgs.push_back("-o");
5540 CmdArgs.push_back(Output.getFilename());
5541 } else {
5542 assert(Output.isNothing() && "Invalid output.");
5543 }
5544
5545 if (!Args.hasArg(options::OPT_nostdlib) &&
5546 !Args.hasArg(options::OPT_nostartfiles)) {
5547 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005548 if (Args.hasArg(options::OPT_pg))
5549 CmdArgs.push_back(Args.MakeArgString(
5550 getToolChain().GetFilePath("gcrt0.o")));
5551 else
5552 CmdArgs.push_back(Args.MakeArgString(
5553 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005554 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005555 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005556 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005557 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005558 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005559 }
5560 }
5561
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005562 std::string Triple = getToolChain().getTripleString();
5563 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005564 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005565 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005566 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005567
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005568 Args.AddAllArgs(CmdArgs, options::OPT_L);
5569 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5570 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005571 Args.AddAllArgs(CmdArgs, options::OPT_s);
5572 Args.AddAllArgs(CmdArgs, options::OPT_t);
5573 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5574 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005575
Daniel Dunbar54423b22010-09-17 00:24:54 +00005576 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005577
5578 if (!Args.hasArg(options::OPT_nostdlib) &&
5579 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005580 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005581 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005582 if (Args.hasArg(options::OPT_pg))
5583 CmdArgs.push_back("-lm_p");
5584 else
5585 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005586 }
5587
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005588 // FIXME: For some reason GCC passes -lgcc before adding
5589 // the default system libraries. Just mimic this for now.
5590 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005591
Eric Christopher17674ec2012-09-13 06:32:34 +00005592 if (Args.hasArg(options::OPT_pthread)) {
5593 if (!Args.hasArg(options::OPT_shared) &&
5594 Args.hasArg(options::OPT_pg))
5595 CmdArgs.push_back("-lpthread_p");
5596 else
5597 CmdArgs.push_back("-lpthread");
5598 }
5599
Chandler Carruth45661652011-12-17 22:32:42 +00005600 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005601 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005602 CmdArgs.push_back("-lc_p");
5603 else
5604 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005605 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005606
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005607 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005608 }
5609
5610 if (!Args.hasArg(options::OPT_nostdlib) &&
5611 !Args.hasArg(options::OPT_nostartfiles)) {
5612 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005613 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005614 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005615 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005616 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005617 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005618 }
5619
5620 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005621 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005622 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005623}
Ed Schoutene33194b2009-04-02 19:13:12 +00005624
Eli Friedman9fa28852012-08-08 23:57:20 +00005625void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5626 const InputInfo &Output,
5627 const InputInfoList &Inputs,
5628 const ArgList &Args,
5629 const char *LinkingOutput) const {
5630 ArgStringList CmdArgs;
5631
5632 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5633 options::OPT_Xassembler);
5634
5635 CmdArgs.push_back("-o");
5636 CmdArgs.push_back(Output.getFilename());
5637
5638 for (InputInfoList::const_iterator
5639 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5640 const InputInfo &II = *it;
5641 CmdArgs.push_back(II.getFilename());
5642 }
5643
5644 const char *Exec =
5645 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5646 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5647}
5648
5649void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5650 const InputInfo &Output,
5651 const InputInfoList &Inputs,
5652 const ArgList &Args,
5653 const char *LinkingOutput) const {
5654 const Driver &D = getToolChain().getDriver();
5655 ArgStringList CmdArgs;
5656
5657 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5658 (!Args.hasArg(options::OPT_shared))) {
5659 CmdArgs.push_back("-e");
5660 CmdArgs.push_back("__start");
5661 }
5662
5663 if (Args.hasArg(options::OPT_static)) {
5664 CmdArgs.push_back("-Bstatic");
5665 } else {
5666 if (Args.hasArg(options::OPT_rdynamic))
5667 CmdArgs.push_back("-export-dynamic");
5668 CmdArgs.push_back("--eh-frame-hdr");
5669 CmdArgs.push_back("-Bdynamic");
5670 if (Args.hasArg(options::OPT_shared)) {
5671 CmdArgs.push_back("-shared");
5672 } else {
5673 CmdArgs.push_back("-dynamic-linker");
5674 CmdArgs.push_back("/usr/libexec/ld.so");
5675 }
5676 }
5677
5678 if (Output.isFilename()) {
5679 CmdArgs.push_back("-o");
5680 CmdArgs.push_back(Output.getFilename());
5681 } else {
5682 assert(Output.isNothing() && "Invalid output.");
5683 }
5684
5685 if (!Args.hasArg(options::OPT_nostdlib) &&
5686 !Args.hasArg(options::OPT_nostartfiles)) {
5687 if (!Args.hasArg(options::OPT_shared)) {
5688 if (Args.hasArg(options::OPT_pg))
5689 CmdArgs.push_back(Args.MakeArgString(
5690 getToolChain().GetFilePath("gcrt0.o")));
5691 else
5692 CmdArgs.push_back(Args.MakeArgString(
5693 getToolChain().GetFilePath("crt0.o")));
5694 CmdArgs.push_back(Args.MakeArgString(
5695 getToolChain().GetFilePath("crtbegin.o")));
5696 } else {
5697 CmdArgs.push_back(Args.MakeArgString(
5698 getToolChain().GetFilePath("crtbeginS.o")));
5699 }
5700 }
5701
5702 Args.AddAllArgs(CmdArgs, options::OPT_L);
5703 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5704 Args.AddAllArgs(CmdArgs, options::OPT_e);
5705
5706 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5707
5708 if (!Args.hasArg(options::OPT_nostdlib) &&
5709 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005710 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005711 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5712 if (Args.hasArg(options::OPT_pg))
5713 CmdArgs.push_back("-lm_p");
5714 else
5715 CmdArgs.push_back("-lm");
5716 }
5717
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005718 if (Args.hasArg(options::OPT_pthread)) {
5719 if (!Args.hasArg(options::OPT_shared) &&
5720 Args.hasArg(options::OPT_pg))
5721 CmdArgs.push_back("-lpthread_p");
5722 else
5723 CmdArgs.push_back("-lpthread");
5724 }
5725
Eli Friedman9fa28852012-08-08 23:57:20 +00005726 if (!Args.hasArg(options::OPT_shared)) {
5727 if (Args.hasArg(options::OPT_pg))
5728 CmdArgs.push_back("-lc_p");
5729 else
5730 CmdArgs.push_back("-lc");
5731 }
5732
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005733 StringRef MyArch;
5734 switch (getToolChain().getTriple().getArch()) {
5735 case llvm::Triple::arm:
5736 MyArch = "arm";
5737 break;
5738 case llvm::Triple::x86:
5739 MyArch = "i386";
5740 break;
5741 case llvm::Triple::x86_64:
5742 MyArch = "amd64";
5743 break;
5744 default:
5745 llvm_unreachable("Unsupported architecture");
5746 }
5747 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005748 }
5749
5750 if (!Args.hasArg(options::OPT_nostdlib) &&
5751 !Args.hasArg(options::OPT_nostartfiles)) {
5752 if (!Args.hasArg(options::OPT_shared))
5753 CmdArgs.push_back(Args.MakeArgString(
5754 getToolChain().GetFilePath("crtend.o")));
5755 else
5756 CmdArgs.push_back(Args.MakeArgString(
5757 getToolChain().GetFilePath("crtendS.o")));
5758 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005759
5760 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005761 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005762 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005763}
5764
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005765void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005766 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005767 const InputInfoList &Inputs,
5768 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005769 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005770 ArgStringList CmdArgs;
5771
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005772 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5773 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005774 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005775 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005776 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005777 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005778 else if (getToolChain().getArch() == llvm::Triple::mips ||
5779 getToolChain().getArch() == llvm::Triple::mipsel ||
5780 getToolChain().getArch() == llvm::Triple::mips64 ||
5781 getToolChain().getArch() == llvm::Triple::mips64el) {
5782 StringRef CPUName;
5783 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005784 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005785
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005786 CmdArgs.push_back("-march");
5787 CmdArgs.push_back(CPUName.data());
5788
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005789 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005790 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005791
5792 if (getToolChain().getArch() == llvm::Triple::mips ||
5793 getToolChain().getArch() == llvm::Triple::mips64)
5794 CmdArgs.push_back("-EB");
5795 else
5796 CmdArgs.push_back("-EL");
5797
5798 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5799 options::OPT_fpic, options::OPT_fno_pic,
5800 options::OPT_fPIE, options::OPT_fno_PIE,
5801 options::OPT_fpie, options::OPT_fno_pie);
5802 if (LastPICArg &&
5803 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5804 LastPICArg->getOption().matches(options::OPT_fpic) ||
5805 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5806 LastPICArg->getOption().matches(options::OPT_fpie))) {
5807 CmdArgs.push_back("-KPIC");
5808 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005809 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5810 getToolChain().getArch() == llvm::Triple::thumb) {
5811 CmdArgs.push_back("-mfpu=softvfp");
5812 switch(getToolChain().getTriple().getEnvironment()) {
5813 case llvm::Triple::GNUEABI:
5814 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005815 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005816 break;
5817
5818 default:
5819 CmdArgs.push_back("-matpcs");
5820 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005821 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005822
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005823 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5824 options::OPT_Xassembler);
5825
5826 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005827 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005828
5829 for (InputInfoList::const_iterator
5830 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5831 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005832 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005833 }
5834
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005835 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005836 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005837 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005838}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005839
5840void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005841 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005842 const InputInfoList &Inputs,
5843 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005844 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005845 const toolchains::FreeBSD& ToolChain =
5846 static_cast<const toolchains::FreeBSD&>(getToolChain());
5847 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005848 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005849
5850 // Silence warning for "clang -g foo.o -o foo"
5851 Args.ClaimAllArgs(options::OPT_g_Group);
5852 // and "clang -emit-llvm foo.o -o foo"
5853 Args.ClaimAllArgs(options::OPT_emit_llvm);
5854 // and for "clang -w foo.o -o foo". Other warning options are already
5855 // handled somewhere else.
5856 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005857
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005858 if (!D.SysRoot.empty())
5859 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5860
Roman Divackyafe2f232012-08-28 15:09:03 +00005861 if (Args.hasArg(options::OPT_pie))
5862 CmdArgs.push_back("-pie");
5863
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005864 if (Args.hasArg(options::OPT_static)) {
5865 CmdArgs.push_back("-Bstatic");
5866 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005867 if (Args.hasArg(options::OPT_rdynamic))
5868 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005869 CmdArgs.push_back("--eh-frame-hdr");
5870 if (Args.hasArg(options::OPT_shared)) {
5871 CmdArgs.push_back("-Bshareable");
5872 } else {
5873 CmdArgs.push_back("-dynamic-linker");
5874 CmdArgs.push_back("/libexec/ld-elf.so.1");
5875 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005876 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5877 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005878 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5879 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5880 CmdArgs.push_back("--hash-style=both");
5881 }
5882 }
5883 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005884 }
5885
5886 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5887 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005888 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005889 CmdArgs.push_back("-m");
5890 CmdArgs.push_back("elf_i386_fbsd");
5891 }
5892
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005893 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005894 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005895 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005896 }
5897
Daniel Dunbarb440f562010-08-02 02:38:21 +00005898 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005899 CmdArgs.push_back("-o");
5900 CmdArgs.push_back(Output.getFilename());
5901 } else {
5902 assert(Output.isNothing() && "Invalid output.");
5903 }
5904
5905 if (!Args.hasArg(options::OPT_nostdlib) &&
5906 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005907 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005908 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005909 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005910 crt1 = "gcrt1.o";
5911 else if (Args.hasArg(options::OPT_pie))
5912 crt1 = "Scrt1.o";
5913 else
5914 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005915 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005916 if (crt1)
5917 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5918
5919 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5920
5921 const char *crtbegin = NULL;
5922 if (Args.hasArg(options::OPT_static))
5923 crtbegin = "crtbeginT.o";
5924 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5925 crtbegin = "crtbeginS.o";
5926 else
5927 crtbegin = "crtbegin.o";
5928
5929 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005930 }
5931
5932 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005933 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005934 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5935 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005936 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005937 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5938 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005939 Args.AddAllArgs(CmdArgs, options::OPT_s);
5940 Args.AddAllArgs(CmdArgs, options::OPT_t);
5941 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5942 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005943
Alp Tokerce365ca2013-12-02 12:43:03 +00005944 if (D.IsUsingLTO(Args))
5945 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00005946
Roman Divackyafe2f232012-08-28 15:09:03 +00005947 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005948
5949 if (!Args.hasArg(options::OPT_nostdlib) &&
5950 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005951 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005952 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005953 if (Args.hasArg(options::OPT_pg))
5954 CmdArgs.push_back("-lm_p");
5955 else
5956 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005957 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005958 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5959 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005960 if (Args.hasArg(options::OPT_pg))
5961 CmdArgs.push_back("-lgcc_p");
5962 else
5963 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005964 if (Args.hasArg(options::OPT_static)) {
5965 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005966 } else if (Args.hasArg(options::OPT_pg)) {
5967 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005968 } else {
5969 CmdArgs.push_back("--as-needed");
5970 CmdArgs.push_back("-lgcc_s");
5971 CmdArgs.push_back("--no-as-needed");
5972 }
5973
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005974 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005975 if (Args.hasArg(options::OPT_pg))
5976 CmdArgs.push_back("-lpthread_p");
5977 else
5978 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005979 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005980
Roman Divacky66f22762011-02-10 16:59:40 +00005981 if (Args.hasArg(options::OPT_pg)) {
5982 if (Args.hasArg(options::OPT_shared))
5983 CmdArgs.push_back("-lc");
5984 else
5985 CmdArgs.push_back("-lc_p");
5986 CmdArgs.push_back("-lgcc_p");
5987 } else {
5988 CmdArgs.push_back("-lc");
5989 CmdArgs.push_back("-lgcc");
5990 }
5991
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005992 if (Args.hasArg(options::OPT_static)) {
5993 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005994 } else if (Args.hasArg(options::OPT_pg)) {
5995 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005996 } else {
5997 CmdArgs.push_back("--as-needed");
5998 CmdArgs.push_back("-lgcc_s");
5999 CmdArgs.push_back("--no-as-needed");
6000 }
6001 }
6002
6003 if (!Args.hasArg(options::OPT_nostdlib) &&
6004 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00006005 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00006006 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006007 else
6008 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006009 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006010 }
6011
Roman Divackyafe2f232012-08-28 15:09:03 +00006012 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006013
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006014 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006015 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006016 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006017}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006018
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006019void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6020 const InputInfo &Output,
6021 const InputInfoList &Inputs,
6022 const ArgList &Args,
6023 const char *LinkingOutput) const {
6024 ArgStringList CmdArgs;
6025
6026 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6027 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006028 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006029 CmdArgs.push_back("--32");
6030
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006031 // Pass the target CPU to GNU as for ARM, since the source code might
6032 // not have the correct .cpu annotation.
6033 if (getToolChain().getArch() == llvm::Triple::arm) {
6034 std::string MArch(getARMTargetCPU(Args, getToolChain().getTriple()));
6035 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6036 }
6037
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006038 if (getToolChain().getArch() == llvm::Triple::mips ||
6039 getToolChain().getArch() == llvm::Triple::mipsel ||
6040 getToolChain().getArch() == llvm::Triple::mips64 ||
6041 getToolChain().getArch() == llvm::Triple::mips64el) {
6042 StringRef CPUName;
6043 StringRef ABIName;
6044 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6045
6046 CmdArgs.push_back("-march");
6047 CmdArgs.push_back(CPUName.data());
6048
6049 CmdArgs.push_back("-mabi");
6050 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6051
6052 if (getToolChain().getArch() == llvm::Triple::mips ||
6053 getToolChain().getArch() == llvm::Triple::mips64)
6054 CmdArgs.push_back("-EB");
6055 else
6056 CmdArgs.push_back("-EL");
6057
6058 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6059 options::OPT_fpic, options::OPT_fno_pic,
6060 options::OPT_fPIE, options::OPT_fno_PIE,
6061 options::OPT_fpie, options::OPT_fno_pie);
6062 if (LastPICArg &&
6063 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6064 LastPICArg->getOption().matches(options::OPT_fpic) ||
6065 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6066 LastPICArg->getOption().matches(options::OPT_fpie))) {
6067 CmdArgs.push_back("-KPIC");
6068 }
6069 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006070
6071 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6072 options::OPT_Xassembler);
6073
6074 CmdArgs.push_back("-o");
6075 CmdArgs.push_back(Output.getFilename());
6076
6077 for (InputInfoList::const_iterator
6078 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6079 const InputInfo &II = *it;
6080 CmdArgs.push_back(II.getFilename());
6081 }
6082
David Chisnallddbd68f2011-09-27 22:03:18 +00006083 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006084 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6085}
6086
6087void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6088 const InputInfo &Output,
6089 const InputInfoList &Inputs,
6090 const ArgList &Args,
6091 const char *LinkingOutput) const {
6092 const Driver &D = getToolChain().getDriver();
6093 ArgStringList CmdArgs;
6094
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006095 if (!D.SysRoot.empty())
6096 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6097
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006098 if (Args.hasArg(options::OPT_static)) {
6099 CmdArgs.push_back("-Bstatic");
6100 } else {
6101 if (Args.hasArg(options::OPT_rdynamic))
6102 CmdArgs.push_back("-export-dynamic");
6103 CmdArgs.push_back("--eh-frame-hdr");
6104 if (Args.hasArg(options::OPT_shared)) {
6105 CmdArgs.push_back("-Bshareable");
6106 } else {
6107 CmdArgs.push_back("-dynamic-linker");
6108 CmdArgs.push_back("/libexec/ld.elf_so");
6109 }
6110 }
6111
6112 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6113 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006114 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006115 CmdArgs.push_back("-m");
6116 CmdArgs.push_back("elf_i386");
6117 }
6118
6119 if (Output.isFilename()) {
6120 CmdArgs.push_back("-o");
6121 CmdArgs.push_back(Output.getFilename());
6122 } else {
6123 assert(Output.isNothing() && "Invalid output.");
6124 }
6125
6126 if (!Args.hasArg(options::OPT_nostdlib) &&
6127 !Args.hasArg(options::OPT_nostartfiles)) {
6128 if (!Args.hasArg(options::OPT_shared)) {
6129 CmdArgs.push_back(Args.MakeArgString(
6130 getToolChain().GetFilePath("crt0.o")));
6131 CmdArgs.push_back(Args.MakeArgString(
6132 getToolChain().GetFilePath("crti.o")));
6133 CmdArgs.push_back(Args.MakeArgString(
6134 getToolChain().GetFilePath("crtbegin.o")));
6135 } else {
6136 CmdArgs.push_back(Args.MakeArgString(
6137 getToolChain().GetFilePath("crti.o")));
6138 CmdArgs.push_back(Args.MakeArgString(
6139 getToolChain().GetFilePath("crtbeginS.o")));
6140 }
6141 }
6142
6143 Args.AddAllArgs(CmdArgs, options::OPT_L);
6144 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6145 Args.AddAllArgs(CmdArgs, options::OPT_e);
6146 Args.AddAllArgs(CmdArgs, options::OPT_s);
6147 Args.AddAllArgs(CmdArgs, options::OPT_t);
6148 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6149 Args.AddAllArgs(CmdArgs, options::OPT_r);
6150
6151 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6152
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006153 unsigned Major, Minor, Micro;
6154 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6155 bool useLibgcc = true;
6156 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
6157 if (getToolChain().getArch() == llvm::Triple::x86 ||
6158 getToolChain().getArch() == llvm::Triple::x86_64)
6159 useLibgcc = false;
6160 }
6161
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006162 if (!Args.hasArg(options::OPT_nostdlib) &&
6163 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006164 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006165 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6166 CmdArgs.push_back("-lm");
6167 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006168 if (Args.hasArg(options::OPT_pthread))
6169 CmdArgs.push_back("-lpthread");
6170 CmdArgs.push_back("-lc");
6171
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006172 if (useLibgcc) {
6173 if (Args.hasArg(options::OPT_static)) {
6174 // libgcc_eh depends on libc, so resolve as much as possible,
6175 // pull in any new requirements from libc and then get the rest
6176 // of libgcc.
6177 CmdArgs.push_back("-lgcc_eh");
6178 CmdArgs.push_back("-lc");
6179 CmdArgs.push_back("-lgcc");
6180 } else {
6181 CmdArgs.push_back("-lgcc");
6182 CmdArgs.push_back("--as-needed");
6183 CmdArgs.push_back("-lgcc_s");
6184 CmdArgs.push_back("--no-as-needed");
6185 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006186 }
6187 }
6188
6189 if (!Args.hasArg(options::OPT_nostdlib) &&
6190 !Args.hasArg(options::OPT_nostartfiles)) {
6191 if (!Args.hasArg(options::OPT_shared))
6192 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6193 "crtend.o")));
6194 else
6195 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6196 "crtendS.o")));
6197 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6198 "crtn.o")));
6199 }
6200
Bill Wendling08760582011-06-27 19:15:03 +00006201 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006202
Rafael Espindola236db462013-11-09 20:07:19 +00006203 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006204 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6205}
6206
Thomas Schwinge4e555262013-03-28 19:04:25 +00006207void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6208 const InputInfo &Output,
6209 const InputInfoList &Inputs,
6210 const ArgList &Args,
6211 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006212 ArgStringList CmdArgs;
6213
6214 // Add --32/--64 to make sure we get the format we want.
6215 // This is incomplete
6216 if (getToolChain().getArch() == llvm::Triple::x86) {
6217 CmdArgs.push_back("--32");
6218 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6219 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006220 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6221 CmdArgs.push_back("-a32");
6222 CmdArgs.push_back("-mppc");
6223 CmdArgs.push_back("-many");
6224 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6225 CmdArgs.push_back("-a64");
6226 CmdArgs.push_back("-mppc64");
6227 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006228 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6229 CmdArgs.push_back("-a64");
6230 CmdArgs.push_back("-mppc64le");
6231 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00006232 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006233 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006234 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6235 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006236 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6237 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006238
Tim Northover9c7e0352013-12-12 11:55:52 +00006239 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6240 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006241 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006242
6243 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006244
6245 // FIXME: remove krait check when GNU tools support krait cpu
6246 // for now replace it with -march=armv7-a to avoid a lower
6247 // march from being picked in the absence of a cpu flag.
6248 Arg *A;
6249 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6250 StringRef(A->getValue()) == "krait")
6251 CmdArgs.push_back("-march=armv7-a");
6252 else
6253 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006254 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006255 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6256 getToolChain().getArch() == llvm::Triple::mipsel ||
6257 getToolChain().getArch() == llvm::Triple::mips64 ||
6258 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006259 StringRef CPUName;
6260 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006261 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006262
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006263 CmdArgs.push_back("-march");
6264 CmdArgs.push_back(CPUName.data());
6265
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006266 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006267 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006268
6269 if (getToolChain().getArch() == llvm::Triple::mips ||
6270 getToolChain().getArch() == llvm::Triple::mips64)
6271 CmdArgs.push_back("-EB");
6272 else
6273 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006274
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006275 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6276 if (StringRef(A->getValue()) == "2008")
6277 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6278 }
6279
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006280 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006281 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6282 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6283 options::OPT_mno_micromips);
6284 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6285 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6286
Simon Atanasyanbd986632013-11-26 11:58:04 +00006287 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6288 // Do not use AddLastArg because not all versions of MIPS assembler
6289 // support -mmsa / -mno-msa options.
6290 if (A->getOption().matches(options::OPT_mmsa))
6291 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6292 }
6293
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006294 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6295 options::OPT_fpic, options::OPT_fno_pic,
6296 options::OPT_fPIE, options::OPT_fno_PIE,
6297 options::OPT_fpie, options::OPT_fno_pie);
6298 if (LastPICArg &&
6299 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6300 LastPICArg->getOption().matches(options::OPT_fpic) ||
6301 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6302 LastPICArg->getOption().matches(options::OPT_fpie))) {
6303 CmdArgs.push_back("-KPIC");
6304 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006305 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006306 // Always pass an -march option, since our default of z10 is later
6307 // than the GNU assembler's default.
6308 StringRef CPUName = getSystemZTargetCPU(Args);
6309 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006310 }
6311
6312 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6313 options::OPT_Xassembler);
6314
6315 CmdArgs.push_back("-o");
6316 CmdArgs.push_back(Output.getFilename());
6317
6318 for (InputInfoList::const_iterator
6319 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6320 const InputInfo &II = *it;
6321 CmdArgs.push_back(II.getFilename());
6322 }
6323
6324 const char *Exec =
6325 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6326 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006327
6328 // Handle the debug info splitting at object creation time if we're
6329 // creating an object.
6330 // TODO: Currently only works on linux with newer objcopy.
6331 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006332 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006333 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6334 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006335}
6336
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006337static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6338 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006339 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006340 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6341 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006342 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006343 CmdArgs.push_back("-lgcc");
6344
Logan Chien3d3373c2012-11-19 12:04:11 +00006345 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006346 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006347 CmdArgs.push_back("-lgcc");
6348 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006349 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006350 CmdArgs.push_back("--as-needed");
6351 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006352 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006353 CmdArgs.push_back("--no-as-needed");
6354 }
6355
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006356 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006357 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006358 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006359 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006360
6361 // According to Android ABI, we have to link with libdl if we are
6362 // linking with non-static libgcc.
6363 //
6364 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6365 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6366 if (isAndroid && !StaticLibgcc)
6367 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006368}
6369
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006370static bool hasMipsN32ABIArg(const ArgList &Args) {
6371 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006372 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006373}
6374
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006375static StringRef getLinuxDynamicLinker(const ArgList &Args,
6376 const toolchains::Linux &ToolChain) {
6377 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6378 return "/system/bin/linker";
6379 else if (ToolChain.getArch() == llvm::Triple::x86)
6380 return "/lib/ld-linux.so.2";
6381 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6382 return "/lib/ld-linux-aarch64.so.1";
6383 else if (ToolChain.getArch() == llvm::Triple::arm ||
6384 ToolChain.getArch() == llvm::Triple::thumb) {
6385 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6386 return "/lib/ld-linux-armhf.so.3";
6387 else
6388 return "/lib/ld-linux.so.3";
6389 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6390 ToolChain.getArch() == llvm::Triple::mipsel)
6391 return "/lib/ld.so.1";
6392 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6393 ToolChain.getArch() == llvm::Triple::mips64el) {
6394 if (hasMipsN32ABIArg(Args))
6395 return "/lib32/ld.so.1";
6396 else
6397 return "/lib64/ld.so.1";
6398 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6399 return "/lib/ld.so.1";
6400 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006401 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006402 ToolChain.getArch() == llvm::Triple::systemz)
6403 return "/lib64/ld64.so.1";
6404 else
6405 return "/lib64/ld-linux-x86-64.so.2";
6406}
6407
Thomas Schwinge4e555262013-03-28 19:04:25 +00006408void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6409 const InputInfo &Output,
6410 const InputInfoList &Inputs,
6411 const ArgList &Args,
6412 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006413 const toolchains::Linux& ToolChain =
6414 static_cast<const toolchains::Linux&>(getToolChain());
6415 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006416 const bool isAndroid =
6417 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006418 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006419 const bool IsPIE =
6420 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006421 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006422
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006423 ArgStringList CmdArgs;
6424
Rafael Espindolad1002f62010-11-15 18:28:16 +00006425 // Silence warning for "clang -g foo.o -o foo"
6426 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006427 // and "clang -emit-llvm foo.o -o foo"
6428 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006429 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006430 // handled somewhere else.
6431 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006432
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006433 if (!D.SysRoot.empty())
6434 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006435
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006436 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006437 CmdArgs.push_back("-pie");
6438
Rafael Espindola1c76c592010-11-07 22:57:16 +00006439 if (Args.hasArg(options::OPT_rdynamic))
6440 CmdArgs.push_back("-export-dynamic");
6441
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006442 if (Args.hasArg(options::OPT_s))
6443 CmdArgs.push_back("-s");
6444
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006445 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6446 e = ToolChain.ExtraOpts.end();
6447 i != e; ++i)
6448 CmdArgs.push_back(i->c_str());
6449
6450 if (!Args.hasArg(options::OPT_static)) {
6451 CmdArgs.push_back("--eh-frame-hdr");
6452 }
6453
6454 CmdArgs.push_back("-m");
6455 if (ToolChain.getArch() == llvm::Triple::x86)
6456 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006457 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6458 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006459 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006460 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006461 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006462 else if (ToolChain.getArch() == llvm::Triple::ppc)
6463 CmdArgs.push_back("elf32ppclinux");
6464 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6465 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006466 else if (ToolChain.getArch() == llvm::Triple::mips)
6467 CmdArgs.push_back("elf32btsmip");
6468 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6469 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006470 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6471 if (hasMipsN32ABIArg(Args))
6472 CmdArgs.push_back("elf32btsmipn32");
6473 else
6474 CmdArgs.push_back("elf64btsmip");
6475 }
6476 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6477 if (hasMipsN32ABIArg(Args))
6478 CmdArgs.push_back("elf32ltsmipn32");
6479 else
6480 CmdArgs.push_back("elf64ltsmip");
6481 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006482 else if (ToolChain.getArch() == llvm::Triple::systemz)
6483 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006484 else
6485 CmdArgs.push_back("elf_x86_64");
6486
6487 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006488 if (ToolChain.getArch() == llvm::Triple::arm
6489 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006490 CmdArgs.push_back("-Bstatic");
6491 else
6492 CmdArgs.push_back("-static");
6493 } else if (Args.hasArg(options::OPT_shared)) {
6494 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006495 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006496 CmdArgs.push_back("-Bsymbolic");
6497 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006498 }
6499
6500 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006501 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006502 (!Args.hasArg(options::OPT_static) &&
6503 !Args.hasArg(options::OPT_shared))) {
6504 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006505 CmdArgs.push_back(Args.MakeArgString(
6506 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006507 }
6508
6509 CmdArgs.push_back("-o");
6510 CmdArgs.push_back(Output.getFilename());
6511
Rafael Espindola81937ec2010-12-01 01:52:43 +00006512 if (!Args.hasArg(options::OPT_nostdlib) &&
6513 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006514 if (!isAndroid) {
6515 const char *crt1 = NULL;
6516 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006517 if (Args.hasArg(options::OPT_pg))
6518 crt1 = "gcrt1.o";
6519 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006520 crt1 = "Scrt1.o";
6521 else
6522 crt1 = "crt1.o";
6523 }
6524 if (crt1)
6525 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006526
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006527 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6528 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006529
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006530 const char *crtbegin;
6531 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006532 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006533 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006534 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006535 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006536 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006537 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006538 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006539 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006540
6541 // Add crtfastmath.o if available and fast math is enabled.
6542 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006543 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006544
6545 Args.AddAllArgs(CmdArgs, options::OPT_L);
6546
6547 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6548
Roman Divackyee8188a2011-03-01 17:53:14 +00006549 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6550 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006551 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006552
Alp Tokerce365ca2013-12-02 12:43:03 +00006553 if (D.IsUsingLTO(Args))
6554 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006555
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006556 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6557 CmdArgs.push_back("--no-demangle");
6558
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006559 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6560
Eric Christopher04997782012-11-29 18:51:05 +00006561 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006562 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006563 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006564 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006565 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006566 if (Sanitize.needsAsanRt())
6567 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6568 if (Sanitize.needsTsanRt())
6569 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006570 if (Sanitize.needsMsanRt())
6571 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006572 if (Sanitize.needsLsanRt())
6573 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006574 if (Sanitize.needsDfsanRt())
6575 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006576
Chandler Carruthe4458b32013-06-24 09:38:45 +00006577 // The profile runtime also needs access to system libraries.
6578 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6579
Hans Wennborg70850d82013-07-18 20:29:38 +00006580 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006581 !Args.hasArg(options::OPT_nostdlib) &&
6582 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006583 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6584 !Args.hasArg(options::OPT_static);
6585 if (OnlyLibstdcxxStatic)
6586 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006587 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006588 if (OnlyLibstdcxxStatic)
6589 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006590 CmdArgs.push_back("-lm");
6591 }
6592
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006593 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006594 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6595 if (Args.hasArg(options::OPT_static))
6596 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006597
Chandler Carruth01538002013-01-17 13:19:29 +00006598 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6599 if (OpenMP) {
6600 CmdArgs.push_back("-lgomp");
6601
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006602 // FIXME: Exclude this for platforms with libgomp that don't require
6603 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006604 CmdArgs.push_back("-lrt");
6605 }
6606
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006607 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006608
Chandler Carruth94a32012012-05-14 18:31:18 +00006609 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006610 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006611 CmdArgs.push_back("-lpthread");
6612
6613 CmdArgs.push_back("-lc");
6614
6615 if (Args.hasArg(options::OPT_static))
6616 CmdArgs.push_back("--end-group");
6617 else
6618 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6619 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006620
Rafael Espindola81937ec2010-12-01 01:52:43 +00006621 if (!Args.hasArg(options::OPT_nostartfiles)) {
6622 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006623 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006624 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006625 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006626 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006627 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006628 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006629
Rafael Espindola81937ec2010-12-01 01:52:43 +00006630 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006631 if (!isAndroid)
6632 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006633 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006634 }
6635
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006636 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6637}
Rafael Espindola92b00932010-08-10 00:25:48 +00006638
Chris Lattner3e2ee142010-07-07 16:01:42 +00006639void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006640 const InputInfo &Output,
6641 const InputInfoList &Inputs,
6642 const ArgList &Args,
6643 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006644 ArgStringList CmdArgs;
6645
6646 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6647 options::OPT_Xassembler);
6648
6649 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006650 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006651
6652 for (InputInfoList::const_iterator
6653 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6654 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006655 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006656 }
6657
6658 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006659 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006660 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006661}
6662
6663void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006664 const InputInfo &Output,
6665 const InputInfoList &Inputs,
6666 const ArgList &Args,
6667 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006668 const Driver &D = getToolChain().getDriver();
6669 ArgStringList CmdArgs;
6670
Daniel Dunbarb440f562010-08-02 02:38:21 +00006671 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006672 CmdArgs.push_back("-o");
6673 CmdArgs.push_back(Output.getFilename());
6674 } else {
6675 assert(Output.isNothing() && "Invalid output.");
6676 }
6677
6678 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006679 !Args.hasArg(options::OPT_nostartfiles)) {
6680 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6681 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6682 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6683 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6684 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006685
6686 Args.AddAllArgs(CmdArgs, options::OPT_L);
6687 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6688 Args.AddAllArgs(CmdArgs, options::OPT_e);
6689
Daniel Dunbar54423b22010-09-17 00:24:54 +00006690 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006691
Eli Friedman83de5132011-12-08 23:54:21 +00006692 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6693
Chris Lattner3e2ee142010-07-07 16:01:42 +00006694 if (!Args.hasArg(options::OPT_nostdlib) &&
6695 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006696 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006697 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006698 CmdArgs.push_back("-lm");
6699 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006700 }
6701
6702 if (!Args.hasArg(options::OPT_nostdlib) &&
6703 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006704 if (Args.hasArg(options::OPT_pthread))
6705 CmdArgs.push_back("-lpthread");
6706 CmdArgs.push_back("-lc");
6707 CmdArgs.push_back("-lCompilerRT-Generic");
6708 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6709 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006710 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006711 }
6712
Rafael Espindola236db462013-11-09 20:07:19 +00006713 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006714 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006715}
6716
Daniel Dunbarcc912342009-05-02 18:28:39 +00006717/// DragonFly Tools
6718
6719// For now, DragonFly Assemble does just about the same as for
6720// FreeBSD, but this may change soon.
6721void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006722 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006723 const InputInfoList &Inputs,
6724 const ArgList &Args,
6725 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006726 ArgStringList CmdArgs;
6727
6728 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6729 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006730 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006731 CmdArgs.push_back("--32");
6732
6733 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6734 options::OPT_Xassembler);
6735
6736 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006737 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006738
6739 for (InputInfoList::const_iterator
6740 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6741 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006742 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006743 }
6744
6745 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006746 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006747 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006748}
6749
6750void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006751 const InputInfo &Output,
6752 const InputInfoList &Inputs,
6753 const ArgList &Args,
6754 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006755 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006756 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006757 ArgStringList CmdArgs;
6758
John McCall65b8da02013-04-11 22:55:55 +00006759 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6760 UseGCC47 = false;
6761
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006762 if (!D.SysRoot.empty())
6763 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6764
John McCall65b8da02013-04-11 22:55:55 +00006765 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006766 if (Args.hasArg(options::OPT_static)) {
6767 CmdArgs.push_back("-Bstatic");
6768 } else {
John McCall65b8da02013-04-11 22:55:55 +00006769 if (Args.hasArg(options::OPT_rdynamic))
6770 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006771 if (Args.hasArg(options::OPT_shared))
6772 CmdArgs.push_back("-Bshareable");
6773 else {
6774 CmdArgs.push_back("-dynamic-linker");
6775 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6776 }
John McCall65b8da02013-04-11 22:55:55 +00006777 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006778 }
6779
6780 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6781 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006782 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006783 CmdArgs.push_back("-m");
6784 CmdArgs.push_back("elf_i386");
6785 }
6786
Daniel Dunbarb440f562010-08-02 02:38:21 +00006787 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006788 CmdArgs.push_back("-o");
6789 CmdArgs.push_back(Output.getFilename());
6790 } else {
6791 assert(Output.isNothing() && "Invalid output.");
6792 }
6793
6794 if (!Args.hasArg(options::OPT_nostdlib) &&
6795 !Args.hasArg(options::OPT_nostartfiles)) {
6796 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006797 if (Args.hasArg(options::OPT_pg))
6798 CmdArgs.push_back(Args.MakeArgString(
6799 getToolChain().GetFilePath("gcrt1.o")));
6800 else {
6801 if (Args.hasArg(options::OPT_pie))
6802 CmdArgs.push_back(Args.MakeArgString(
6803 getToolChain().GetFilePath("Scrt1.o")));
6804 else
6805 CmdArgs.push_back(Args.MakeArgString(
6806 getToolChain().GetFilePath("crt1.o")));
6807 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006808 }
John McCall65b8da02013-04-11 22:55:55 +00006809 CmdArgs.push_back(Args.MakeArgString(
6810 getToolChain().GetFilePath("crti.o")));
6811 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6812 CmdArgs.push_back(Args.MakeArgString(
6813 getToolChain().GetFilePath("crtbeginS.o")));
6814 else
6815 CmdArgs.push_back(Args.MakeArgString(
6816 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006817 }
6818
6819 Args.AddAllArgs(CmdArgs, options::OPT_L);
6820 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6821 Args.AddAllArgs(CmdArgs, options::OPT_e);
6822
Daniel Dunbar54423b22010-09-17 00:24:54 +00006823 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006824
6825 if (!Args.hasArg(options::OPT_nostdlib) &&
6826 !Args.hasArg(options::OPT_nodefaultlibs)) {
6827 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6828 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006829 if (UseGCC47)
6830 CmdArgs.push_back("-L/usr/lib/gcc47");
6831 else
6832 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006833
6834 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006835 if (UseGCC47) {
6836 CmdArgs.push_back("-rpath");
6837 CmdArgs.push_back("/usr/lib/gcc47");
6838 } else {
6839 CmdArgs.push_back("-rpath");
6840 CmdArgs.push_back("/usr/lib/gcc44");
6841 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006842 }
6843
Hans Wennborg70850d82013-07-18 20:29:38 +00006844 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006845 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006846 CmdArgs.push_back("-lm");
6847 }
6848
Daniel Dunbarcc912342009-05-02 18:28:39 +00006849 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006850 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006851
6852 if (!Args.hasArg(options::OPT_nolibc)) {
6853 CmdArgs.push_back("-lc");
6854 }
6855
John McCall65b8da02013-04-11 22:55:55 +00006856 if (UseGCC47) {
6857 if (Args.hasArg(options::OPT_static) ||
6858 Args.hasArg(options::OPT_static_libgcc)) {
6859 CmdArgs.push_back("-lgcc");
6860 CmdArgs.push_back("-lgcc_eh");
6861 } else {
6862 if (Args.hasArg(options::OPT_shared_libgcc)) {
6863 CmdArgs.push_back("-lgcc_pic");
6864 if (!Args.hasArg(options::OPT_shared))
6865 CmdArgs.push_back("-lgcc");
6866 } else {
6867 CmdArgs.push_back("-lgcc");
6868 CmdArgs.push_back("--as-needed");
6869 CmdArgs.push_back("-lgcc_pic");
6870 CmdArgs.push_back("--no-as-needed");
6871 }
6872 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006873 } else {
John McCall65b8da02013-04-11 22:55:55 +00006874 if (Args.hasArg(options::OPT_shared)) {
6875 CmdArgs.push_back("-lgcc_pic");
6876 } else {
6877 CmdArgs.push_back("-lgcc");
6878 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006879 }
6880 }
6881
6882 if (!Args.hasArg(options::OPT_nostdlib) &&
6883 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006884 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006885 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006886 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006887 else
6888 CmdArgs.push_back(Args.MakeArgString(
6889 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006890 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006891 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006892 }
6893
Bill Wendling08760582011-06-27 19:15:03 +00006894 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006895
Daniel Dunbarcc912342009-05-02 18:28:39 +00006896 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006897 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006898 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006899}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006900
6901void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6902 const InputInfo &Output,
6903 const InputInfoList &Inputs,
6904 const ArgList &Args,
6905 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006906 ArgStringList CmdArgs;
6907
6908 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006909 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6910 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006911 } else {
6912 assert(Output.isNothing() && "Invalid output.");
6913 }
6914
6915 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006916 !Args.hasArg(options::OPT_nostartfiles) &&
6917 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006918 CmdArgs.push_back("-defaultlib:libcmt");
6919 }
6920
6921 CmdArgs.push_back("-nologo");
6922
Hans Wennborgf1a74252013-09-10 20:18:04 +00006923 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6924
6925 if (DLL) {
6926 CmdArgs.push_back(Args.MakeArgString("-dll"));
6927
6928 SmallString<128> ImplibName(Output.getFilename());
6929 llvm::sys::path::replace_extension(ImplibName, "lib");
6930 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6931 ImplibName.str()));
6932 }
6933
Peter Collingbourne32701642013-11-01 18:16:25 +00006934 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006935 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006936 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006937 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006938 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6939 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006940 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006941 } else {
6942 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6943 }
6944 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006945 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6946 }
6947
Michael J. Spencere2f49362012-06-18 16:56:04 +00006948 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006949 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006950
6951 // Add filenames immediately.
6952 for (InputInfoList::const_iterator
6953 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6954 if (it->isFilename())
6955 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006956 else
6957 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006958 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006959
6960 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006961 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006962 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6963}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006964
6965void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6966 const InputInfo &Output,
6967 const InputInfoList &Inputs,
6968 const ArgList &Args,
6969 const char *LinkingOutput) const {
6970 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6971}
6972
Hans Wennborg188382e2013-09-20 18:16:35 +00006973// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6974// If one cannot be found, return FallbackName.
6975// We do this special search to prevent clang-cl from falling back onto itself
6976// if it's available as cl.exe on the path.
6977static std::string FindFallback(const char *FallbackName,
6978 const char *ClangProgramPath) {
6979 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6980 if (!OptPath.hasValue())
6981 return FallbackName;
6982
6983#ifdef LLVM_ON_WIN32
6984 const StringRef PathSeparators = ";";
6985#else
6986 const StringRef PathSeparators = ":";
6987#endif
6988
6989 SmallVector<StringRef, 8> PathSegments;
6990 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6991
6992 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6993 const StringRef &PathSegment = PathSegments[i];
6994 if (PathSegment.empty())
6995 continue;
6996
6997 SmallString<128> FilePath(PathSegment);
6998 llvm::sys::path::append(FilePath, FallbackName);
6999 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7000 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7001 return FilePath.str();
7002 }
7003
7004 return FallbackName;
7005}
7006
Hans Wennborg87cfa712013-09-19 20:32:16 +00007007Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7008 const InputInfo &Output,
7009 const InputInfoList &Inputs,
7010 const ArgList &Args,
7011 const char *LinkingOutput) const {
7012 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007013 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007014 CmdArgs.push_back("/c"); // Compile only.
7015 CmdArgs.push_back("/W0"); // No warnings.
7016
7017 // The goal is to be able to invoke this tool correctly based on
7018 // any flag accepted by clang-cl.
7019
7020 // These are spelled the same way in clang and cl.exe,.
7021 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7022 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007023
7024 // Optimization level.
7025 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7026 if (A->getOption().getID() == options::OPT_O0) {
7027 CmdArgs.push_back("/Od");
7028 } else {
7029 StringRef OptLevel = A->getValue();
7030 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7031 A->render(Args, CmdArgs);
7032 else if (OptLevel == "3")
7033 CmdArgs.push_back("/Ox");
7034 }
7035 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007036
7037 // Flags for which clang-cl have an alias.
7038 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7039
7040 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7041 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7042 : "/GR-");
7043 if (Args.hasArg(options::OPT_fsyntax_only))
7044 CmdArgs.push_back("/Zs");
7045
Hans Wennborg260ff402013-09-27 17:54:18 +00007046 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7047 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7048 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7049
Hans Wennborg87cfa712013-09-19 20:32:16 +00007050 // Flags that can simply be passed through.
7051 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7052 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7053
7054 // The order of these flags is relevant, so pick the last one.
7055 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7056 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7057 A->render(Args, CmdArgs);
7058
7059
7060 // Input filename.
7061 assert(Inputs.size() == 1);
7062 const InputInfo &II = Inputs[0];
7063 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7064 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7065 if (II.isFilename())
7066 CmdArgs.push_back(II.getFilename());
7067 else
7068 II.getInputArg().renderAsInput(Args, CmdArgs);
7069
7070 // Output filename.
7071 assert(Output.getType() == types::TY_Object);
7072 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7073 Output.getFilename());
7074 CmdArgs.push_back(Fo);
7075
Hans Wennborg188382e2013-09-20 18:16:35 +00007076 const Driver &D = getToolChain().getDriver();
7077 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007078
Hans Wennborg188382e2013-09-20 18:16:35 +00007079 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007080}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007081
7082
7083/// XCore Tools
7084// We pass assemble and link construction to the xcc tool.
7085
7086void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7087 const InputInfo &Output,
7088 const InputInfoList &Inputs,
7089 const ArgList &Args,
7090 const char *LinkingOutput) const {
7091 ArgStringList CmdArgs;
7092
7093 CmdArgs.push_back("-o");
7094 CmdArgs.push_back(Output.getFilename());
7095
7096 CmdArgs.push_back("-c");
7097
7098 if (Args.hasArg(options::OPT_g_Group)) {
7099 CmdArgs.push_back("-g");
7100 }
7101
7102 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7103 options::OPT_Xassembler);
7104
7105 for (InputInfoList::const_iterator
7106 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7107 const InputInfo &II = *it;
7108 CmdArgs.push_back(II.getFilename());
7109 }
7110
7111 const char *Exec =
7112 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7113 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7114}
7115
7116void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7117 const InputInfo &Output,
7118 const InputInfoList &Inputs,
7119 const ArgList &Args,
7120 const char *LinkingOutput) const {
7121 ArgStringList CmdArgs;
7122
7123 if (Output.isFilename()) {
7124 CmdArgs.push_back("-o");
7125 CmdArgs.push_back(Output.getFilename());
7126 } else {
7127 assert(Output.isNothing() && "Invalid output.");
7128 }
7129
7130 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7131
7132 const char *Exec =
7133 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7134 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7135}