blob: 74cd393775207af5c6ba1254ed6d28a8b61695f6 [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
Amara Emerson703da2e2013-10-31 09:32:33 +0000445/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
446//
447// FIXME: tblgen this.
448static std::string getAArch64TargetCPU(const ArgList &Args,
449 const llvm::Triple &Triple) {
450 // FIXME: Warn on inconsistent use of -mcpu and -march.
451
452 // If we have -mcpu=, use that.
453 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
454 StringRef MCPU = A->getValue();
455 // Handle -mcpu=native.
456 if (MCPU == "native")
457 return llvm::sys::getHostCPUName();
458 else
459 return MCPU;
460 }
461
462 return "generic";
463}
464
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000465// FIXME: Move to target hook.
466static bool isSignedCharDefault(const llvm::Triple &Triple) {
467 switch (Triple.getArch()) {
468 default:
469 return true;
470
Tim Northover9bb857a2013-01-31 12:13:10 +0000471 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000472 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000473 case llvm::Triple::ppc:
474 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000475 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000476 return true;
477 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000478
Bill Schmidt778d3872013-07-26 01:36:11 +0000479 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000480 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000481 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000482 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000483 }
484}
485
Robert Lytton0e076492013-08-13 09:43:10 +0000486static bool isNoCommonDefault(const llvm::Triple &Triple) {
487 switch (Triple.getArch()) {
488 default:
489 return false;
490
491 case llvm::Triple::xcore:
492 return true;
493 }
494}
495
Chad Rosiercfbfc582012-04-04 20:51:35 +0000496// Handle -mfpu=.
497//
498// FIXME: Centralize feature selection, defaulting shouldn't be also in the
499// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000500static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
501 const ArgList &Args,
502 std::vector<const char *> &Features) {
503 StringRef FPU = A->getValue();
504 if (FPU == "fp-armv8") {
505 Features.push_back("+fp-armv8");
506 } else if (FPU == "neon-fp-armv8") {
507 Features.push_back("+fp-armv8");
508 Features.push_back("+neon");
509 } else if (FPU == "crypto-neon-fp-armv8") {
510 Features.push_back("+fp-armv8");
511 Features.push_back("+neon");
512 Features.push_back("+crypto");
513 } else if (FPU == "neon") {
514 Features.push_back("+neon");
515 } else if (FPU == "none") {
516 Features.push_back("-fp-armv8");
517 Features.push_back("-crypto");
518 Features.push_back("-neon");
519 } else
520 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
521}
522
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000523// Handle -mhwdiv=.
524static void getARMHWDivFeatures(const Driver &D, const Arg *A,
525 const ArgList &Args,
526 std::vector<const char *> &Features) {
527 StringRef HWDiv = A->getValue();
528 if (HWDiv == "arm") {
529 Features.push_back("+hwdiv-arm");
530 Features.push_back("-hwdiv");
531 } else if (HWDiv == "thumb") {
532 Features.push_back("-hwdiv-arm");
533 Features.push_back("+hwdiv");
534 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
535 Features.push_back("+hwdiv-arm");
536 Features.push_back("+hwdiv");
537 } else if (HWDiv == "none") {
538 Features.push_back("-hwdiv-arm");
539 Features.push_back("-hwdiv");
540 } else
541 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
542}
543
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000544// Handle -mfpu=.
545//
546// FIXME: Centralize feature selection, defaulting shouldn't be also in the
547// frontend target.
548static void getARMFPUFeatures(const Driver &D, const Arg *A,
549 const ArgList &Args,
550 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000551 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000552
553 // Set the target features based on the FPU.
554 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
555 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000556 Features.push_back("-vfp2");
557 Features.push_back("-vfp3");
558 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000559 } else if (FPU == "vfp") {
560 Features.push_back("+vfp2");
561 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000562 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000563 Features.push_back("+vfp3");
564 Features.push_back("+d16");
565 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000566 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000567 Features.push_back("+vfp3");
568 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000569 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
570 Features.push_back("+vfp4");
571 Features.push_back("+d16");
572 Features.push_back("-neon");
573 } else if (FPU == "vfp4" || FPU == "vfpv4") {
574 Features.push_back("+vfp4");
575 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000576 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000577 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000578 Features.push_back("-neon");
579 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000580 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000581 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000582 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000583 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000584 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000585 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000586 Features.push_back("+neon");
587 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000588 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000589 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000590 } else if (FPU == "none") {
591 Features.push_back("-vfp2");
592 Features.push_back("-vfp3");
593 Features.push_back("-vfp4");
594 Features.push_back("-fp-armv8");
595 Features.push_back("-crypto");
596 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000597 } else
598 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
599}
600
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000601// Select the float ABI as determined by -msoft-float, -mhard-float, and
602// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000603StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
604 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000605 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000606 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
607 options::OPT_mhard_float,
608 options::OPT_mfloat_abi_EQ)) {
609 if (A->getOption().matches(options::OPT_msoft_float))
610 FloatABI = "soft";
611 else if (A->getOption().matches(options::OPT_mhard_float))
612 FloatABI = "hard";
613 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000614 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000615 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000616 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000617 << A->getAsString(Args);
618 FloatABI = "soft";
619 }
620 }
621 }
622
623 // If unspecified, choose the default based on the platform.
624 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000625 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000626 case llvm::Triple::Darwin:
627 case llvm::Triple::MacOSX:
628 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000629 // Darwin defaults to "softfp" for v6 and v7.
630 //
631 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000632 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000633 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000634 if (StringRef(ArchName).startswith("v6") ||
635 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000636 FloatABI = "softfp";
637 else
638 FloatABI = "soft";
639 break;
640 }
641
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000642 case llvm::Triple::FreeBSD:
643 // FreeBSD defaults to soft float
644 FloatABI = "soft";
645 break;
646
Daniel Dunbar78485922009-09-10 23:00:09 +0000647 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000648 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000649 case llvm::Triple::GNUEABIHF:
650 FloatABI = "hard";
651 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000652 case llvm::Triple::GNUEABI:
653 FloatABI = "softfp";
654 break;
655 case llvm::Triple::EABI:
656 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
657 FloatABI = "softfp";
658 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000659 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000660 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000661 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000662 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000663 FloatABI = "softfp";
664 else
665 FloatABI = "soft";
666 break;
667 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000668 default:
669 // Assume "soft", but warn the user we are guessing.
670 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000671 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000672 break;
673 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000674 }
675 }
676
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000677 return FloatABI;
678}
679
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000680static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
681 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000682 std::vector<const char *> &Features,
683 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000684 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000685 if (!ForAS) {
686 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
687 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
688 // stripped out by the ARM target. We should probably pass this a new
689 // -target-option, which is handled by the -cc1/-cc1as invocation.
690 //
691 // FIXME2: For consistency, it would be ideal if we set up the target
692 // machine state the same when using the frontend or the assembler. We don't
693 // currently do that for the assembler, we pass the options directly to the
694 // backend and never even instantiate the frontend TargetInfo. If we did,
695 // and used its handleTargetFeatures hook, then we could ensure the
696 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000697
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000698 // Use software floating point operations?
699 if (FloatABI == "soft")
700 Features.push_back("+soft-float");
701
702 // Use software floating point argument passing?
703 if (FloatABI != "hard")
704 Features.push_back("+soft-float-abi");
705 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000706
707 // Honor -mfpu=.
708 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000709 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000710 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
711 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000712
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000713 // Setting -msoft-float effectively disables NEON because of the GCC
714 // implementation, although the same isn't true of VFP or VFP3.
715 if (FloatABI == "soft")
716 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000717
718 // En/disable crc
719 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
720 options::OPT_mnocrc)) {
721 if (A->getOption().matches(options::OPT_mcrc))
722 Features.push_back("+crc");
723 else
724 Features.push_back("-crc");
725 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000726}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000727
728void Clang::AddARMTargetArgs(const ArgList &Args,
729 ArgStringList &CmdArgs,
730 bool KernelOrKext) const {
731 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000732 // Get the effective triple, which takes into account the deployment target.
733 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
734 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000735 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000736
737 // Select the ABI to use.
738 //
739 // FIXME: Support -meabi.
740 const char *ABIName = 0;
741 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000742 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000743 } else if (Triple.isOSDarwin()) {
744 // The backend is hardwired to assume AAPCS for M-class processors, ensure
745 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000746 if (Triple.getEnvironment() == llvm::Triple::EABI ||
747 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000748 ABIName = "aapcs";
749 } else {
750 ABIName = "apcs-gnu";
751 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752 } else {
753 // Select the default based on the platform.
754 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000755 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000756 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000757 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000758 ABIName = "aapcs-linux";
759 break;
760 case llvm::Triple::EABI:
761 ABIName = "aapcs";
762 break;
763 default:
764 ABIName = "apcs-gnu";
765 }
766 }
767 CmdArgs.push_back("-target-abi");
768 CmdArgs.push_back(ABIName);
769
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000770 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000771 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000772 if (FloatABI == "soft") {
773 // Floating point operations and argument passing are soft.
774 //
775 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000776 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000777 CmdArgs.push_back("-mfloat-abi");
778 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000779 } else if (FloatABI == "softfp") {
780 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000781 CmdArgs.push_back("-mfloat-abi");
782 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000783 } else {
784 // Floating point operations and argument passing are hard.
785 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000786 CmdArgs.push_back("-mfloat-abi");
787 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000788 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000789
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000790 // Kernel code has more strict alignment requirements.
791 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000792 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000793 CmdArgs.push_back("-backend-option");
794 CmdArgs.push_back("-arm-long-calls");
795 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000796
Daniel Dunbar12100e22011-03-22 16:48:17 +0000797 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000798 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000799
800 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000801 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000802 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000803 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000804
805 // Setting -mno-global-merge disables the codegen global merge pass. Setting
806 // -mglobal-merge has no effect as the pass is enabled by default.
807 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
808 options::OPT_mno_global_merge)) {
809 if (A->getOption().matches(options::OPT_mno_global_merge))
810 CmdArgs.push_back("-mno-global-merge");
811 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000812
Bob Wilson9c8af452013-04-11 18:53:25 +0000813 if (!Args.hasFlag(options::OPT_mimplicit_float,
814 options::OPT_mno_implicit_float,
815 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000816 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000817
818 // llvm does not support reserving registers in general. There is support
819 // for reserving r9 on ARM though (defined as a platform-specific register
820 // in ARM EABI).
821 if (Args.hasArg(options::OPT_ffixed_r9)) {
822 CmdArgs.push_back("-backend-option");
823 CmdArgs.push_back("-arm-reserve-r9");
824 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000825}
826
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000827// Get CPU and ABI names. They are not independent
828// so we have to calculate them together.
829static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000830 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000831 StringRef &CPUName,
832 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000833 const char *DefMips32CPU = "mips32";
834 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000835
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000836 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000837 options::OPT_mcpu_EQ))
838 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000839
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000840 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000841 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000842 // Convert a GNU style Mips ABI name to the name
843 // accepted by LLVM Mips backend.
844 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
845 .Case("32", "o32")
846 .Case("64", "n64")
847 .Default(ABIName);
848 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000849
850 // Setup default CPU and ABI names.
851 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000852 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000853 default:
854 llvm_unreachable("Unexpected triple arch name");
855 case llvm::Triple::mips:
856 case llvm::Triple::mipsel:
857 CPUName = DefMips32CPU;
858 break;
859 case llvm::Triple::mips64:
860 case llvm::Triple::mips64el:
861 CPUName = DefMips64CPU;
862 break;
863 }
864 }
865
866 if (!ABIName.empty()) {
867 // Deduce CPU name from ABI name.
868 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000869 .Cases("32", "o32", "eabi", DefMips32CPU)
870 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000871 .Default("");
872 }
873 else if (!CPUName.empty()) {
874 // Deduce ABI name from CPU name.
875 ABIName = llvm::StringSwitch<const char *>(CPUName)
876 .Cases("mips32", "mips32r2", "o32")
877 .Cases("mips64", "mips64r2", "n64")
878 .Default("");
879 }
880
881 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000882}
883
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000884// Convert ABI name to the GNU tools acceptable variant.
885static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
886 return llvm::StringSwitch<llvm::StringRef>(ABI)
887 .Case("o32", "32")
888 .Case("n64", "64")
889 .Default(ABI);
890}
891
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000892// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
893// and -mfloat-abi=.
894static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000895 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000896 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000897 options::OPT_mhard_float,
898 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000899 if (A->getOption().matches(options::OPT_msoft_float))
900 FloatABI = "soft";
901 else if (A->getOption().matches(options::OPT_mhard_float))
902 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000903 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000904 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000905 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000906 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000907 FloatABI = "hard";
908 }
909 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000910 }
911
912 // If unspecified, choose the default based on the platform.
913 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000914 // Assume "hard", because it's a default value used by gcc.
915 // When we start to recognize specific target MIPS processors,
916 // we will be able to select the default more correctly.
917 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000918 }
919
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000920 return FloatABI;
921}
922
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000923static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000924 std::vector<const char *> &Features,
925 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000926 StringRef FeatureName) {
927 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000928 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000929 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000930 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000931 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000932 }
933}
934
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000935static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
936 std::vector<const char *> &Features) {
937 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000938 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000939 // FIXME: Note, this is a hack. We need to pass the selected float
940 // mode to the MipsTargetInfoBase to define appropriate macros there.
941 // Now it is the only method.
942 Features.push_back("+soft-float");
943 }
944
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000945 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
946 if (StringRef(A->getValue()) == "2008")
947 Features.push_back("+nan2008");
948 }
949
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000950 AddTargetFeature(Args, Features, options::OPT_msingle_float,
951 options::OPT_mdouble_float, "single-float");
952 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
953 "mips16");
954 AddTargetFeature(Args, Features, options::OPT_mmicromips,
955 options::OPT_mno_micromips, "micromips");
956 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
957 "dsp");
958 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
959 "dspr2");
960 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
961 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +0000962 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
963 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000964}
965
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000966void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000967 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000968 const Driver &D = getToolChain().getDriver();
969 StringRef CPUName;
970 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000971 const llvm::Triple &Triple = getToolChain().getTriple();
972 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000973
974 CmdArgs.push_back("-target-abi");
975 CmdArgs.push_back(ABIName.data());
976
977 StringRef FloatABI = getMipsFloatABI(D, Args);
978
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000979 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +0000980 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000981 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000982 CmdArgs.push_back("-mfloat-abi");
983 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000984 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000985 else {
986 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000987 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000988 CmdArgs.push_back("-mfloat-abi");
989 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000990 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000991
Simon Atanasyan2eaec512012-12-01 18:27:21 +0000992 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
993 if (A->getOption().matches(options::OPT_mxgot)) {
994 CmdArgs.push_back("-mllvm");
995 CmdArgs.push_back("-mxgot");
996 }
997 }
998
Simon Atanasyanc580b322013-05-11 06:33:44 +0000999 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1000 options::OPT_mno_ldc1_sdc1)) {
1001 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1002 CmdArgs.push_back("-mllvm");
1003 CmdArgs.push_back("-mno-ldc1-sdc1");
1004 }
1005 }
1006
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001007 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1008 options::OPT_mno_check_zero_division)) {
1009 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1010 CmdArgs.push_back("-mllvm");
1011 CmdArgs.push_back("-mno-check-zero-division");
1012 }
1013 }
1014
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001015 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001016 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001017 CmdArgs.push_back("-mllvm");
1018 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1019 A->claim();
1020 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001021}
1022
Hal Finkel8eb59282012-06-11 22:35:19 +00001023/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1024static std::string getPPCTargetCPU(const ArgList &Args) {
1025 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001026 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001027
1028 if (CPUName == "native") {
1029 std::string CPU = llvm::sys::getHostCPUName();
1030 if (!CPU.empty() && CPU != "generic")
1031 return CPU;
1032 else
1033 return "";
1034 }
1035
1036 return llvm::StringSwitch<const char *>(CPUName)
1037 .Case("common", "generic")
1038 .Case("440", "440")
1039 .Case("440fp", "440")
1040 .Case("450", "450")
1041 .Case("601", "601")
1042 .Case("602", "602")
1043 .Case("603", "603")
1044 .Case("603e", "603e")
1045 .Case("603ev", "603ev")
1046 .Case("604", "604")
1047 .Case("604e", "604e")
1048 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001049 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001050 .Case("G3", "g3")
1051 .Case("7400", "7400")
1052 .Case("G4", "g4")
1053 .Case("7450", "7450")
1054 .Case("G4+", "g4+")
1055 .Case("750", "750")
1056 .Case("970", "970")
1057 .Case("G5", "g5")
1058 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001059 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001060 .Case("e500mc", "e500mc")
1061 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001062 .Case("power3", "pwr3")
1063 .Case("power4", "pwr4")
1064 .Case("power5", "pwr5")
1065 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001066 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001067 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001068 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001069 .Case("pwr3", "pwr3")
1070 .Case("pwr4", "pwr4")
1071 .Case("pwr5", "pwr5")
1072 .Case("pwr5x", "pwr5x")
1073 .Case("pwr6", "pwr6")
1074 .Case("pwr6x", "pwr6x")
1075 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001076 .Case("powerpc", "ppc")
1077 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001078 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001079 .Default("");
1080 }
1081
1082 return "";
1083}
1084
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001085static void getPPCTargetFeatures(const ArgList &Args,
1086 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001087 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1088 ie = Args.filtered_end();
1089 it != ie; ++it) {
1090 StringRef Name = (*it)->getOption().getName();
1091 (*it)->claim();
1092
1093 // Skip over "-m".
1094 assert(Name.startswith("m") && "Invalid feature name.");
1095 Name = Name.substr(1);
1096
1097 bool IsNegative = Name.startswith("no-");
1098 if (IsNegative)
1099 Name = Name.substr(3);
1100
1101 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1102 // pass the correct option to the backend while calling the frontend
1103 // option the same.
1104 // TODO: Change the LLVM backend option maybe?
1105 if (Name == "mfcrf")
1106 Name = "mfocrf";
1107
1108 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1109 }
1110
1111 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001112 AddTargetFeature(Args, Features, options::OPT_faltivec,
1113 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001114}
1115
Tom Stellard6674c702013-04-01 20:56:53 +00001116/// Get the (LLVM) name of the R600 gpu we are targeting.
1117static std::string getR600TargetGPU(const ArgList &Args) {
1118 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001119 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001120 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001121 .Cases("rv630", "rv635", "r600")
1122 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001123 .Case("rv740", "rv770")
1124 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001125 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001126 .Case("hemlock", "cypress")
1127 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001128 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001129 }
1130 return "";
1131}
1132
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001133static void getSparcTargetFeatures(const ArgList &Args,
1134 std::vector<const char *> Features) {
1135 bool SoftFloatABI = true;
1136 if (Arg *A =
1137 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1138 if (A->getOption().matches(options::OPT_mhard_float))
1139 SoftFloatABI = false;
1140 }
1141 if (SoftFloatABI)
1142 Features.push_back("+soft-float");
1143}
1144
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001145void Clang::AddSparcTargetArgs(const ArgList &Args,
1146 ArgStringList &CmdArgs) const {
1147 const Driver &D = getToolChain().getDriver();
1148
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001149 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001150 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001151 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1152 options::OPT_mhard_float)) {
1153 if (A->getOption().matches(options::OPT_msoft_float))
1154 FloatABI = "soft";
1155 else if (A->getOption().matches(options::OPT_mhard_float))
1156 FloatABI = "hard";
1157 }
1158
1159 // If unspecified, choose the default based on the platform.
1160 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001161 // Assume "soft", but warn the user we are guessing.
1162 FloatABI = "soft";
1163 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001164 }
1165
1166 if (FloatABI == "soft") {
1167 // Floating point operations and argument passing are soft.
1168 //
1169 // FIXME: This changes CPP defines, we need -target-soft-float.
1170 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001171 } else {
1172 assert(FloatABI == "hard" && "Invalid float abi!");
1173 CmdArgs.push_back("-mhard-float");
1174 }
1175}
1176
Richard Sandiford4652d892013-07-19 16:51:51 +00001177static const char *getSystemZTargetCPU(const ArgList &Args) {
1178 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1179 return A->getValue();
1180 return "z10";
1181}
1182
Chandler Carruth953fb082013-01-13 11:46:33 +00001183static const char *getX86TargetCPU(const ArgList &Args,
1184 const llvm::Triple &Triple) {
1185 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001186 if (StringRef(A->getValue()) != "native") {
1187 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1188 return "core-avx2";
1189
Chandler Carruth953fb082013-01-13 11:46:33 +00001190 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001191 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001192
1193 // FIXME: Reject attempts to use -march=native unless the target matches
1194 // the host.
1195 //
1196 // FIXME: We should also incorporate the detected target features for use
1197 // with -native.
1198 std::string CPU = llvm::sys::getHostCPUName();
1199 if (!CPU.empty() && CPU != "generic")
1200 return Args.MakeArgString(CPU);
1201 }
1202
1203 // Select the default CPU if none was given (or detection failed).
1204
1205 if (Triple.getArch() != llvm::Triple::x86_64 &&
1206 Triple.getArch() != llvm::Triple::x86)
1207 return 0; // This routine is only handling x86 targets.
1208
1209 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1210
1211 // FIXME: Need target hooks.
Jim Grosbach82eee262013-11-16 00:53:35 +00001212 if (Triple.isOSDarwin()) {
1213 if (Triple.getArchName() == "x86_64h")
1214 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001215 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001216 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001217
Chandler Carruth953fb082013-01-13 11:46:33 +00001218 // All x86 devices running Android have core2 as their common
1219 // denominator. This makes a better choice than pentium4.
1220 if (Triple.getEnvironment() == llvm::Triple::Android)
1221 return "core2";
1222
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001223 // Everything else goes to x86-64 in 64-bit mode.
1224 if (Is64Bit)
1225 return "x86-64";
1226
1227 switch (Triple.getOS()) {
1228 case llvm::Triple::FreeBSD:
1229 case llvm::Triple::NetBSD:
1230 case llvm::Triple::OpenBSD:
1231 return "i486";
1232 case llvm::Triple::Haiku:
1233 return "i586";
1234 case llvm::Triple::Bitrig:
1235 return "i686";
1236 default:
1237 // Fallback to p4.
1238 return "pentium4";
1239 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001240}
1241
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001242static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1243 switch(T.getArch()) {
1244 default:
1245 return "";
1246
Amara Emerson703da2e2013-10-31 09:32:33 +00001247 case llvm::Triple::aarch64:
1248 return getAArch64TargetCPU(Args, T);
1249
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001250 case llvm::Triple::arm:
1251 case llvm::Triple::thumb:
Bernard Ogden31561762013-12-12 13:27:11 +00001252 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001253
1254 case llvm::Triple::mips:
1255 case llvm::Triple::mipsel:
1256 case llvm::Triple::mips64:
1257 case llvm::Triple::mips64el: {
1258 StringRef CPUName;
1259 StringRef ABIName;
1260 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1261 return CPUName;
1262 }
1263
1264 case llvm::Triple::ppc:
1265 case llvm::Triple::ppc64:
1266 case llvm::Triple::ppc64le: {
1267 std::string TargetCPUName = getPPCTargetCPU(Args);
1268 // LLVM may default to generating code for the native CPU,
1269 // but, like gcc, we default to a more generic option for
1270 // each architecture. (except on Darwin)
1271 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1272 if (T.getArch() == llvm::Triple::ppc64)
1273 TargetCPUName = "ppc64";
1274 else if (T.getArch() == llvm::Triple::ppc64le)
1275 TargetCPUName = "ppc64le";
1276 else
1277 TargetCPUName = "ppc";
1278 }
1279 return TargetCPUName;
1280 }
1281
1282 case llvm::Triple::sparc:
1283 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1284 return A->getValue();
1285 return "";
1286
1287 case llvm::Triple::x86:
1288 case llvm::Triple::x86_64:
1289 return getX86TargetCPU(Args, T);
1290
1291 case llvm::Triple::hexagon:
1292 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1293
1294 case llvm::Triple::systemz:
1295 return getSystemZTargetCPU(Args);
1296
1297 case llvm::Triple::r600:
1298 return getR600TargetGPU(Args);
1299 }
1300}
1301
Alp Tokerce365ca2013-12-02 12:43:03 +00001302static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1303 ArgStringList &CmdArgs) {
1304 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1305 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1306 // forward.
1307 CmdArgs.push_back("-plugin");
1308 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1309 CmdArgs.push_back(Args.MakeArgString(Plugin));
1310
1311 // Try to pass driver level flags relevant to LTO code generation down to
1312 // the plugin.
1313
1314 // Handle flags for selecting CPU variants.
1315 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1316 if (!CPU.empty())
1317 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1318}
1319
Jim Grosbach82eee262013-11-16 00:53:35 +00001320static void getX86TargetFeatures(const llvm::Triple &Triple,
1321 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001322 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001323 if (Triple.getArchName() == "x86_64h") {
1324 // x86_64h implies quite a few of the more modern subtarget features
1325 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1326 Features.push_back("-rdrnd");
1327 Features.push_back("-aes");
1328 Features.push_back("-pclmul");
1329 Features.push_back("-rtm");
1330 Features.push_back("-hle");
1331 Features.push_back("-fsgsbase");
1332 }
1333
1334 // Now add any that the user explicitly requested on the command line,
1335 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001336 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1337 ie = Args.filtered_end();
1338 it != ie; ++it) {
1339 StringRef Name = (*it)->getOption().getName();
1340 (*it)->claim();
1341
1342 // Skip over "-m".
1343 assert(Name.startswith("m") && "Invalid feature name.");
1344 Name = Name.substr(1);
1345
1346 bool IsNegative = Name.startswith("no-");
1347 if (IsNegative)
1348 Name = Name.substr(3);
1349
1350 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1351 }
1352}
1353
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001354void Clang::AddX86TargetArgs(const ArgList &Args,
1355 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001356 if (!Args.hasFlag(options::OPT_mred_zone,
1357 options::OPT_mno_red_zone,
1358 true) ||
1359 Args.hasArg(options::OPT_mkernel) ||
1360 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001361 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001362
Bob Wilson2616e2e2013-02-10 16:01:41 +00001363 // Default to avoid implicit floating-point for kernel/kext code, but allow
1364 // that to be overridden with -mno-soft-float.
1365 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1366 Args.hasArg(options::OPT_fapple_kext));
1367 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1368 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001369 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001370 options::OPT_mno_implicit_float)) {
1371 const Option &O = A->getOption();
1372 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1373 O.matches(options::OPT_msoft_float));
1374 }
1375 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001376 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001377}
1378
Matthew Curtise8f80a12012-12-06 17:49:03 +00001379static inline bool HasPICArg(const ArgList &Args) {
1380 return Args.hasArg(options::OPT_fPIC)
1381 || Args.hasArg(options::OPT_fpic);
1382}
1383
1384static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1385 return Args.getLastArg(options::OPT_G,
1386 options::OPT_G_EQ,
1387 options::OPT_msmall_data_threshold_EQ);
1388}
1389
1390static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1391 std::string value;
1392 if (HasPICArg(Args))
1393 value = "0";
1394 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1395 value = A->getValue();
1396 A->claim();
1397 }
1398 return value;
1399}
1400
Tony Linthicum76329bf2011-12-12 21:14:55 +00001401void Clang::AddHexagonTargetArgs(const ArgList &Args,
1402 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001403 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001404 CmdArgs.push_back("-mqdsp6-compat");
1405 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001406
Matthew Curtise8f80a12012-12-06 17:49:03 +00001407 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1408 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001409 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001410 CmdArgs.push_back(Args.MakeArgString(
1411 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001412 }
1413
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001414 if (!Args.hasArg(options::OPT_fno_short_enums))
1415 CmdArgs.push_back("-fshort-enums");
1416 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1417 CmdArgs.push_back ("-mllvm");
1418 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1419 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001420 CmdArgs.push_back ("-mllvm");
1421 CmdArgs.push_back ("-machine-sink-split=0");
1422}
1423
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001424static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1425 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001426 // Honor -mfpu=.
1427 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001428 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001429}
1430
1431static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001432 const ArgList &Args, ArgStringList &CmdArgs,
1433 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001434 std::vector<const char *> Features;
1435 switch (Triple.getArch()) {
1436 default:
1437 break;
1438 case llvm::Triple::mips:
1439 case llvm::Triple::mipsel:
1440 case llvm::Triple::mips64:
1441 case llvm::Triple::mips64el:
1442 getMIPSTargetFeatures(D, Args, Features);
1443 break;
1444
1445 case llvm::Triple::arm:
1446 case llvm::Triple::thumb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001447 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001448 break;
1449
1450 case llvm::Triple::ppc:
1451 case llvm::Triple::ppc64:
1452 case llvm::Triple::ppc64le:
1453 getPPCTargetFeatures(Args, Features);
1454 break;
1455 case llvm::Triple::sparc:
1456 getSparcTargetFeatures(Args, Features);
1457 break;
1458 case llvm::Triple::aarch64:
1459 getAArch64TargetFeatures(D, Args, Features);
1460 break;
1461 case llvm::Triple::x86:
1462 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001463 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001464 break;
1465 }
Rafael Espindola43964802013-08-21 17:34:32 +00001466
1467 // Find the last of each feature.
1468 llvm::StringMap<unsigned> LastOpt;
1469 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1470 const char *Name = Features[I];
1471 assert(Name[0] == '-' || Name[0] == '+');
1472 LastOpt[Name + 1] = I;
1473 }
1474
1475 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1476 // If this feature was overridden, ignore it.
1477 const char *Name = Features[I];
1478 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1479 assert(LastI != LastOpt.end());
1480 unsigned Last = LastI->second;
1481 if (Last != I)
1482 continue;
1483
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001484 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001485 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001486 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001487}
1488
Eric Christopher84fbdb42011-08-19 00:30:14 +00001489static bool
John McCall5fb5df92012-06-20 06:18:46 +00001490shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001491 const llvm::Triple &Triple) {
1492 // We use the zero-cost exception tables for Objective-C if the non-fragile
1493 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1494 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001495 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001496 return true;
1497
Bob Wilson83e723a2013-12-05 19:38:42 +00001498 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001499 return false;
1500
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001501 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001502 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001503 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001504}
1505
Anders Carlssone96ab552011-02-28 02:27:16 +00001506/// addExceptionArgs - Adds exception related arguments to the driver command
1507/// arguments. There's a master flag, -fexceptions and also language specific
1508/// flags to enable/disable C++ and Objective-C exceptions.
1509/// This makes it possible to for example disable C++ exceptions but enable
1510/// Objective-C exceptions.
1511static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1512 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001513 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001514 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001515 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001516 if (KernelOrKext) {
1517 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1518 // arguments now to avoid warnings about unused arguments.
1519 Args.ClaimAllArgs(options::OPT_fexceptions);
1520 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1521 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1522 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1523 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1524 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001525 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001526 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001527
1528 // Exceptions are enabled by default.
1529 bool ExceptionsEnabled = true;
1530
1531 // This keeps track of whether exceptions were explicitly turned on or off.
1532 bool DidHaveExplicitExceptionFlag = false;
1533
Rafael Espindola00a66572009-10-01 13:33:33 +00001534 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1535 options::OPT_fno_exceptions)) {
1536 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001537 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001538 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001539 ExceptionsEnabled = false;
1540
1541 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001542 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001543
Anders Carlssone96ab552011-02-28 02:27:16 +00001544 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001545
Anders Carlssone96ab552011-02-28 02:27:16 +00001546 // Exception tables and cleanups can be enabled with -fexceptions even if the
1547 // language itself doesn't support exceptions.
1548 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1549 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001550
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001551 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1552 // is not necessarily sensible, but follows GCC.
1553 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001554 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001555 options::OPT_fno_objc_exceptions,
1556 true)) {
1557 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001558
Eric Christopher84fbdb42011-08-19 00:30:14 +00001559 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001560 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001561 }
1562
1563 if (types::isCXX(InputType)) {
1564 bool CXXExceptionsEnabled = ExceptionsEnabled;
1565
Eric Christopher84fbdb42011-08-19 00:30:14 +00001566 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1567 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001568 options::OPT_fexceptions,
1569 options::OPT_fno_exceptions)) {
1570 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1571 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001572 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001573 CXXExceptionsEnabled = false;
1574 }
1575
1576 if (CXXExceptionsEnabled) {
1577 CmdArgs.push_back("-fcxx-exceptions");
1578
1579 ShouldUseExceptionTables = true;
1580 }
1581 }
1582
1583 if (ShouldUseExceptionTables)
1584 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001585}
1586
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001587static bool ShouldDisableAutolink(const ArgList &Args,
1588 const ToolChain &TC) {
1589 bool Default = true;
1590 if (TC.getTriple().isOSDarwin()) {
1591 // The native darwin assembler doesn't support the linker_option directives,
1592 // so we disable them if we think the .s file will be passed to it.
1593 Default = TC.useIntegratedAs();
1594 }
1595 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1596 Default);
1597}
1598
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001599static bool ShouldDisableCFI(const ArgList &Args,
1600 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001601 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001602 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001603 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001604 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001605 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001606 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001607 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001608 options::OPT_fno_dwarf2_cfi_asm,
1609 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001610}
1611
Ted Kremenek62093662013-03-12 17:02:12 +00001612static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1613 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001614 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1615 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001616 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001617 return !UseDwarfDirectory;
1618}
1619
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001620/// \brief Check whether the given input tree contains any compilation actions.
1621static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001622 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001623 return true;
1624
1625 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1626 if (ContainsCompileAction(*it))
1627 return true;
1628
1629 return false;
1630}
1631
1632/// \brief Check if -relax-all should be passed to the internal assembler.
1633/// This is done by default when compiling non-assembler source with -O0.
1634static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1635 bool RelaxDefault = true;
1636
1637 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1638 RelaxDefault = A->getOption().matches(options::OPT_O0);
1639
1640 if (RelaxDefault) {
1641 RelaxDefault = false;
1642 for (ActionList::const_iterator it = C.getActions().begin(),
1643 ie = C.getActions().end(); it != ie; ++it) {
1644 if (ContainsCompileAction(*it)) {
1645 RelaxDefault = true;
1646 break;
1647 }
1648 }
1649 }
1650
1651 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1652 RelaxDefault);
1653}
1654
David Blaikie9260ed62013-07-25 21:19:01 +00001655static void CollectArgsForIntegratedAssembler(Compilation &C,
1656 const ArgList &Args,
1657 ArgStringList &CmdArgs,
1658 const Driver &D) {
1659 if (UseRelaxAll(C, Args))
1660 CmdArgs.push_back("-mrelax-all");
1661
David Peixottodfb66142013-11-14 22:52:58 +00001662 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001663 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001664 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1665 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1666 // arg after parsing the '-I' arg.
1667 bool TakeNextArg = false;
1668
David Blaikie9260ed62013-07-25 21:19:01 +00001669 // When using an integrated assembler, translate -Wa, and -Xassembler
1670 // options.
1671 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1672 options::OPT_Xassembler),
1673 ie = Args.filtered_end(); it != ie; ++it) {
1674 const Arg *A = *it;
1675 A->claim();
1676
1677 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1678 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001679 if (TakeNextArg) {
1680 CmdArgs.push_back(Value.data());
1681 TakeNextArg = false;
1682 continue;
1683 }
David Blaikie9260ed62013-07-25 21:19:01 +00001684
1685 if (Value == "-force_cpusubtype_ALL") {
1686 // Do nothing, this is the default and we don't support anything else.
1687 } else if (Value == "-L") {
1688 CmdArgs.push_back("-msave-temp-labels");
1689 } else if (Value == "--fatal-warnings") {
1690 CmdArgs.push_back("-mllvm");
1691 CmdArgs.push_back("-fatal-assembler-warnings");
1692 } else if (Value == "--noexecstack") {
1693 CmdArgs.push_back("-mnoexecstack");
David Peixottodfb66142013-11-14 22:52:58 +00001694 } else if (Value.startswith("-I")) {
1695 CmdArgs.push_back(Value.data());
1696 // We need to consume the next argument if the current arg is a plain
1697 // -I. The next arg will be the include directory.
1698 if (Value == "-I")
1699 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001700 } else {
1701 D.Diag(diag::err_drv_unsupported_option_argument)
1702 << A->getOption().getName() << Value;
1703 }
1704 }
1705 }
1706}
1707
Chandler Carruth36381702013-06-23 11:28:48 +00001708static void addProfileRTLinux(
1709 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1710 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1711 Args.hasArg(options::OPT_fprofile_generate) ||
1712 Args.hasArg(options::OPT_fcreate_profile) ||
1713 Args.hasArg(options::OPT_coverage)))
1714 return;
1715
1716 // The profile runtime is located in the Linux library directory and has name
1717 // "libclang_rt.profile-<ArchName>.a".
1718 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1719 llvm::sys::path::append(
1720 LibProfile, "lib", "linux",
1721 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1722
1723 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1724}
1725
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001726static void addSanitizerRTLinkFlagsLinux(
1727 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001728 const StringRef Sanitizer, bool BeforeLibStdCXX,
1729 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001730 // Sanitizer runtime is located in the Linux library directory and
1731 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1732 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1733 llvm::sys::path::append(
1734 LibSanitizer, "lib", "linux",
1735 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001736
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001737 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1738 // etc.) so that the linker picks custom versions of the global 'operator
1739 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001740 // strategy of inserting it at the front of the link command. It also
1741 // needs to be forced to end up in the executable, so wrap it in
1742 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001743 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001744 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001745 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001746 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001747
1748 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1749 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1750
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001751 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001752 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001753 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001754 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001755
1756 // If possible, use a dynamic symbols file to export the symbols from the
1757 // runtime library. If we can't do so, use -export-dynamic instead to export
1758 // all symbols from the binary.
1759 if (ExportSymbols) {
1760 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1761 CmdArgs.push_back(
1762 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1763 else
1764 CmdArgs.push_back("-export-dynamic");
1765 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001766}
1767
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001768/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1769/// This needs to be called before we add the C run-time (malloc, etc).
1770static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001771 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001772 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001773 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1774 llvm::sys::path::append(LibAsan, "lib", "linux",
1775 (Twine("libclang_rt.asan-") +
1776 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001777 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001778 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001779 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001780 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001781 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001782}
1783
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001784/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1785/// This needs to be called before we add the C run-time (malloc, etc).
1786static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1787 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001788 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001789 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001790}
1791
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001792/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1793/// This needs to be called before we add the C run-time (malloc, etc).
1794static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1795 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001796 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001797 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001798}
1799
1800/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1801/// This needs to be called before we add the C run-time (malloc, etc).
1802static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1803 ArgStringList &CmdArgs) {
1804 if (!Args.hasArg(options::OPT_shared))
1805 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001806}
1807
Richard Smithe30752c2012-10-09 19:52:38 +00001808/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1809/// (Linux).
1810static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001811 ArgStringList &CmdArgs, bool IsCXX,
1812 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001813 // Need a copy of sanitizer_common. This could come from another sanitizer
1814 // runtime; if we're not including one, include our own copy.
1815 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001816 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1817
1818 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1819
1820 // Only include the bits of the runtime which need a C++ ABI library if
1821 // we're linking in C++ mode.
1822 if (IsCXX)
1823 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001824}
1825
Peter Collingbournec3772752013-08-07 22:47:34 +00001826static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1827 ArgStringList &CmdArgs) {
1828 if (!Args.hasArg(options::OPT_shared))
1829 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1830}
1831
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001832static bool shouldUseFramePointerForTarget(const ArgList &Args,
1833 const llvm::Triple &Triple) {
1834 switch (Triple.getArch()) {
1835 // Don't use a frame pointer on linux if optimizing for certain targets.
1836 case llvm::Triple::mips64:
1837 case llvm::Triple::mips64el:
1838 case llvm::Triple::mips:
1839 case llvm::Triple::mipsel:
1840 case llvm::Triple::systemz:
1841 case llvm::Triple::x86:
1842 case llvm::Triple::x86_64:
1843 if (Triple.isOSLinux())
1844 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1845 if (!A->getOption().matches(options::OPT_O0))
1846 return false;
1847 return true;
1848 case llvm::Triple::xcore:
1849 return false;
1850 default:
1851 return true;
1852 }
1853}
1854
Rafael Espindola224dd632011-12-14 21:02:23 +00001855static bool shouldUseFramePointer(const ArgList &Args,
1856 const llvm::Triple &Triple) {
1857 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1858 options::OPT_fomit_frame_pointer))
1859 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1860
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001861 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001862}
1863
Eric Christopherb7d97e92013-04-03 01:58:53 +00001864static bool shouldUseLeafFramePointer(const ArgList &Args,
1865 const llvm::Triple &Triple) {
1866 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1867 options::OPT_momit_leaf_frame_pointer))
1868 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1869
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001870 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001871}
1872
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001873/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001874static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001875 SmallString<128> cwd;
1876 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001877 CmdArgs.push_back("-fdebug-compilation-dir");
1878 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001879 }
1880}
1881
Eric Christopherd3804002013-02-22 20:12:52 +00001882static const char *SplitDebugName(const ArgList &Args,
1883 const InputInfoList &Inputs) {
1884 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1885 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1886 SmallString<128> T(FinalOutput->getValue());
1887 llvm::sys::path::replace_extension(T, "dwo");
1888 return Args.MakeArgString(T);
1889 } else {
1890 // Use the compilation dir.
1891 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1892 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1893 llvm::sys::path::replace_extension(F, "dwo");
1894 T += F;
1895 return Args.MakeArgString(F);
1896 }
1897}
1898
1899static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1900 const Tool &T, const JobAction &JA,
1901 const ArgList &Args, const InputInfo &Output,
1902 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001903 ArgStringList ExtractArgs;
1904 ExtractArgs.push_back("--extract-dwo");
1905
1906 ArgStringList StripArgs;
1907 StripArgs.push_back("--strip-dwo");
1908
1909 // Grabbing the output of the earlier compile step.
1910 StripArgs.push_back(Output.getFilename());
1911 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001912 ExtractArgs.push_back(OutFile);
1913
1914 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001915 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001916
1917 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001918 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001919
1920 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001921 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001922}
1923
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001924static bool isOptimizationLevelFast(const ArgList &Args) {
1925 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1926 if (A->getOption().matches(options::OPT_Ofast))
1927 return true;
1928 return false;
1929}
1930
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001931/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1932static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1933 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001934 if (A->getOption().matches(options::OPT_O4) ||
1935 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001936 return true;
1937
1938 if (A->getOption().matches(options::OPT_O0))
1939 return false;
1940
1941 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1942
Rafael Espindola91780de2013-08-26 14:05:41 +00001943 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001944 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001945 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001946 return true;
1947
1948 // Don't vectorize -Oz.
1949 if (S == "z")
1950 return false;
1951
1952 unsigned OptLevel = 0;
1953 if (S.getAsInteger(10, OptLevel))
1954 return false;
1955
1956 return OptLevel > 1;
1957 }
1958
1959 return false;
1960}
1961
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001962void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001963 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001964 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001965 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001966 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001967 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1968 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001969 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001970 ArgStringList CmdArgs;
1971
Daniel Dunbare521a892009-03-31 20:53:55 +00001972 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1973
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001974 // Invoke ourselves in -cc1 mode.
1975 //
1976 // FIXME: Implement custom jobs for internal actions.
1977 CmdArgs.push_back("-cc1");
1978
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001979 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001980 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001981 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001982 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001983
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001984 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001985 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001986
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001987 if (isa<AnalyzeJobAction>(JA)) {
1988 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1989 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001990 } else if (isa<MigrateJobAction>(JA)) {
1991 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001992 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001993 if (Output.getType() == types::TY_Dependencies)
1994 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001995 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001996 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001997 if (Args.hasArg(options::OPT_rewrite_objc) &&
1998 !Args.hasArg(options::OPT_g_Group))
1999 CmdArgs.push_back("-P");
2000 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002001 } else if (isa<AssembleJobAction>(JA)) {
2002 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002003
David Blaikie9260ed62013-07-25 21:19:01 +00002004 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002005
2006 // Also ignore explicit -force_cpusubtype_ALL option.
2007 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002008 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002009 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002010 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002011
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002012 if (JA.getType() == types::TY_Nothing)
2013 CmdArgs.push_back("-fsyntax-only");
2014 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002015 CmdArgs.push_back("-emit-pch");
2016 else
2017 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002018 } else {
2019 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002020
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002021 if (JA.getType() == types::TY_Nothing) {
2022 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002023 } else if (JA.getType() == types::TY_LLVM_IR ||
2024 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002025 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002026 } else if (JA.getType() == types::TY_LLVM_BC ||
2027 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002028 CmdArgs.push_back("-emit-llvm-bc");
2029 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002030 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002031 } else if (JA.getType() == types::TY_AST) {
2032 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002033 } else if (JA.getType() == types::TY_ModuleFile) {
2034 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002035 } else if (JA.getType() == types::TY_RewrittenObjC) {
2036 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002037 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002038 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2039 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002040 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002041 } else {
2042 assert(JA.getType() == types::TY_PP_Asm &&
2043 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002044 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002045 }
2046
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002047 // The make clang go fast button.
2048 CmdArgs.push_back("-disable-free");
2049
John McCallbb79b5f2010-02-13 03:50:24 +00002050 // Disable the verification pass in -asserts builds.
2051#ifdef NDEBUG
2052 CmdArgs.push_back("-disable-llvm-verifier");
2053#endif
2054
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002055 // Set the main file name, so that debug info works even with
2056 // -save-temps.
2057 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002058 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002059
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002060 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002061 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002062 if (Args.hasArg(options::OPT_static))
2063 CmdArgs.push_back("-static-define");
2064
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002065 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002066 // Enable region store model by default.
2067 CmdArgs.push_back("-analyzer-store=region");
2068
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002069 // Treat blocks as analysis entry points.
2070 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2071
Ted Kremenek49c79792011-03-24 00:28:47 +00002072 CmdArgs.push_back("-analyzer-eagerly-assume");
2073
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002074 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002075 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002076 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002077
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002078 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2079 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002080
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002081 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002082 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002083
2084 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002085
Jordan Rose10ad0812013-04-05 17:55:07 +00002086 if (types::isCXX(Inputs[0].getType()))
2087 CmdArgs.push_back("-analyzer-checker=cplusplus");
2088
Ted Kremenek37e96522012-01-26 02:27:38 +00002089 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002090 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2091 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2092 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2093 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2094 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2095 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002096 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002097
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002098 // Set the output format. The default is plist, for (lame) historical
2099 // reasons.
2100 CmdArgs.push_back("-analyzer-output");
2101 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002102 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002103 else
2104 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002105
Ted Kremenekfe449a22010-03-22 22:32:05 +00002106 // Disable the presentation of standard compiler warnings when
2107 // using --analyze. We only want to show static analyzer diagnostics
2108 // or frontend errors.
2109 CmdArgs.push_back("-w");
2110
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002111 // Add -Xanalyzer arguments when running as analyzer.
2112 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002113 }
2114
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002115 CheckCodeGenerationOptions(D, Args);
2116
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002117 bool PIE = getToolChain().isPIEDefault();
2118 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002119 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002120
Alexey Samsonov090301e2013-04-09 12:28:19 +00002121 // For the PIC and PIE flag options, this logic is different from the
2122 // legacy logic in very old versions of GCC, as that logic was just
2123 // a bug no one had ever fixed. This logic is both more rational and
2124 // consistent with GCC's new logic now that the bugs are fixed. The last
2125 // argument relating to either PIC or PIE wins, and no other argument is
2126 // used. If the last argument is any flavor of the '-fno-...' arguments,
2127 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2128 // at the same level.
2129 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2130 options::OPT_fpic, options::OPT_fno_pic,
2131 options::OPT_fPIE, options::OPT_fno_PIE,
2132 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002133 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2134 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002135 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002136 if (LastPICArg) {
2137 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002138 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2139 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2140 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2141 PIC = PIE || O.matches(options::OPT_fPIC) ||
2142 O.matches(options::OPT_fpic);
2143 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2144 O.matches(options::OPT_fPIC);
2145 } else {
2146 PIE = PIC = false;
2147 }
2148 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002149 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002150
Nick Lewycky609dd662013-10-11 03:33:53 +00002151 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002152 // specified while enabling PIC enabled level 1 PIC, just force it back to
2153 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2154 // informal testing).
2155 if (PIC && getToolChain().getTriple().isOSDarwin())
2156 IsPICLevelTwo |= getToolChain().isPICDefault();
2157
Chandler Carruthc0c04552012-04-08 16:40:35 +00002158 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2159 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002160 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002161 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002162 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002163 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002164 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002165 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002166
Chandler Carruth76a943b2012-11-19 03:52:03 +00002167 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2168 // This is a very special mode. It trumps the other modes, almost no one
2169 // uses it, and it isn't even valid on any OS but Darwin.
2170 if (!getToolChain().getTriple().isOSDarwin())
2171 D.Diag(diag::err_drv_unsupported_opt_for_target)
2172 << A->getSpelling() << getToolChain().getTriple().str();
2173
2174 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2175
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002176 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002177 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002178
Chandler Carruth76a943b2012-11-19 03:52:03 +00002179 // Only a forced PIC mode can cause the actual compile to have PIC defines
2180 // etc., no flags are sufficient. This behavior was selected to closely
2181 // match that of llvm-gcc and Apple GCC before that.
2182 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2183 CmdArgs.push_back("-pic-level");
2184 CmdArgs.push_back("2");
2185 }
2186 } else {
2187 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2188 // handled in Clang's IRGen by the -pie-level flag.
2189 CmdArgs.push_back("-mrelocation-model");
2190 CmdArgs.push_back(PIC ? "pic" : "static");
2191
2192 if (PIC) {
2193 CmdArgs.push_back("-pic-level");
2194 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2195 if (PIE) {
2196 CmdArgs.push_back("-pie-level");
2197 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2198 }
2199 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002200 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002201
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002202 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2203 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002204 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002205
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002206 // LLVM Code Generator Options.
2207
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002208 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2209 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002210 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002211 }
2212
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002213 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2214 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002215 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002216 D.Diag(diag::err_drv_unsupported_opt_for_target)
2217 << A->getSpelling() << getToolChain().getTriple().str();
2218 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2219 CmdArgs.push_back("-fpcc-struct-return");
2220 } else {
2221 assert(A->getOption().matches(options::OPT_freg_struct_return));
2222 CmdArgs.push_back("-freg-struct-return");
2223 }
2224 }
2225
Roman Divacky65b88cd2011-03-01 17:40:53 +00002226 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2227 CmdArgs.push_back("-mrtd");
2228
Rafael Espindola224dd632011-12-14 21:02:23 +00002229 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002230 CmdArgs.push_back("-mdisable-fp-elim");
2231 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2232 options::OPT_fno_zero_initialized_in_bss))
2233 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002234
2235 bool OFastEnabled = isOptimizationLevelFast(Args);
2236 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2237 // enabled. This alias option is being used to simplify the hasFlag logic.
2238 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2239 options::OPT_fstrict_aliasing;
2240 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002241 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002242 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002243 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2244 options::OPT_fno_struct_path_tbaa))
2245 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002246 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2247 false))
2248 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002249 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2250 options::OPT_fno_optimize_sibling_calls))
2251 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002252
Eric Christopher006208c2013-04-04 06:29:47 +00002253 // Handle segmented stacks.
2254 if (Args.hasArg(options::OPT_fsplit_stack))
2255 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002256
2257 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2258 // This alias option is being used to simplify the getLastArg logic.
2259 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2260 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002261
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002262 // Handle various floating point optimization flags, mapping them to the
2263 // appropriate LLVM code generation flags. The pattern for all of these is to
2264 // default off the codegen optimizations, and if any flag enables them and no
2265 // flag disables them after the flag enabling them, enable the codegen
2266 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002267 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002268 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002269 options::OPT_ffinite_math_only,
2270 options::OPT_fno_finite_math_only,
2271 options::OPT_fhonor_infinities,
2272 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002273 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2274 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002275 A->getOption().getID() != options::OPT_fhonor_infinities)
2276 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002277 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002278 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002279 options::OPT_ffinite_math_only,
2280 options::OPT_fno_finite_math_only,
2281 options::OPT_fhonor_nans,
2282 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002283 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2284 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002285 A->getOption().getID() != options::OPT_fhonor_nans)
2286 CmdArgs.push_back("-menable-no-nans");
2287
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002288 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2289 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002290 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002291 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002292 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002293 options::OPT_fno_math_errno)) {
2294 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2295 // However, turning *off* -ffast_math merely restores the toolchain default
2296 // (which may be false).
2297 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2298 A->getOption().getID() == options::OPT_ffast_math ||
2299 A->getOption().getID() == options::OPT_Ofast)
2300 MathErrno = false;
2301 else if (A->getOption().getID() == options::OPT_fmath_errno)
2302 MathErrno = true;
2303 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002304 if (MathErrno)
2305 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002306
2307 // There are several flags which require disabling very specific
2308 // optimizations. Any of these being disabled forces us to turn off the
2309 // entire set of LLVM optimizations, so collect them through all the flag
2310 // madness.
2311 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002312 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002313 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002314 options::OPT_funsafe_math_optimizations,
2315 options::OPT_fno_unsafe_math_optimizations,
2316 options::OPT_fassociative_math,
2317 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002318 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2319 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002320 A->getOption().getID() != options::OPT_fno_associative_math)
2321 AssociativeMath = true;
2322 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002323 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002324 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002325 options::OPT_funsafe_math_optimizations,
2326 options::OPT_fno_unsafe_math_optimizations,
2327 options::OPT_freciprocal_math,
2328 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002329 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2330 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002331 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2332 ReciprocalMath = true;
2333 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002334 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002335 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002336 options::OPT_funsafe_math_optimizations,
2337 options::OPT_fno_unsafe_math_optimizations,
2338 options::OPT_fsigned_zeros,
2339 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002340 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2341 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002342 A->getOption().getID() != options::OPT_fsigned_zeros)
2343 SignedZeros = false;
2344 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002345 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002346 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002347 options::OPT_funsafe_math_optimizations,
2348 options::OPT_fno_unsafe_math_optimizations,
2349 options::OPT_ftrapping_math,
2350 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002351 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2352 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002353 A->getOption().getID() != options::OPT_ftrapping_math)
2354 TrappingMath = false;
2355 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2356 !TrappingMath)
2357 CmdArgs.push_back("-menable-unsafe-fp-math");
2358
Lang Hamesaa53b932012-07-06 00:59:19 +00002359
2360 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002361 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002362 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002363 options::OPT_ffp_contract)) {
2364 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002365 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002366 if (Val == "fast" || Val == "on" || Val == "off") {
2367 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2368 } else {
2369 D.Diag(diag::err_drv_unsupported_option_argument)
2370 << A->getOption().getName() << Val;
2371 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002372 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2373 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002374 // If fast-math is set then set the fp-contract mode to fast.
2375 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2376 }
2377 }
2378
Bob Wilson6a039162012-07-19 03:52:53 +00002379 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2380 // and if we find them, tell the frontend to provide the appropriate
2381 // preprocessor macros. This is distinct from enabling any optimizations as
2382 // these options induce language changes which must survive serialization
2383 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002384 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2385 options::OPT_fno_fast_math))
2386 if (!A->getOption().matches(options::OPT_fno_fast_math))
2387 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002388 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2389 if (A->getOption().matches(options::OPT_ffinite_math_only))
2390 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002391
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002392 // Decide whether to use verbose asm. Verbose assembly is the default on
2393 // toolchains which have the integrated assembler on by default.
2394 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2395 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002396 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002397 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002398 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002399
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002400 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2401 CmdArgs.push_back("-mdebug-pass");
2402 CmdArgs.push_back("Structure");
2403 }
2404 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2405 CmdArgs.push_back("-mdebug-pass");
2406 CmdArgs.push_back("Arguments");
2407 }
2408
John McCall8517abc2010-02-19 02:45:38 +00002409 // Enable -mconstructor-aliases except on darwin, where we have to
2410 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002411 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002412 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002413
John McCall7ef5cb32011-03-18 02:56:14 +00002414 // Darwin's kernel doesn't support guard variables; just die if we
2415 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002416 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002417 CmdArgs.push_back("-fforbid-guard-variables");
2418
Douglas Gregordbe39272011-02-01 15:15:22 +00002419 if (Args.hasArg(options::OPT_mms_bitfields)) {
2420 CmdArgs.push_back("-mms-bitfields");
2421 }
John McCall8517abc2010-02-19 02:45:38 +00002422
Daniel Dunbar306945d2009-09-16 06:17:29 +00002423 // This is a coarse approximation of what llvm-gcc actually does, both
2424 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2425 // complicated ways.
2426 bool AsynchronousUnwindTables =
2427 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2428 options::OPT_fno_asynchronous_unwind_tables,
2429 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002430 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002431 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2432 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002433 CmdArgs.push_back("-munwind-tables");
2434
Chandler Carruth05fb5852012-11-21 23:40:23 +00002435 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002436
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002437 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2438 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002439 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002440 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002441
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002442 // FIXME: Handle -mtune=.
2443 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002444
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002445 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002446 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002447 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002448 }
2449
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002450 // Add the target cpu
2451 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2452 llvm::Triple ETriple(ETripleStr);
2453 std::string CPU = getCPUName(Args, ETriple);
2454 if (!CPU.empty()) {
2455 CmdArgs.push_back("-target-cpu");
2456 CmdArgs.push_back(Args.MakeArgString(CPU));
2457 }
2458
Rafael Espindolaeb265472013-08-21 21:59:03 +00002459 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2460 CmdArgs.push_back("-mfpmath");
2461 CmdArgs.push_back(A->getValue());
2462 }
2463
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002464 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002465 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002466
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002467 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002468 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002469 default:
2470 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002471
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002472 case llvm::Triple::arm:
2473 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002474 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002475 break;
2476
Eric Christopher0b26a612010-03-02 02:41:08 +00002477 case llvm::Triple::mips:
2478 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002479 case llvm::Triple::mips64:
2480 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002481 AddMIPSTargetArgs(Args, CmdArgs);
2482 break;
2483
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002484 case llvm::Triple::sparc:
2485 AddSparcTargetArgs(Args, CmdArgs);
2486 break;
2487
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002488 case llvm::Triple::x86:
2489 case llvm::Triple::x86_64:
2490 AddX86TargetArgs(Args, CmdArgs);
2491 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002492
2493 case llvm::Triple::hexagon:
2494 AddHexagonTargetArgs(Args, CmdArgs);
2495 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002496 }
2497
Hans Wennborg75958c42013-08-08 00:17:41 +00002498 // Add clang-cl arguments.
2499 if (getToolChain().getDriver().IsCLMode())
2500 AddClangCLArgs(Args, CmdArgs);
2501
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002502 // Pass the linker version in use.
2503 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2504 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002505 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002506 }
2507
Eric Christopherb7d97e92013-04-03 01:58:53 +00002508 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002509 CmdArgs.push_back("-momit-leaf-frame-pointer");
2510
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002511 // Explicitly error on some things we know we don't support and can't just
2512 // ignore.
2513 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002514 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2515 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002516 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002517 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002518 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002519 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2520 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002521 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002522 << Unsupported->getOption().getName();
2523 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002524 }
2525
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002526 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002527 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002528 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002529 CmdArgs.push_back("-header-include-file");
2530 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2531 D.CCPrintHeadersFilename : "-");
2532 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002533 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002534 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002535
Chad Rosierbe10f982011-08-02 17:58:04 +00002536 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002537 CmdArgs.push_back("-diagnostic-log-file");
2538 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2539 D.CCLogDiagnosticsFilename : "-");
2540 }
2541
Manman Ren17bdb0f2013-11-20 20:22:14 +00002542 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2543 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002544 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002545 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002546 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2547 // FIXME: we should support specifying dwarf version with
2548 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002549 CmdArgs.push_back("-gline-tables-only");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002550 // Default is dwarf-2 for darwin.
2551 if (getToolChain().getTriple().isOSDarwin())
2552 CmdArgs.push_back("-gdwarf-2");
2553 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002554 CmdArgs.push_back("-gdwarf-2");
2555 else if (A->getOption().matches(options::OPT_gdwarf_3))
2556 CmdArgs.push_back("-gdwarf-3");
2557 else if (A->getOption().matches(options::OPT_gdwarf_4))
2558 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002559 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002560 !A->getOption().matches(options::OPT_ggdb0)) {
2561 // Default is dwarf-2 for darwin.
2562 if (getToolChain().getTriple().isOSDarwin())
2563 CmdArgs.push_back("-gdwarf-2");
2564 else
2565 CmdArgs.push_back("-g");
2566 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002567 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002568
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002569 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2570 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002571 if (Args.hasArg(options::OPT_gcolumn_info))
2572 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002573
Eric Christopher138c32b2013-09-13 22:37:55 +00002574 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002575 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2576 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002577 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002578 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002579 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002580 CmdArgs.push_back("-g");
2581 CmdArgs.push_back("-backend-option");
2582 CmdArgs.push_back("-split-dwarf=Enable");
2583 }
2584
Eric Christopher138c32b2013-09-13 22:37:55 +00002585 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2586 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2587 CmdArgs.push_back("-backend-option");
2588 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2589 }
Eric Christophereec89c22013-06-18 00:03:50 +00002590
2591 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2592
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002593 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2594 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2595
Chris Lattner3c77a352010-06-22 00:03:40 +00002596 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2597
Nick Lewycky207bce32011-04-21 23:44:07 +00002598 if (Args.hasArg(options::OPT_ftest_coverage) ||
2599 Args.hasArg(options::OPT_coverage))
2600 CmdArgs.push_back("-femit-coverage-notes");
2601 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2602 Args.hasArg(options::OPT_coverage))
2603 CmdArgs.push_back("-femit-coverage-data");
2604
Nick Lewycky480cb992011-05-04 20:46:58 +00002605 if (C.getArgs().hasArg(options::OPT_c) ||
2606 C.getArgs().hasArg(options::OPT_S)) {
2607 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002608 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002609 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002610 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002611 SmallString<128> Pwd;
2612 if (!llvm::sys::fs::current_path(Pwd)) {
2613 llvm::sys::path::append(Pwd, CoverageFilename.str());
2614 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002615 }
2616 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002617 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002618 }
2619 }
2620
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002621 // Pass options for controlling the default header search paths.
2622 if (Args.hasArg(options::OPT_nostdinc)) {
2623 CmdArgs.push_back("-nostdsysteminc");
2624 CmdArgs.push_back("-nobuiltininc");
2625 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002626 if (Args.hasArg(options::OPT_nostdlibinc))
2627 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002628 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2629 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2630 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002631
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002632 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002633 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002634 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002635
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002636 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2637
Ted Kremenekf7639e12012-03-06 20:06:33 +00002638 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002639 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002640 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002641 options::OPT_ccc_arcmt_modify,
2642 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002643 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002644 switch (A->getOption().getID()) {
2645 default:
2646 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002647 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002648 CmdArgs.push_back("-arcmt-check");
2649 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002650 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002651 CmdArgs.push_back("-arcmt-modify");
2652 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002653 case options::OPT_ccc_arcmt_migrate:
2654 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002655 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002656 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002657
2658 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2659 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002660 break;
John McCalld70fb982011-06-15 23:25:17 +00002661 }
2662 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002663 } else {
2664 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2665 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2666 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002667 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002668
Ted Kremenekf7639e12012-03-06 20:06:33 +00002669 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2670 if (ARCMTEnabled) {
2671 D.Diag(diag::err_drv_argument_not_allowed_with)
2672 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2673 }
2674 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002675 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002676
2677 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002678 options::OPT_objcmt_migrate_subscripting,
2679 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002680 // None specified, means enable them all.
2681 CmdArgs.push_back("-objcmt-migrate-literals");
2682 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002683 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002684 } else {
2685 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2686 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002687 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002688 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002689 } else {
2690 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2691 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2692 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2693 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2694 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2695 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2696 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2697 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2698 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2699 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2700 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2701 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2702 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002703 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002704 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002705 }
2706
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002707 // Add preprocessing options like -I, -D, etc. if we are using the
2708 // preprocessor.
2709 //
2710 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002711 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002712 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002713
Rafael Espindolaa7431922011-07-21 23:40:37 +00002714 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2715 // that "The compiler can only warn and ignore the option if not recognized".
2716 // When building with ccache, it will pass -D options to clang even on
2717 // preprocessed inputs and configure concludes that -fPIC is not supported.
2718 Args.ClaimAllArgs(options::OPT_D);
2719
Alp Toker7874bdc2013-11-15 20:40:58 +00002720 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002721 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2722 if (A->getOption().matches(options::OPT_O4)) {
2723 CmdArgs.push_back("-O3");
2724 D.Diag(diag::warn_O4_is_O3);
2725 } else {
2726 A->render(Args, CmdArgs);
2727 }
2728 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002729
Chad Rosier86b82082012-12-12 20:06:31 +00002730 // Don't warn about unused -flto. This can happen when we're preprocessing or
2731 // precompiling.
2732 Args.ClaimAllArgs(options::OPT_flto);
2733
Daniel Dunbar945577c2009-10-29 02:24:45 +00002734 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002735 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2736 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002737 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002738 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002739
2740 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002741 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002742 //
2743 // If a std is supplied, only add -trigraphs if it follows the
2744 // option.
2745 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2746 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002747 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002748 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002749 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002750 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002751 else
2752 Std->render(Args, CmdArgs);
2753
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002754 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2755 options::OPT_trigraphs))
2756 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002757 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002758 } else {
2759 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002760 //
2761 // FIXME: Clang doesn't correctly handle -std= when the input language
2762 // doesn't match. For the time being just ignore this for C++ inputs;
2763 // eventually we want to do all the standard defaulting here instead of
2764 // splitting it between the driver and clang -cc1.
2765 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002766 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2767 "-std=", /*Joined=*/true);
2768 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2769 CmdArgs.push_back("-std=c++11");
2770
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002771 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002772 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002773
Richard Smith282b4492013-09-04 22:50:31 +00002774 // GCC's behavior for -Wwrite-strings is a bit strange:
2775 // * In C, this "warning flag" changes the types of string literals from
2776 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2777 // for the discarded qualifier.
2778 // * In C++, this is just a normal warning flag.
2779 //
2780 // Implementing this warning correctly in C is hard, so we follow GCC's
2781 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2782 // a non-const char* in C, rather than using this crude hack.
2783 if (!types::isCXX(InputType)) {
Rafael Espindola0df9e162013-11-05 21:43:54 +00002784 DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel(
2785 diag::warn_deprecated_string_literal_conversion_c, SourceLocation());
2786 if (DiagLevel > DiagnosticsEngine::Ignored)
Richard Smith282b4492013-09-04 22:50:31 +00002787 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002788 }
2789
Chandler Carruth61fbf622011-04-23 09:27:53 +00002790 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002791 // during C++ compilation, which it is by default. GCC keeps this define even
2792 // in the presence of '-w', match this behavior bug-for-bug.
2793 if (types::isCXX(InputType) &&
2794 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2795 true)) {
2796 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002797 }
2798
Chandler Carruthe0391482010-05-22 02:21:53 +00002799 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2800 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2801 if (Asm->getOption().matches(options::OPT_fasm))
2802 CmdArgs.push_back("-fgnu-keywords");
2803 else
2804 CmdArgs.push_back("-fno-gnu-keywords");
2805 }
2806
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002807 if (ShouldDisableCFI(Args, getToolChain()))
2808 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002809
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002810 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2811 CmdArgs.push_back("-fno-dwarf-directory-asm");
2812
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002813 if (ShouldDisableAutolink(Args, getToolChain()))
2814 CmdArgs.push_back("-fno-autolink");
2815
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002816 // Add in -fdebug-compilation-dir if necessary.
2817 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002818
Richard Smith9a568822011-11-21 19:36:32 +00002819 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2820 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002821 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002822 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002823 }
2824
Richard Smith79c927b2013-11-06 19:31:51 +00002825 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2826 CmdArgs.push_back("-foperator-arrow-depth");
2827 CmdArgs.push_back(A->getValue());
2828 }
2829
Richard Smith9a568822011-11-21 19:36:32 +00002830 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2831 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002832 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002833 }
2834
Richard Smitha3d3bd22013-05-08 02:12:03 +00002835 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2836 CmdArgs.push_back("-fconstexpr-steps");
2837 CmdArgs.push_back(A->getValue());
2838 }
2839
Richard Smithb3a14522013-02-22 01:59:51 +00002840 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2841 CmdArgs.push_back("-fbracket-depth");
2842 CmdArgs.push_back(A->getValue());
2843 }
2844
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002845 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2846 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002847 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002848 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002849 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2850 } else
2851 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002852 }
2853
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002854
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002855 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002856 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002857
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002858 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2859 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002860 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002861 }
David Chisnall5778fce2009-08-31 16:41:57 +00002862
Chris Lattnere23003d2010-01-09 21:54:33 +00002863 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2864 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002865 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002866 }
2867
Chris Lattnerb35583d2010-04-07 20:49:23 +00002868 CmdArgs.push_back("-ferror-limit");
2869 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002870 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002871 else
2872 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002873
Chandler Carrutha77a7272010-05-06 04:55:18 +00002874 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2875 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002876 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002877 }
2878
2879 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2880 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002881 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002882 }
2883
Richard Smithf6f003a2011-12-16 19:06:07 +00002884 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2885 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002886 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002887 }
2888
Daniel Dunbar2c978472009-11-04 06:24:47 +00002889 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002890 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002891 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002892 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002893 } else {
2894 // If -fmessage-length=N was not specified, determine whether this is a
2895 // terminal and, if so, implicitly define -fmessage-length appropriately.
2896 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002897 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002898 }
2899
John McCallb4a99d32013-02-19 01:57:35 +00002900 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2901 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2902 options::OPT_fvisibility_ms_compat)) {
2903 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2904 CmdArgs.push_back("-fvisibility");
2905 CmdArgs.push_back(A->getValue());
2906 } else {
2907 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2908 CmdArgs.push_back("-fvisibility");
2909 CmdArgs.push_back("hidden");
2910 CmdArgs.push_back("-ftype-visibility");
2911 CmdArgs.push_back("default");
2912 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002913 }
2914
Douglas Gregor08329632010-06-15 17:05:35 +00002915 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002916
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002917 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2918
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002919 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002920 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2921 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002922 CmdArgs.push_back("-ffreestanding");
2923
Daniel Dunbare357d562009-12-03 18:42:11 +00002924 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002925 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002926 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002927 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002928 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002929 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002930 // AltiVec language extensions aren't relevant for assembling.
2931 if (!isa<PreprocessJobAction>(JA) ||
2932 Output.getType() != types::TY_PP_Asm)
2933 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002934 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2935 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002936
Peter Collingbourne32701642013-11-01 18:16:25 +00002937 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
2938 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002939
Will Dietz3676d562012-12-30 20:53:28 +00002940 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2941 options::OPT_fno_sanitize_recover,
2942 true))
2943 CmdArgs.push_back("-fno-sanitize-recover");
2944
Chad Rosierae229d52013-01-29 23:31:22 +00002945 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2946 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2947 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2948 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2949
Eric Christopher459d2712013-02-19 06:16:53 +00002950 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002951 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002952 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002953 getToolChain().getArch() == llvm::Triple::ppc64 ||
2954 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002955 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002956 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002957
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002958 if (getToolChain().SupportsProfiling())
2959 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002960
2961 // -flax-vector-conversions is default.
2962 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2963 options::OPT_fno_lax_vector_conversions))
2964 CmdArgs.push_back("-fno-lax-vector-conversions");
2965
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002966 if (Args.getLastArg(options::OPT_fapple_kext))
2967 CmdArgs.push_back("-fapple-kext");
2968
David Blaikie690f21e2012-06-14 18:55:27 +00002969 if (Args.hasFlag(options::OPT_frewrite_includes,
2970 options::OPT_fno_rewrite_includes, false))
2971 CmdArgs.push_back("-frewrite-includes");
2972
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002973 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002974 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002975 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002976 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2977 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002978
2979 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2980 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002981 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002982 }
2983
Bob Wilson14adb362012-02-03 06:27:22 +00002984 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002985
Chandler Carruth6e501032011-03-27 00:04:55 +00002986 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2987 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2988 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2989 options::OPT_fno_wrapv)) {
2990 if (A->getOption().matches(options::OPT_fwrapv))
2991 CmdArgs.push_back("-fwrapv");
2992 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2993 options::OPT_fno_strict_overflow)) {
2994 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2995 CmdArgs.push_back("-fwrapv");
2996 }
Hal Finkelce0697f2013-11-17 16:03:29 +00002997
2998 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
2999 options::OPT_fno_reroll_loops))
3000 if (A->getOption().matches(options::OPT_freroll_loops))
3001 CmdArgs.push_back("-freroll-loops");
3002
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003003 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003004 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3005 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003006
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003007 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3008
Mahesha S6a682be42012-10-27 07:47:56 +00003009
Daniel Dunbar4930e332009-11-17 08:07:36 +00003010 // -stack-protector=0 is default.
3011 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003012 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3013 options::OPT_fstack_protector_all,
3014 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003015 if (A->getOption().matches(options::OPT_fstack_protector))
3016 StackProtectorLevel = 1;
3017 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3018 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00003019 } else {
3020 StackProtectorLevel =
3021 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3022 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003023 if (StackProtectorLevel) {
3024 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003025 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003026 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003027
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003028 // --param ssp-buffer-size=
3029 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3030 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003031 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003032 if (Str.startswith("ssp-buffer-size=")) {
3033 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003034 CmdArgs.push_back("-stack-protector-buffer-size");
3035 // FIXME: Verify the argument is a valid integer.
3036 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003037 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003038 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003039 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003040 }
3041
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003042 // Translate -mstackrealign
3043 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3044 false)) {
3045 CmdArgs.push_back("-backend-option");
3046 CmdArgs.push_back("-force-align-stack");
3047 }
3048 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3049 false)) {
3050 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3051 }
3052
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003053 if (Args.hasArg(options::OPT_mstack_alignment)) {
3054 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3055 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003056 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003057 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003058 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003059 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3060 options::OPT_munaligned_access)) {
3061 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3062 CmdArgs.push_back("-backend-option");
3063 CmdArgs.push_back("-arm-strict-align");
3064 } else {
3065 CmdArgs.push_back("-backend-option");
3066 CmdArgs.push_back("-arm-no-strict-align");
3067 }
Renato Golina146a482013-08-24 14:44:41 +00003068 }
Chad Rosier60027022012-11-09 17:29:19 +00003069 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003070
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003071 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3072 options::OPT_mno_restrict_it)) {
3073 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3074 CmdArgs.push_back("-backend-option");
3075 CmdArgs.push_back("-arm-restrict-it");
3076 } else {
3077 CmdArgs.push_back("-backend-option");
3078 CmdArgs.push_back("-arm-no-restrict-it");
3079 }
3080 }
3081
Daniel Dunbard18049a2009-04-07 21:16:11 +00003082 // Forward -f options with positive and negative forms; we translate
3083 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003084 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3085 StringRef fname = A->getValue();
3086 if (!llvm::sys::fs::exists(fname))
3087 D.Diag(diag::err_drv_no_such_file) << fname;
3088 else
3089 A->render(Args, CmdArgs);
3090 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003091
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003092 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003093 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003094 CmdArgs.push_back("-fapple-kext");
3095 if (!Args.hasArg(options::OPT_fbuiltin))
3096 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003097 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003098 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003099 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003100 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003101 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003102
Nuno Lopes13c88c72009-12-16 16:59:22 +00003103 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3104 options::OPT_fno_assume_sane_operator_new))
3105 CmdArgs.push_back("-fno-assume-sane-operator-new");
3106
Daniel Dunbar4930e332009-11-17 08:07:36 +00003107 // -fblocks=0 is default.
3108 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003109 getToolChain().IsBlocksDefault()) ||
3110 (Args.hasArg(options::OPT_fgnu_runtime) &&
3111 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3112 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003113 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003114
3115 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3116 !getToolChain().hasBlocksRuntime())
3117 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003118 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003119
Douglas Gregor226173a2012-01-18 15:19:58 +00003120 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3121 // users must also pass -fcxx-modules. The latter flag will disappear once the
3122 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003123 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003124 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3125 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3126 options::OPT_fno_cxx_modules,
3127 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003128 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003129 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003130 HaveModules = true;
3131 }
3132 }
3133
Daniel Jasper07e6c402013-08-05 20:26:17 +00003134 // -fmodule-maps enables module map processing (off by default) for header
3135 // checking. It is implied by -fmodules.
3136 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3137 false)) {
3138 CmdArgs.push_back("-fmodule-maps");
3139 }
3140
Daniel Jasperac42b752013-10-21 06:34:34 +00003141 // -fmodules-decluse checks that modules used are declared so (off by
3142 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003143 if (Args.hasFlag(options::OPT_fmodules_decluse,
3144 options::OPT_fno_modules_decluse,
3145 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003146 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003147 }
3148
Daniel Jasperac42b752013-10-21 06:34:34 +00003149 // -fmodule-name specifies the module that is currently being built (or
3150 // used for header checking by -fmodule-maps).
3151 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3152 A->claim();
3153 A->render(Args, CmdArgs);
3154 }
3155
3156 // -fmodule-map-file can be used to specify a file containing module
3157 // definitions.
3158 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3159 A->claim();
3160 A->render(Args, CmdArgs);
3161 }
3162
Douglas Gregor35b04d62013-02-07 19:01:24 +00003163 // If a module path was provided, pass it along. Otherwise, use a temporary
3164 // directory.
3165 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3166 A->claim();
3167 if (HaveModules) {
3168 A->render(Args, CmdArgs);
3169 }
3170 } else if (HaveModules) {
3171 SmallString<128> DefaultModuleCache;
3172 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3173 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003174 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3175 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003176 const char Arg[] = "-fmodules-cache-path=";
3177 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3178 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003179 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3180 }
3181
3182 // Pass through all -fmodules-ignore-macro arguments.
3183 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003184 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3185 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003186
John McCalldfea9982010-04-09 19:12:06 +00003187 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003188 if (Args.hasFlag(options::OPT_fno_access_control,
3189 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003190 false))
John McCall3155f572010-04-09 19:03:51 +00003191 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003192
Anders Carlssond470fef2010-11-21 00:09:52 +00003193 // -felide-constructors is the default.
3194 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3195 options::OPT_felide_constructors,
3196 false))
3197 CmdArgs.push_back("-fno-elide-constructors");
3198
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003199 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003200 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003201 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003202 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003203
Richard Smith52be6192012-11-05 22:04:41 +00003204 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003205 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003206 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003207 Args.getLastArg(options::OPT_mkernel,
3208 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003209 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003210 D.Diag(diag::err_drv_argument_not_allowed_with)
3211 << "-fsanitize=vptr" << NoRttiArg;
3212 }
3213 }
3214
Tony Linthicum76329bf2011-12-12 21:14:55 +00003215 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003216 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003217 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003218 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003219 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003220 CmdArgs.push_back("-fshort-enums");
3221
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003222 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003223 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003224 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003225 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003226
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003227 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003228 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003229 options::OPT_fno_threadsafe_statics))
3230 CmdArgs.push_back("-fno-threadsafe-statics");
3231
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003232 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003233 if (!Args.hasFlag(
3234 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3235 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3236 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Robert Lytton6b1deb42013-11-12 10:09:22 +00003237 getToolChain().getArch() != llvm::Triple::hexagon &&
3238 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003239 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003240 CmdArgs.push_back("-fno-use-cxa-atexit");
3241
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003242 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003243 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003244 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3245 CmdArgs.push_back("-fms-extensions");
3246
Francois Pichet1b4f1632011-09-17 04:32:15 +00003247 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003248 if (Args.hasFlag(options::OPT_fms_compatibility,
3249 options::OPT_fno_ms_compatibility,
3250 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3251 Args.hasFlag(options::OPT_fms_extensions,
3252 options::OPT_fno_ms_extensions,
3253 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003254 CmdArgs.push_back("-fms-compatibility");
3255
Reid Klecknerc106fda2013-09-18 00:33:59 +00003256 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003257 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3258 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3259 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003260 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003261 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003262 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003263 else
3264 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3265 }
3266
3267
Eric Christopher5ecce122013-02-18 00:38:31 +00003268 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003269 if (Args.hasFlag(options::OPT_fborland_extensions,
3270 options::OPT_fno_borland_extensions, false))
3271 CmdArgs.push_back("-fborland-extensions");
3272
Francois Pichet02744872011-09-01 16:38:08 +00003273 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3274 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003275 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3276 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003277 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003278 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003279
Chandler Carruthe03aa552010-04-17 20:17:31 +00003280 // -fgnu-keywords default varies depending on language; only pass if
3281 // specified.
3282 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003283 options::OPT_fno_gnu_keywords))
3284 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003285
Rafael Espindola922a6242011-06-02 17:30:53 +00003286 if (Args.hasFlag(options::OPT_fgnu89_inline,
3287 options::OPT_fno_gnu89_inline,
3288 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003289 CmdArgs.push_back("-fgnu89-inline");
3290
Chad Rosier9c76d242012-03-15 22:31:42 +00003291 if (Args.hasArg(options::OPT_fno_inline))
3292 CmdArgs.push_back("-fno-inline");
3293
Chad Rosier64d6be92012-03-06 21:17:19 +00003294 if (Args.hasArg(options::OPT_fno_inline_functions))
3295 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003296
John McCall5fb5df92012-06-20 06:18:46 +00003297 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003298
John McCall5fb5df92012-06-20 06:18:46 +00003299 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003300 // legacy is the default. Next runtime is always legacy dispatch and
3301 // -fno-objc-legacy-dispatch gets ignored silently.
3302 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003303 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3304 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003305 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003306 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003307 if (getToolChain().UseObjCMixedDispatch())
3308 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3309 else
3310 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3311 }
3312 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003313
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003314 // When ObjectiveC legacy runtime is in effect on MacOSX,
3315 // turn on the option to do Array/Dictionary subscripting
3316 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003317 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3318 getToolChain().getTriple().isMacOSX() &&
3319 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3320 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003321 objcRuntime.isNeXTFamily())
3322 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3323
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003324 // -fencode-extended-block-signature=1 is default.
3325 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3326 CmdArgs.push_back("-fencode-extended-block-signature");
3327 }
3328
John McCall24fc0de2011-07-06 00:26:06 +00003329 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3330 // NOTE: This logic is duplicated in ToolChains.cpp.
3331 bool ARC = isObjCAutoRefCount(Args);
3332 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003333 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003334
John McCall24fc0de2011-07-06 00:26:06 +00003335 CmdArgs.push_back("-fobjc-arc");
3336
Chandler Carruth491db322011-11-04 07:34:47 +00003337 // FIXME: It seems like this entire block, and several around it should be
3338 // wrapped in isObjC, but for now we just use it here as this is where it
3339 // was being used previously.
3340 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3341 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3342 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3343 else
3344 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3345 }
3346
John McCall24fc0de2011-07-06 00:26:06 +00003347 // Allow the user to enable full exceptions code emission.
3348 // We define off for Objective-CC, on for Objective-C++.
3349 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3350 options::OPT_fno_objc_arc_exceptions,
3351 /*default*/ types::isCXX(InputType)))
3352 CmdArgs.push_back("-fobjc-arc-exceptions");
3353 }
3354
3355 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3356 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003357 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003358 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003359
John McCall24fc0de2011-07-06 00:26:06 +00003360 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3361 // takes precedence.
3362 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3363 if (!GCArg)
3364 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3365 if (GCArg) {
3366 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003367 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003368 << GCArg->getAsString(Args);
3369 } else if (getToolChain().SupportsObjCGC()) {
3370 GCArg->render(Args, CmdArgs);
3371 } else {
3372 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003373 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003374 << GCArg->getAsString(Args);
3375 }
3376 }
3377
John McCallb5f652e2011-06-22 00:53:57 +00003378 // Add exception args.
3379 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003380 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003381
3382 if (getToolChain().UseSjLjExceptions())
3383 CmdArgs.push_back("-fsjlj-exceptions");
3384
3385 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003386 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3387 options::OPT_fno_assume_sane_operator_new))
3388 CmdArgs.push_back("-fno-assume-sane-operator-new");
3389
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003390 // -fconstant-cfstrings is default, and may be subject to argument translation
3391 // on Darwin.
3392 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3393 options::OPT_fno_constant_cfstrings) ||
3394 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3395 options::OPT_mno_constant_cfstrings))
3396 CmdArgs.push_back("-fno-constant-cfstrings");
3397
John Thompsoned4e2952009-11-05 20:14:16 +00003398 // -fshort-wchar default varies depending on platform; only
3399 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003400 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3401 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003402
Hans Wennborg28c96312013-07-31 23:39:13 +00003403 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003404 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003405 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003406 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003407 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003408
Daniel Dunbar096ed292011-10-05 21:04:55 +00003409 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3410 // -fno-pack-struct doesn't apply to -fpack-struct=.
3411 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003412 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003413 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003414 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003415 } else if (Args.hasFlag(options::OPT_fpack_struct,
3416 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003417 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003418 }
3419
Robert Lytton0e076492013-08-13 09:43:10 +00003420 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003421 if (!Args.hasArg(options::OPT_fcommon))
3422 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003423 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003424 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003425
Daniel Dunbard18049a2009-04-07 21:16:11 +00003426 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003427 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003428 CmdArgs.push_back("-fno-common");
3429
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003430 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003431 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003432 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003433 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003434 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003435 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3436
Daniel Dunbar6358d682010-10-15 22:30:42 +00003437 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3438 if (!Args.hasFlag(options::OPT_ffor_scope,
3439 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003440 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003441 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3442
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003443 // -fcaret-diagnostics is default.
3444 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3445 options::OPT_fno_caret_diagnostics, true))
3446 CmdArgs.push_back("-fno-caret-diagnostics");
3447
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003448 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003449 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003450 options::OPT_fno_diagnostics_fixit_info))
3451 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003452
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003453 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003454 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003455 options::OPT_fno_diagnostics_show_option))
3456 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003457
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003458 if (const Arg *A =
3459 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3460 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003461 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003462 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003463
Douglas Gregor643c9222011-05-21 17:07:29 +00003464 if (const Arg *A =
3465 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3466 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003467 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003468 }
3469
Chandler Carruthb6766f02011-03-27 01:50:55 +00003470 if (Arg *A = Args.getLastArg(
3471 options::OPT_fdiagnostics_show_note_include_stack,
3472 options::OPT_fno_diagnostics_show_note_include_stack)) {
3473 if (A->getOption().matches(
3474 options::OPT_fdiagnostics_show_note_include_stack))
3475 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3476 else
3477 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3478 }
3479
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003480 // Color diagnostics are the default, unless the terminal doesn't support
3481 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003482 // Support both clang's -f[no-]color-diagnostics and gcc's
3483 // -f[no-]diagnostics-colors[=never|always|auto].
3484 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3485 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3486 it != ie; ++it) {
3487 const Option &O = (*it)->getOption();
3488 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3489 !O.matches(options::OPT_fdiagnostics_color) &&
3490 !O.matches(options::OPT_fno_color_diagnostics) &&
3491 !O.matches(options::OPT_fno_diagnostics_color) &&
3492 !O.matches(options::OPT_fdiagnostics_color_EQ))
3493 continue;
3494
3495 (*it)->claim();
3496 if (O.matches(options::OPT_fcolor_diagnostics) ||
3497 O.matches(options::OPT_fdiagnostics_color)) {
3498 ShowColors = Colors_On;
3499 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3500 O.matches(options::OPT_fno_diagnostics_color)) {
3501 ShowColors = Colors_Off;
3502 } else {
3503 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3504 StringRef value((*it)->getValue());
3505 if (value == "always")
3506 ShowColors = Colors_On;
3507 else if (value == "never")
3508 ShowColors = Colors_Off;
3509 else if (value == "auto")
3510 ShowColors = Colors_Auto;
3511 else
3512 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3513 << ("-fdiagnostics-color=" + value).str();
3514 }
3515 }
3516 if (ShowColors == Colors_On ||
3517 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003518 CmdArgs.push_back("-fcolor-diagnostics");
3519
Nico Rieck7857d462013-09-11 00:38:02 +00003520 if (Args.hasArg(options::OPT_fansi_escape_codes))
3521 CmdArgs.push_back("-fansi-escape-codes");
3522
Daniel Dunbardb097022009-06-08 21:13:54 +00003523 if (!Args.hasFlag(options::OPT_fshow_source_location,
3524 options::OPT_fno_show_source_location))
3525 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003526
Douglas Gregor643c9222011-05-21 17:07:29 +00003527 if (!Args.hasFlag(options::OPT_fshow_column,
3528 options::OPT_fno_show_column,
3529 true))
3530 CmdArgs.push_back("-fno-show-column");
3531
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003532 if (!Args.hasFlag(options::OPT_fspell_checking,
3533 options::OPT_fno_spell_checking))
3534 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003535
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003536
Chad Rosierc8e56e82012-12-05 21:08:21 +00003537 // -fno-asm-blocks is default.
3538 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3539 false))
3540 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003541
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003542 // Enable vectorization per default according to the optimization level
3543 // selected. For optimization levels that want vectorization we use the alias
3544 // option to simplify the hasFlag logic.
3545 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3546 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003547 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003548 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003549 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003550 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003551
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003552 // -fslp-vectorize is default.
3553 if (Args.hasFlag(options::OPT_fslp_vectorize,
3554 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003555 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003556
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003557 // -fno-slp-vectorize-aggressive is default.
3558 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003559 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003560 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003561
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003562 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3563 A->render(Args, CmdArgs);
3564
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003565 // -fdollars-in-identifiers default varies depending on platform and
3566 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003567 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003568 options::OPT_fno_dollars_in_identifiers)) {
3569 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003570 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003571 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003572 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003573 }
3574
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003575 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3576 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003577 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003578 options::OPT_fno_unit_at_a_time)) {
3579 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003580 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003581 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003582
Eli Friedman055c9702011-11-02 01:53:16 +00003583 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3584 options::OPT_fno_apple_pragma_pack, false))
3585 CmdArgs.push_back("-fapple-pragma-pack");
3586
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003587 // le32-specific flags:
3588 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3589 // by default.
3590 if (getToolChain().getArch() == llvm::Triple::le32) {
3591 CmdArgs.push_back("-fno-math-builtin");
3592 }
3593
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003594 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003595 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003596 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003597#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003598 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003599 (getToolChain().getArch() == llvm::Triple::arm ||
3600 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003601 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3602 CmdArgs.push_back("-fno-builtin-strcat");
3603 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3604 CmdArgs.push_back("-fno-builtin-strcpy");
3605 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003606#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003607
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003608 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003609 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003610 options::OPT_traditional_cpp)) {
3611 if (isa<PreprocessJobAction>(JA))
3612 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003613 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003614 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003615 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003616
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003617 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003618 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003619
3620 // Handle serialized diagnostics.
3621 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3622 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003623 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003624 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003625
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003626 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3627 CmdArgs.push_back("-fretain-comments-from-system-headers");
3628
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003629 // Forward -fcomment-block-commands to -cc1.
3630 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003631 // Forward -fparse-all-comments to -cc1.
3632 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003633
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003634 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3635 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003636 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003637 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3638 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003639 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003640
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003641 // We translate this by hand to the -cc1 argument, since nightly test uses
3642 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003643 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003644 CmdArgs.push_back("-disable-llvm-optzns");
3645 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003646 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003647 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003648
Daniel Dunbard67a3222009-03-30 06:36:42 +00003649 if (Output.getType() == types::TY_Dependencies) {
3650 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003651 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003652 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003653 CmdArgs.push_back(Output.getFilename());
3654 } else {
3655 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003656 }
3657
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003658 for (InputInfoList::const_iterator
3659 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3660 const InputInfo &II = *it;
3661 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003662 if (Args.hasArg(options::OPT_rewrite_objc))
3663 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3664 else
3665 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003666 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003667 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003668 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003669 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003670 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003671
Chris Lattnere9d7d782009-11-03 19:50:27 +00003672 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3673
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003674 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003675
3676 // Optionally embed the -cc1 level arguments into the debug info, for build
3677 // analysis.
3678 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003679 ArgStringList OriginalArgs;
3680 for (ArgList::const_iterator it = Args.begin(),
3681 ie = Args.end(); it != ie; ++it)
3682 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003683
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003684 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003685 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003686 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003687 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003688 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003689 }
3690 CmdArgs.push_back("-dwarf-debug-flags");
3691 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3692 }
3693
Eric Christopherd3804002013-02-22 20:12:52 +00003694 // Add the split debug info name to the command lines here so we
3695 // can propagate it to the backend.
3696 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003697 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003698 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003699 const char *SplitDwarfOut;
3700 if (SplitDwarf) {
3701 CmdArgs.push_back("-split-dwarf-file");
3702 SplitDwarfOut = SplitDebugName(Args, Inputs);
3703 CmdArgs.push_back(SplitDwarfOut);
3704 }
3705
3706 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003707 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3708 tools::visualstudio::Compile CL(getToolChain());
3709 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3710 LinkingOutput);
3711 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3712 } else {
3713 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3714 }
3715
Daniel Dunbar17731772009-03-23 19:03:36 +00003716
Eric Christopherf1545832013-02-22 23:50:16 +00003717 // Handle the debug info splitting at object creation time if we're
3718 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003719 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003720 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003721 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003722
Roman Divacky178e01602011-02-10 16:52:03 +00003723 if (Arg *A = Args.getLastArg(options::OPT_pg))
3724 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003725 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003726 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003727
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003728 // Claim some arguments which clang supports automatically.
3729
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003730 // -fpch-preprocess is used with gcc to add a special marker in the output to
3731 // include the PCH file. Clang's PTH solution is completely transparent, so we
3732 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003733 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003734
Daniel Dunbar17731772009-03-23 19:03:36 +00003735 // Claim some arguments which clang doesn't support, but we don't
3736 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003737 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3738 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003739
Rafael Espindolab0092d72013-09-04 19:37:35 +00003740 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003741 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003742}
3743
John McCall5fb5df92012-06-20 06:18:46 +00003744/// Add options related to the Objective-C runtime/ABI.
3745///
3746/// Returns true if the runtime is non-fragile.
3747ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3748 ArgStringList &cmdArgs,
3749 RewriteKind rewriteKind) const {
3750 // Look for the controlling runtime option.
3751 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3752 options::OPT_fgnu_runtime,
3753 options::OPT_fobjc_runtime_EQ);
3754
3755 // Just forward -fobjc-runtime= to the frontend. This supercedes
3756 // options about fragility.
3757 if (runtimeArg &&
3758 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3759 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003760 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003761 if (runtime.tryParse(value)) {
3762 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3763 << value;
3764 }
3765
3766 runtimeArg->render(args, cmdArgs);
3767 return runtime;
3768 }
3769
3770 // Otherwise, we'll need the ABI "version". Version numbers are
3771 // slightly confusing for historical reasons:
3772 // 1 - Traditional "fragile" ABI
3773 // 2 - Non-fragile ABI, version 1
3774 // 3 - Non-fragile ABI, version 2
3775 unsigned objcABIVersion = 1;
3776 // If -fobjc-abi-version= is present, use that to set the version.
3777 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003778 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003779 if (value == "1")
3780 objcABIVersion = 1;
3781 else if (value == "2")
3782 objcABIVersion = 2;
3783 else if (value == "3")
3784 objcABIVersion = 3;
3785 else
3786 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3787 << value;
3788 } else {
3789 // Otherwise, determine if we are using the non-fragile ABI.
3790 bool nonFragileABIIsDefault =
3791 (rewriteKind == RK_NonFragile ||
3792 (rewriteKind == RK_None &&
3793 getToolChain().IsObjCNonFragileABIDefault()));
3794 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3795 options::OPT_fno_objc_nonfragile_abi,
3796 nonFragileABIIsDefault)) {
3797 // Determine the non-fragile ABI version to use.
3798#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3799 unsigned nonFragileABIVersion = 1;
3800#else
3801 unsigned nonFragileABIVersion = 2;
3802#endif
3803
3804 if (Arg *abiArg = args.getLastArg(
3805 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003806 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003807 if (value == "1")
3808 nonFragileABIVersion = 1;
3809 else if (value == "2")
3810 nonFragileABIVersion = 2;
3811 else
3812 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3813 << value;
3814 }
3815
3816 objcABIVersion = 1 + nonFragileABIVersion;
3817 } else {
3818 objcABIVersion = 1;
3819 }
3820 }
3821
3822 // We don't actually care about the ABI version other than whether
3823 // it's non-fragile.
3824 bool isNonFragile = objcABIVersion != 1;
3825
3826 // If we have no runtime argument, ask the toolchain for its default runtime.
3827 // However, the rewriter only really supports the Mac runtime, so assume that.
3828 ObjCRuntime runtime;
3829 if (!runtimeArg) {
3830 switch (rewriteKind) {
3831 case RK_None:
3832 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3833 break;
3834 case RK_Fragile:
3835 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3836 break;
3837 case RK_NonFragile:
3838 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3839 break;
3840 }
3841
3842 // -fnext-runtime
3843 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3844 // On Darwin, make this use the default behavior for the toolchain.
3845 if (getToolChain().getTriple().isOSDarwin()) {
3846 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3847
3848 // Otherwise, build for a generic macosx port.
3849 } else {
3850 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3851 }
3852
3853 // -fgnu-runtime
3854 } else {
3855 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003856 // Legacy behaviour is to target the gnustep runtime if we are i
3857 // non-fragile mode or the GCC runtime in fragile mode.
3858 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003859 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003860 else
3861 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003862 }
3863
3864 cmdArgs.push_back(args.MakeArgString(
3865 "-fobjc-runtime=" + runtime.getAsString()));
3866 return runtime;
3867}
3868
Hans Wennborg75958c42013-08-08 00:17:41 +00003869void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3870 unsigned RTOptionID = options::OPT__SLASH_MT;
3871
Hans Wennborgf1a74252013-09-10 20:18:04 +00003872 if (Args.hasArg(options::OPT__SLASH_LDd))
3873 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3874 // but defining _DEBUG is sticky.
3875 RTOptionID = options::OPT__SLASH_MTd;
3876
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003877 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003878 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003879
Hans Wennborg75958c42013-08-08 00:17:41 +00003880 switch(RTOptionID) {
3881 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003882 if (Args.hasArg(options::OPT__SLASH_LDd))
3883 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003884 CmdArgs.push_back("-D_MT");
3885 CmdArgs.push_back("-D_DLL");
3886 CmdArgs.push_back("--dependent-lib=msvcrt");
3887 break;
3888 case options::OPT__SLASH_MDd:
3889 CmdArgs.push_back("-D_DEBUG");
3890 CmdArgs.push_back("-D_MT");
3891 CmdArgs.push_back("-D_DLL");
3892 CmdArgs.push_back("--dependent-lib=msvcrtd");
3893 break;
3894 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003895 if (Args.hasArg(options::OPT__SLASH_LDd))
3896 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003897 CmdArgs.push_back("-D_MT");
3898 CmdArgs.push_back("--dependent-lib=libcmt");
3899 break;
3900 case options::OPT__SLASH_MTd:
3901 CmdArgs.push_back("-D_DEBUG");
3902 CmdArgs.push_back("-D_MT");
3903 CmdArgs.push_back("--dependent-lib=libcmtd");
3904 break;
3905 default:
3906 llvm_unreachable("Unexpected option ID.");
3907 }
3908
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003909 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3910 // users want. The /Za flag to cl.exe turns this off, but it's not
3911 // implemented in clang.
3912 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003913
3914 // FIXME: Make this default for the win32 triple.
3915 CmdArgs.push_back("-cxx-abi");
3916 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00003917
3918 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3919 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003920
3921 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3922 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003923 if (Args.hasArg(options::OPT__SLASH_fallback))
3924 CmdArgs.push_back("msvc-fallback");
3925 else
3926 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003927 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003928}
3929
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003930void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003931 const InputInfo &Output,
3932 const InputInfoList &Inputs,
3933 const ArgList &Args,
3934 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003935 ArgStringList CmdArgs;
3936
3937 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3938 const InputInfo &Input = Inputs[0];
3939
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003940 // Don't warn about "clang -w -c foo.s"
3941 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003942 // and "clang -emit-llvm -c foo.s"
3943 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003944
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003945 // Invoke ourselves in -cc1as mode.
3946 //
3947 // FIXME: Implement custom jobs for internal actions.
3948 CmdArgs.push_back("-cc1as");
3949
3950 // Add the "effective" target triple.
3951 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003952 std::string TripleStr =
3953 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003954 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3955
3956 // Set the output mode, we currently only expect to be used as a real
3957 // assembler.
3958 CmdArgs.push_back("-filetype");
3959 CmdArgs.push_back("obj");
3960
Eric Christopher45f2e712012-12-18 00:31:10 +00003961 // Set the main file name, so that debug info works even with
3962 // -save-temps or preprocessed assembly.
3963 CmdArgs.push_back("-main-file-name");
3964 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3965
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003966 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003967 const llvm::Triple &Triple = getToolChain().getTriple();
3968 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003969 if (!CPU.empty()) {
3970 CmdArgs.push_back("-target-cpu");
3971 CmdArgs.push_back(Args.MakeArgString(CPU));
3972 }
3973
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003974 // Add the target features
3975 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003976 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00003977
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003978 // Ignore explicit -force_cpusubtype_ALL option.
3979 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003980
Eric Christopherfc3ee562012-01-10 00:38:01 +00003981 // Determine the original source input.
3982 const Action *SourceAction = &JA;
3983 while (SourceAction->getKind() != Action::InputClass) {
3984 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3985 SourceAction = SourceAction->getInputs()[0];
3986 }
3987
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003988 // Forward -g and handle debug info related flags, assuming we are dealing
3989 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003990 if (SourceAction->getType() == types::TY_Asm ||
3991 SourceAction->getType() == types::TY_PP_Asm) {
3992 Args.ClaimAllArgs(options::OPT_g_Group);
3993 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3994 if (!A->getOption().matches(options::OPT_g0))
3995 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003996
3997 // Add the -fdebug-compilation-dir flag if needed.
3998 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003999
4000 // Set the AT_producer to the clang version when using the integrated
4001 // assembler on assembly source files.
4002 CmdArgs.push_back("-dwarf-debug-producer");
4003 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004004 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004005
4006 // Optionally embed the -cc1as level arguments into the debug info, for build
4007 // analysis.
4008 if (getToolChain().UseDwarfDebugFlags()) {
4009 ArgStringList OriginalArgs;
4010 for (ArgList::const_iterator it = Args.begin(),
4011 ie = Args.end(); it != ie; ++it)
4012 (*it)->render(Args, OriginalArgs);
4013
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004014 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004015 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4016 Flags += Exec;
4017 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4018 Flags += " ";
4019 Flags += OriginalArgs[i];
4020 }
4021 CmdArgs.push_back("-dwarf-debug-flags");
4022 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4023 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004024
4025 // FIXME: Add -static support, once we have it.
4026
David Blaikie9260ed62013-07-25 21:19:01 +00004027 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4028 getToolChain().getDriver());
4029
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004030 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004031
4032 assert(Output.isFilename() && "Unexpected lipo output.");
4033 CmdArgs.push_back("-o");
4034 CmdArgs.push_back(Output.getFilename());
4035
Daniel Dunbarb440f562010-08-02 02:38:21 +00004036 assert(Input.isFilename() && "Invalid input.");
4037 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004038
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004039 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004040 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004041
4042 // Handle the debug info splitting at object creation time if we're
4043 // creating an object.
4044 // TODO: Currently only works on linux with newer objcopy.
4045 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004046 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004047 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4048 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004049}
4050
Daniel Dunbara3246a02009-03-18 08:07:30 +00004051void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004052 const InputInfo &Output,
4053 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004054 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004055 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004056 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004057 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004058
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004059 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004060 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004061 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004062 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004063 // Don't forward any -g arguments to assembly steps.
4064 if (isa<AssembleJobAction>(JA) &&
4065 A->getOption().matches(options::OPT_g_Group))
4066 continue;
4067
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004068 // Don't forward any -W arguments to assembly and link steps.
4069 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4070 A->getOption().matches(options::OPT_W_Group))
4071 continue;
4072
Daniel Dunbar2da02722009-03-19 07:55:12 +00004073 // It is unfortunate that we have to claim here, as this means
4074 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004075 // platforms using a generic gcc, even if we are just using gcc
4076 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004077 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004078 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004079 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004080 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004081
Daniel Dunbar4e295052010-01-25 22:35:08 +00004082 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004083
4084 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004085 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004086 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004087 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004088
4089 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004090 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004091 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004092 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004093 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004094 else if (Arch == llvm::Triple::ppc64le)
4095 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004096 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004097 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004098 }
4099
Daniel Dunbar5716d872009-05-02 21:41:52 +00004100 // Try to force gcc to match the tool chain we want, if we recognize
4101 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004102 //
4103 // FIXME: The triple class should directly provide the information we want
4104 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004105 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004106 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004107 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4108 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004109 CmdArgs.push_back("-m64");
4110
Daniel Dunbarb440f562010-08-02 02:38:21 +00004111 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004112 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004113 CmdArgs.push_back(Output.getFilename());
4114 } else {
4115 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004116 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004117 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004118
Tony Linthicum76329bf2011-12-12 21:14:55 +00004119 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4120 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004121
4122 // Only pass -x if gcc will understand it; otherwise hope gcc
4123 // understands the suffix correctly. The main use case this would go
4124 // wrong in is for linker inputs if they happened to have an odd
4125 // suffix; really the only way to get this to happen is a command
4126 // like '-x foobar a.c' which will treat a.c like a linker input.
4127 //
4128 // FIXME: For the linker case specifically, can we safely convert
4129 // inputs into '-Wl,' options?
4130 for (InputInfoList::const_iterator
4131 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4132 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004133
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004134 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004135 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4136 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004137 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004138 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004139 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004140 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004141 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004142 else if (II.getType() == types::TY_ModuleFile)
4143 D.Diag(diag::err_drv_no_module_support)
4144 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004145
Daniel Dunbara3246a02009-03-18 08:07:30 +00004146 if (types::canTypeBeUserSpecified(II.getType())) {
4147 CmdArgs.push_back("-x");
4148 CmdArgs.push_back(types::getTypeName(II.getType()));
4149 }
4150
Daniel Dunbarb440f562010-08-02 02:38:21 +00004151 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004152 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004153 else {
4154 const Arg &A = II.getInputArg();
4155
4156 // Reverse translate some rewritten options.
4157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4158 CmdArgs.push_back("-lstdc++");
4159 continue;
4160 }
4161
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004162 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004163 A.render(Args, CmdArgs);
4164 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004165 }
4166
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004167 const std::string customGCCName = D.getCCCGenericGCCName();
4168 const char *GCCName;
4169 if (!customGCCName.empty())
4170 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004171 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004172 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004173 } else
4174 GCCName = "gcc";
4175
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004176 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004177 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004178 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004179}
4180
Daniel Dunbar4e295052010-01-25 22:35:08 +00004181void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4182 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004183 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004184}
4185
Daniel Dunbar4e295052010-01-25 22:35:08 +00004186void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4187 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004188 const Driver &D = getToolChain().getDriver();
4189
Daniel Dunbar4e295052010-01-25 22:35:08 +00004190 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004191 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4192 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004193 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004194 else {
4195 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004196 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004197 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004198
Daniel Dunbar4e295052010-01-25 22:35:08 +00004199 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004200 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004201}
4202
Daniel Dunbar4e295052010-01-25 22:35:08 +00004203void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4204 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004205 // The types are (hopefully) good enough.
4206}
4207
Tony Linthicum76329bf2011-12-12 21:14:55 +00004208// Hexagon tools start.
4209void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4210 ArgStringList &CmdArgs) const {
4211
4212}
4213void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4214 const InputInfo &Output,
4215 const InputInfoList &Inputs,
4216 const ArgList &Args,
4217 const char *LinkingOutput) const {
4218
4219 const Driver &D = getToolChain().getDriver();
4220 ArgStringList CmdArgs;
4221
4222 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004223 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004224 CmdArgs.push_back(Args.MakeArgString(MarchString));
4225
4226 RenderExtraToolArgs(JA, CmdArgs);
4227
4228 if (Output.isFilename()) {
4229 CmdArgs.push_back("-o");
4230 CmdArgs.push_back(Output.getFilename());
4231 } else {
4232 assert(Output.isNothing() && "Unexpected output");
4233 CmdArgs.push_back("-fsyntax-only");
4234 }
4235
Matthew Curtise8f80a12012-12-06 17:49:03 +00004236 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4237 if (!SmallDataThreshold.empty())
4238 CmdArgs.push_back(
4239 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004240
Matthew Curtise5df3812012-12-07 17:23:04 +00004241 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4242 options::OPT_Xassembler);
4243
Tony Linthicum76329bf2011-12-12 21:14:55 +00004244 // Only pass -x if gcc will understand it; otherwise hope gcc
4245 // understands the suffix correctly. The main use case this would go
4246 // wrong in is for linker inputs if they happened to have an odd
4247 // suffix; really the only way to get this to happen is a command
4248 // like '-x foobar a.c' which will treat a.c like a linker input.
4249 //
4250 // FIXME: For the linker case specifically, can we safely convert
4251 // inputs into '-Wl,' options?
4252 for (InputInfoList::const_iterator
4253 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4254 const InputInfo &II = *it;
4255
4256 // Don't try to pass LLVM or AST inputs to a generic gcc.
4257 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4258 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4259 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4260 << getToolChain().getTripleString();
4261 else if (II.getType() == types::TY_AST)
4262 D.Diag(clang::diag::err_drv_no_ast_support)
4263 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004264 else if (II.getType() == types::TY_ModuleFile)
4265 D.Diag(diag::err_drv_no_module_support)
4266 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004267
4268 if (II.isFilename())
4269 CmdArgs.push_back(II.getFilename());
4270 else
4271 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4272 II.getInputArg().render(Args, CmdArgs);
4273 }
4274
4275 const char *GCCName = "hexagon-as";
4276 const char *Exec =
4277 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4278 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4279
4280}
4281void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4282 ArgStringList &CmdArgs) const {
4283 // The types are (hopefully) good enough.
4284}
4285
4286void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4287 const InputInfo &Output,
4288 const InputInfoList &Inputs,
4289 const ArgList &Args,
4290 const char *LinkingOutput) const {
4291
Matthew Curtise689b052012-12-06 15:46:07 +00004292 const toolchains::Hexagon_TC& ToolChain =
4293 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4294 const Driver &D = ToolChain.getDriver();
4295
Tony Linthicum76329bf2011-12-12 21:14:55 +00004296 ArgStringList CmdArgs;
4297
Matthew Curtise689b052012-12-06 15:46:07 +00004298 //----------------------------------------------------------------------------
4299 //
4300 //----------------------------------------------------------------------------
4301 bool hasStaticArg = Args.hasArg(options::OPT_static);
4302 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004303 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004304 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4305 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4306 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4307 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004308
Matthew Curtise689b052012-12-06 15:46:07 +00004309 //----------------------------------------------------------------------------
4310 // Silence warnings for various options
4311 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004312
Matthew Curtise689b052012-12-06 15:46:07 +00004313 Args.ClaimAllArgs(options::OPT_g_Group);
4314 Args.ClaimAllArgs(options::OPT_emit_llvm);
4315 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4316 // handled somewhere else.
4317 Args.ClaimAllArgs(options::OPT_static_libgcc);
4318
4319 //----------------------------------------------------------------------------
4320 //
4321 //----------------------------------------------------------------------------
4322 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4323 e = ToolChain.ExtraOpts.end();
4324 i != e; ++i)
4325 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004326
Matthew Curtisf10a5952012-12-06 14:16:43 +00004327 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4328 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004329
Matthew Curtise689b052012-12-06 15:46:07 +00004330 if (buildingLib) {
4331 CmdArgs.push_back("-shared");
4332 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4333 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004334 }
4335
Matthew Curtise689b052012-12-06 15:46:07 +00004336 if (hasStaticArg)
4337 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004338
Matthew Curtise8f80a12012-12-06 17:49:03 +00004339 if (buildPIE && !buildingLib)
4340 CmdArgs.push_back("-pie");
4341
4342 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4343 if (!SmallDataThreshold.empty()) {
4344 CmdArgs.push_back(
4345 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4346 }
4347
Matthew Curtise689b052012-12-06 15:46:07 +00004348 //----------------------------------------------------------------------------
4349 //
4350 //----------------------------------------------------------------------------
4351 CmdArgs.push_back("-o");
4352 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004353
Matthew Curtise689b052012-12-06 15:46:07 +00004354 const std::string MarchSuffix = "/" + MarchString;
4355 const std::string G0Suffix = "/G0";
4356 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4357 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4358 + "/";
4359 const std::string StartFilesDir = RootDir
4360 + "hexagon/lib"
4361 + (buildingLib
4362 ? MarchG0Suffix : MarchSuffix);
4363
4364 //----------------------------------------------------------------------------
4365 // moslib
4366 //----------------------------------------------------------------------------
4367 std::vector<std::string> oslibs;
4368 bool hasStandalone= false;
4369
4370 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4371 ie = Args.filtered_end(); it != ie; ++it) {
4372 (*it)->claim();
4373 oslibs.push_back((*it)->getValue());
4374 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004375 }
Matthew Curtise689b052012-12-06 15:46:07 +00004376 if (oslibs.empty()) {
4377 oslibs.push_back("standalone");
4378 hasStandalone = true;
4379 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004380
Matthew Curtise689b052012-12-06 15:46:07 +00004381 //----------------------------------------------------------------------------
4382 // Start Files
4383 //----------------------------------------------------------------------------
4384 if (incStdLib && incStartFiles) {
4385
4386 if (!buildingLib) {
4387 if (hasStandalone) {
4388 CmdArgs.push_back(
4389 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4390 }
4391 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4392 }
4393 std::string initObj = useShared ? "/initS.o" : "/init.o";
4394 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4395 }
4396
4397 //----------------------------------------------------------------------------
4398 // Library Search Paths
4399 //----------------------------------------------------------------------------
4400 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4401 for (ToolChain::path_list::const_iterator
4402 i = LibPaths.begin(),
4403 e = LibPaths.end();
4404 i != e;
4405 ++i)
4406 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4407
4408 //----------------------------------------------------------------------------
4409 //
4410 //----------------------------------------------------------------------------
4411 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4412 Args.AddAllArgs(CmdArgs, options::OPT_e);
4413 Args.AddAllArgs(CmdArgs, options::OPT_s);
4414 Args.AddAllArgs(CmdArgs, options::OPT_t);
4415 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4416
4417 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4418
4419 //----------------------------------------------------------------------------
4420 // Libraries
4421 //----------------------------------------------------------------------------
4422 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004423 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004424 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4425 CmdArgs.push_back("-lm");
4426 }
4427
4428 CmdArgs.push_back("--start-group");
4429
4430 if (!buildingLib) {
4431 for(std::vector<std::string>::iterator i = oslibs.begin(),
4432 e = oslibs.end(); i != e; ++i)
4433 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4434 CmdArgs.push_back("-lc");
4435 }
4436 CmdArgs.push_back("-lgcc");
4437
4438 CmdArgs.push_back("--end-group");
4439 }
4440
4441 //----------------------------------------------------------------------------
4442 // End files
4443 //----------------------------------------------------------------------------
4444 if (incStdLib && incStartFiles) {
4445 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4446 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4447 }
4448
4449 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004450 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004451}
4452// Hexagon tools end.
4453
Bernard Ogden31561762013-12-12 13:27:11 +00004454/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4455//
4456// FIXME: tblgen this.
4457const char *arm::getARMCPUForMArch(const ArgList &Args,
4458 const llvm::Triple &Triple) {
4459 StringRef MArch;
4460 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4461 // Otherwise, if we have -march= choose the base CPU for that arch.
4462 MArch = A->getValue();
4463 } else {
4464 // Otherwise, use the Arch from the triple.
4465 MArch = Triple.getArchName();
4466 }
4467
4468 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004469 if (MArch == "native") {
4470 std::string CPU = llvm::sys::getHostCPUName();
4471 if (CPU != "generic") {
4472 // Translate the native cpu into the architecture. The switch below will
4473 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004474 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004475 }
4476 }
4477
4478 if (Triple.getOS() == llvm::Triple::NetBSD) {
4479 if (MArch == "armv6")
4480 return "arm1176jzf-s";
4481 }
4482
4483 const char *result = llvm::StringSwitch<const char *>(MArch)
4484 .Cases("armv2", "armv2a","arm2")
4485 .Case("armv3", "arm6")
4486 .Case("armv3m", "arm7m")
4487 .Case("armv4", "strongarm")
4488 .Case("armv4t", "arm7tdmi")
4489 .Case("thumbv4t", "arm7tdmi")
4490 .Cases("armv5", "armv5t", "arm10tdmi")
4491 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4492 .Cases("armv5e", "armv5te", "arm1022e")
4493 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4494 .Case("armv5tej", "arm926ej-s")
4495 .Case("thumbv5tej", "arm926ej-s")
4496 .Cases("armv6", "armv6k", "arm1136jf-s")
4497 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4498 .Case("armv6j", "arm1136j-s")
4499 .Case("thumbv6j", "arm1136j-s")
4500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4501 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4502 .Case("armv6t2", "arm1156t2-s")
4503 .Case("thumbv6t2", "arm1156t2-s")
4504 .Cases("armv6m", "armv6-m", "cortex-m0")
4505 .Case("thumbv6m", "cortex-m0")
4506 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
4507 .Cases("thumbv7", "thumbv7a", "cortex-a8")
4508 .Cases("armv7l", "armv7-l", "cortex-a8")
4509 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
4510 .Cases("armv7s", "armv7-s", "swift")
4511 .Cases("armv7r", "armv7-r", "cortex-r4")
4512 .Case("thumbv7r", "cortex-r4")
4513 .Cases("armv7m", "armv7-m", "cortex-m3")
4514 .Case("thumbv7m", "cortex-m3")
4515 .Cases("armv7em", "armv7e-m", "cortex-m4")
4516 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
4517 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
4518 .Cases("thumbv8", "thumbv8a", "cortex-a53")
4519 .Case("ep9312", "ep9312")
4520 .Case("iwmmxt", "iwmmxt")
4521 .Case("xscale", "xscale")
4522 // If all else failed, return the most base CPU with thumb interworking
4523 // supported by LLVM.
4524 .Default(0);
4525
4526 if (result)
4527 return result;
4528
4529 return
4530 Triple.getEnvironment() == llvm::Triple::GNUEABIHF
4531 ? "arm1176jzf-s"
4532 : "arm7tdmi";
4533}
4534
4535/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
4536const char *arm::getARMTargetCPU(const ArgList &Args,
4537 const llvm::Triple &Triple) {
4538 // FIXME: Warn on inconsistent use of -mcpu and -march.
4539 // If we have -mcpu=, use that.
4540 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4541 StringRef MCPU = A->getValue();
4542 // Handle -mcpu=native.
4543 if (MCPU == "native")
4544 return llvm::sys::getHostCPUName().c_str();
4545 else
4546 return MCPU.str().c_str();
4547 }
4548
4549 return getARMCPUForMArch(Args, Triple);
4550}
4551
4552/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4553/// CPU.
4554//
4555// FIXME: This is redundant with -mcpu, why does LLVM use this.
4556// FIXME: tblgen this, or kill it!
4557const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4558 return llvm::StringSwitch<const char *>(CPU)
4559 .Case("strongarm", "v4")
4560 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4561 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4562 .Cases("arm920", "arm920t", "arm922t", "v4t")
4563 .Cases("arm940t", "ep9312","v4t")
4564 .Cases("arm10tdmi", "arm1020t", "v5")
4565 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4566 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4567 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4568 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4569 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4570 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
4571 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
4572 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4573 .Cases("cortex-r4", "cortex-r5", "v7r")
4574 .Case("cortex-m0", "v6m")
4575 .Case("cortex-m3", "v7m")
4576 .Case("cortex-m4", "v7em")
4577 .Case("cortex-a9-mp", "v7f")
4578 .Case("swift", "v7s")
4579 .Cases("cortex-a53", "cortex-a57", "v8")
4580 .Default("");
4581}
4582
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004583llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4584 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4585 // archs which Darwin doesn't use.
4586
4587 // The matching this routine does is fairly pointless, since it is neither the
4588 // complete architecture list, nor a reasonable subset. The problem is that
4589 // historically the driver driver accepts this and also ties its -march=
4590 // handling to the architecture name, so we need to be careful before removing
4591 // support for it.
4592
4593 // This code must be kept in sync with Clang's Darwin specific argument
4594 // translation.
4595
4596 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4597 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4598 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4599 .Case("ppc64", llvm::Triple::ppc64)
4600 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4601 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4602 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004603 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004604 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004605 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4606 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4607 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004608 .Case("r600", llvm::Triple::r600)
4609 .Case("nvptx", llvm::Triple::nvptx)
4610 .Case("nvptx64", llvm::Triple::nvptx64)
4611 .Case("amdil", llvm::Triple::amdil)
4612 .Case("spir", llvm::Triple::spir)
4613 .Default(llvm::Triple::UnknownArch);
4614}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004615
Bob Wilsondecc03e2012-11-23 06:14:39 +00004616const char *Clang::getBaseInputName(const ArgList &Args,
4617 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004618 return Args.MakeArgString(
4619 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004620}
4621
Bob Wilsondecc03e2012-11-23 06:14:39 +00004622const char *Clang::getBaseInputStem(const ArgList &Args,
4623 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004624 const char *Str = getBaseInputName(Args, Inputs);
4625
Chris Lattner906bb902011-01-16 08:14:11 +00004626 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004627 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004628
4629 return Str;
4630}
4631
Bob Wilsondecc03e2012-11-23 06:14:39 +00004632const char *Clang::getDependencyFileName(const ArgList &Args,
4633 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004634 // FIXME: Think about this more.
4635 std::string Res;
4636
4637 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004638 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004639 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004640 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004641 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004642 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004643 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004644}
4645
Daniel Dunbarbe220842009-03-20 16:06:39 +00004646void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004647 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004648 const InputInfoList &Inputs,
4649 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004650 const char *LinkingOutput) const {
4651 ArgStringList CmdArgs;
4652
4653 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4654 const InputInfo &Input = Inputs[0];
4655
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004656 // Determine the original source input.
4657 const Action *SourceAction = &JA;
4658 while (SourceAction->getKind() != Action::InputClass) {
4659 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4660 SourceAction = SourceAction->getInputs()[0];
4661 }
4662
Kevin Enderby319baa42013-11-18 23:30:29 +00004663 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4664 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004665 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4666 // FIXME: at run-time detect assembler capabilities or rely on version
4667 // information forwarded by -target-assembler-version (future)
4668 if (Args.hasArg(options::OPT_no_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004669 const llvm::Triple &T(getToolChain().getTriple());
4670 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004671 CmdArgs.push_back("-Q");
4672 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004673
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004674 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004675 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004676 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004677 if (Args.hasArg(options::OPT_gstabs))
4678 CmdArgs.push_back("--gstabs");
4679 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004680 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004681 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004682
Daniel Dunbarbe220842009-03-20 16:06:39 +00004683 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004684 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004685
Daniel Dunbar6d484762010-07-22 01:47:22 +00004686 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004687 if (getToolChain().getArch() == llvm::Triple::x86 ||
4688 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004689 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4690 CmdArgs.push_back("-force_cpusubtype_ALL");
4691
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004692 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004693 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004694 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004695 (!getDarwinToolChain().isTargetIPhoneOS() ||
4696 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4697 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004698 CmdArgs.push_back("-static");
4699
Daniel Dunbarbe220842009-03-20 16:06:39 +00004700 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4701 options::OPT_Xassembler);
4702
4703 assert(Output.isFilename() && "Unexpected lipo output.");
4704 CmdArgs.push_back("-o");
4705 CmdArgs.push_back(Output.getFilename());
4706
Daniel Dunbarb440f562010-08-02 02:38:21 +00004707 assert(Input.isFilename() && "Invalid input.");
4708 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004709
4710 // asm_final spec is empty.
4711
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004712 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004713 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004714 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004715}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004716
David Blaikie68e081d2011-12-20 02:48:34 +00004717void darwin::DarwinTool::anchor() {}
4718
Daniel Dunbare9ded432009-09-09 18:36:20 +00004719void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4720 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004721 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004722
Daniel Dunbarc1964212009-03-26 16:23:12 +00004723 // Derived from darwin_arch spec.
4724 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004725 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004726
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004727 // FIXME: Is this needed anymore?
4728 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004729 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004730}
4731
Bill Wendling3b2000f2012-10-02 18:02:50 +00004732bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4733 // We only need to generate a temp path for LTO if we aren't compiling object
4734 // files. When compiling source files, we run 'dsymutil' after linking. We
4735 // don't run 'dsymutil' when compiling object files.
4736 for (InputInfoList::const_iterator
4737 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4738 if (it->getType() != types::TY_Object)
4739 return true;
4740
4741 return false;
4742}
4743
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004744void darwin::Link::AddLinkArgs(Compilation &C,
4745 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004746 ArgStringList &CmdArgs,
4747 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004748 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004749 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004750
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004751 unsigned Version[3] = { 0, 0, 0 };
4752 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4753 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004754 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004755 Version[1], Version[2], HadExtra) ||
4756 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004757 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004758 << A->getAsString(Args);
4759 }
4760
4761 // Newer linkers support -demangle, pass it if supported and not disabled by
4762 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004763 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004764 // Don't pass -demangle to ld_classic.
4765 //
4766 // FIXME: This is a temporary workaround, ld should be handling this.
4767 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4768 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004769 if (getToolChain().getArch() == llvm::Triple::x86) {
4770 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4771 options::OPT_Wl_COMMA),
4772 ie = Args.filtered_end(); it != ie; ++it) {
4773 const Arg *A = *it;
4774 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004775 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004776 UsesLdClassic = true;
4777 }
4778 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004779 if (!UsesLdClassic)
4780 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004781 }
4782
Bob Wilson3d27dad2013-08-02 22:25:34 +00004783 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4784 CmdArgs.push_back("-export_dynamic");
4785
Bill Wendling313b6bf2012-11-16 23:03:00 +00004786 // If we are using LTO, then automatically create a temporary file path for
4787 // the linker to use, so that it's lifetime will extend past a possible
4788 // dsymutil step.
4789 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4790 const char *TmpPath = C.getArgs().MakeArgString(
4791 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4792 C.addTempFile(TmpPath);
4793 CmdArgs.push_back("-object_path_lto");
4794 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004795 }
4796
Daniel Dunbarc1964212009-03-26 16:23:12 +00004797 // Derived from the "link" spec.
4798 Args.AddAllArgs(CmdArgs, options::OPT_static);
4799 if (!Args.hasArg(options::OPT_static))
4800 CmdArgs.push_back("-dynamic");
4801 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4802 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4803 // here. How do we wish to handle such things?
4804 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004805
Daniel Dunbarc1964212009-03-26 16:23:12 +00004806 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004807 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004808 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004809 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004810
4811 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4812 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4813 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4814
4815 Arg *A;
4816 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4817 (A = Args.getLastArg(options::OPT_current__version)) ||
4818 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004819 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004820 << A->getAsString(Args) << "-dynamiclib";
4821
4822 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4823 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4824 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4825 } else {
4826 CmdArgs.push_back("-dylib");
4827
4828 Arg *A;
4829 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4830 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4831 (A = Args.getLastArg(options::OPT_client__name)) ||
4832 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4833 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4834 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004835 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004836 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004837
Daniel Dunbarc1964212009-03-26 16:23:12 +00004838 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4839 "-dylib_compatibility_version");
4840 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4841 "-dylib_current_version");
4842
Daniel Dunbara48823f2010-01-22 02:04:52 +00004843 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004844
4845 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4846 "-dylib_install_name");
4847 }
4848
4849 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4850 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4851 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover9c7e0352013-12-12 11:55:52 +00004852 if (DarwinTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004853 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004854 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4855 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4856 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4857 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4858 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4859 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004860 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004861 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4862 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4863 Args.AddAllArgs(CmdArgs, options::OPT_init);
4864
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004865 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004866 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004867
4868 // If we had an explicit -mios-simulator-version-min argument, honor that,
4869 // otherwise use the traditional deployment targets. We can't just check the
4870 // is-sim attribute because existing code follows this path, and the linker
4871 // may not handle the argument.
4872 //
4873 // FIXME: We may be able to remove this, once we can verify no one depends on
4874 // it.
Tim Northover9c7e0352013-12-12 11:55:52 +00004875 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004876 CmdArgs.push_back("-ios_simulator_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004877 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4878 } else if (DarwinTC.isTargetIOSBased()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004879 CmdArgs.push_back("-iphoneos_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004880 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4881 } else if (DarwinTC.isTargetMacOS()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004882 CmdArgs.push_back("-macosx_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004883 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4884 }
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004885
Daniel Dunbarc1964212009-03-26 16:23:12 +00004886 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4887 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4888 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4889 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4890 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004891
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004892 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4893 options::OPT_fno_pie,
4894 options::OPT_fno_PIE)) {
4895 if (A->getOption().matches(options::OPT_fpie) ||
4896 A->getOption().matches(options::OPT_fPIE))
4897 CmdArgs.push_back("-pie");
4898 else
4899 CmdArgs.push_back("-no_pie");
4900 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004901
4902 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4903 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4904 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4905 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4906 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4907 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4908 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4909 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4910 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4911 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4912 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4913 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4914 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4915 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4916 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4917 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004918
Daniel Dunbar84384642011-05-02 21:03:47 +00004919 // Give --sysroot= preference, over the Apple specific behavior to also use
4920 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004921 StringRef sysroot = C.getSysRoot();
4922 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004923 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004924 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004925 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4926 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004927 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004928 }
4929
Daniel Dunbarc1964212009-03-26 16:23:12 +00004930 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4931 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4932 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4933 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4934 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004935 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004936 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4937 Args.AddAllArgs(CmdArgs, options::OPT_y);
4938 Args.AddLastArg(CmdArgs, options::OPT_w);
4939 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4940 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4941 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4942 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4943 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4944 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4945 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4946 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4947 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4948 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4949 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4950 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4951}
4952
4953void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004954 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004955 const InputInfoList &Inputs,
4956 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004957 const char *LinkingOutput) const {
4958 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004959
Daniel Dunbarc1964212009-03-26 16:23:12 +00004960 // The logic here is derived from gcc's behavior; most of which
4961 // comes from specs (starting with link_command). Consult gcc for
4962 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004963 ArgStringList CmdArgs;
4964
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004965 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4966 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4967 options::OPT_ccc_arcmt_migrate)) {
4968 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4969 (*I)->claim();
4970 const char *Exec =
4971 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4972 CmdArgs.push_back(Output.getFilename());
4973 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4974 return;
4975 }
4976
Daniel Dunbarc1964212009-03-26 16:23:12 +00004977 // I'm not sure why this particular decomposition exists in gcc, but
4978 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004979 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004980
Daniel Dunbarc1964212009-03-26 16:23:12 +00004981 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4982 Args.AddAllArgs(CmdArgs, options::OPT_s);
4983 Args.AddAllArgs(CmdArgs, options::OPT_t);
4984 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4985 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004986 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004987 Args.AddAllArgs(CmdArgs, options::OPT_r);
4988
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004989 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4990 // members of static archive libraries which implement Objective-C classes or
4991 // categories.
4992 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4993 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004994
Daniel Dunbarc1964212009-03-26 16:23:12 +00004995 CmdArgs.push_back("-o");
4996 CmdArgs.push_back(Output.getFilename());
4997
Chad Rosier06fd3c62012-05-16 23:45:12 +00004998 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004999 !Args.hasArg(options::OPT_nostartfiles)) {
5000 // Derived from startfile spec.
5001 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005002 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00005003 if (getDarwinToolChain().isTargetIOSSimulator()) {
5004 // The simulator doesn't have a versioned crt1 file.
5005 CmdArgs.push_back("-ldylib1.o");
5006 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005007 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5008 CmdArgs.push_back("-ldylib1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005009 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005010 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00005011 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005012 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005013 CmdArgs.push_back("-ldylib1.10.5.o");
5014 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005015 } else {
5016 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005017 if (!Args.hasArg(options::OPT_static)) {
5018 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00005019 if (getDarwinToolChain().isTargetIOSSimulator()) {
5020 // The simulator doesn't have a versioned crt1 file.
5021 CmdArgs.push_back("-lbundle1.o");
5022 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005023 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5024 CmdArgs.push_back("-lbundle1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005025 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005026 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005027 CmdArgs.push_back("-lbundle1.o");
5028 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005029 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005030 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00005031 if (Args.hasArg(options::OPT_pg) &&
5032 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00005033 if (Args.hasArg(options::OPT_static) ||
5034 Args.hasArg(options::OPT_object) ||
5035 Args.hasArg(options::OPT_preload)) {
5036 CmdArgs.push_back("-lgcrt0.o");
5037 } else {
5038 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005039
Daniel Dunbarc1964212009-03-26 16:23:12 +00005040 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005041 }
Bob Wilsonef285b42012-07-04 00:18:41 +00005042 // By default on OS X 10.8 and later, we don't link with a crt1.o
5043 // file and the linker knows to use _main as the entry point. But,
5044 // when compiling with -pg, we need to link with the gcrt1.o file,
5045 // so pass the -no_new_main option to tell the linker to use the
5046 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00005047 if (getDarwinToolChain().isTargetMacOS() &&
5048 !getDarwinToolChain().isMacosxVersionLT(10, 8))
5049 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005050 } else {
5051 if (Args.hasArg(options::OPT_static) ||
5052 Args.hasArg(options::OPT_object) ||
5053 Args.hasArg(options::OPT_preload)) {
5054 CmdArgs.push_back("-lcrt0.o");
5055 } else {
5056 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00005057 if (getDarwinToolChain().isTargetIOSSimulator()) {
5058 // The simulator doesn't have a versioned crt1 file.
5059 CmdArgs.push_back("-lcrt1.o");
5060 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005061 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5062 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005063 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00005064 CmdArgs.push_back("-lcrt1.3.1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005065 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005066 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
5067 CmdArgs.push_back("-lcrt1.o");
5068 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
5069 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005070 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005071 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005072
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005073 // darwin_crt2 spec is empty.
5074 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005075 }
5076 }
5077 }
5078 }
5079
Tim Northover9c7e0352013-12-12 11:55:52 +00005080 if (getDarwinToolChain().isTargetMacOS() &&
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005081 Args.hasArg(options::OPT_shared_libgcc) &&
5082 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005083 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005084 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005085 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005086 }
5087 }
5088
5089 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005090
Daniel Dunbarc1964212009-03-26 16:23:12 +00005091 if (Args.hasArg(options::OPT_fopenmp))
5092 // This is more complicated in gcc...
5093 CmdArgs.push_back("-lgomp");
5094
Douglas Gregor9295df02012-05-15 21:00:27 +00005095 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5096
Bob Wilson16d93952012-05-15 18:57:39 +00005097 if (isObjCRuntimeLinked(Args) &&
5098 !Args.hasArg(options::OPT_nostdlib) &&
5099 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005100 // Avoid linking compatibility stubs on i386 mac.
5101 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005102 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005103 // If we don't have ARC or subscripting runtime support, link in the
5104 // runtime stubs. We have to do this *before* adding any of the normal
5105 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00005106 ObjCRuntime runtime =
5107 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005108 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00005109 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00005110 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00005111 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005112 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005113 CmdArgs.push_back("-framework");
5114 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005115 // Link libobj.
5116 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005117 }
John McCall31168b02011-06-15 23:02:42 +00005118
Daniel Dunbarc1964212009-03-26 16:23:12 +00005119 if (LinkingOutput) {
5120 CmdArgs.push_back("-arch_multiple");
5121 CmdArgs.push_back("-final_output");
5122 CmdArgs.push_back(LinkingOutput);
5123 }
5124
Daniel Dunbarc1964212009-03-26 16:23:12 +00005125 if (Args.hasArg(options::OPT_fnested_functions))
5126 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005127
Daniel Dunbarc1964212009-03-26 16:23:12 +00005128 if (!Args.hasArg(options::OPT_nostdlib) &&
5129 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005130 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005131 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005132
Daniel Dunbarc1964212009-03-26 16:23:12 +00005133 // link_ssp spec is empty.
5134
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005135 // Let the tool chain choose which runtime library to link.
5136 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005137 }
5138
Chad Rosier06fd3c62012-05-16 23:45:12 +00005139 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005140 !Args.hasArg(options::OPT_nostartfiles)) {
5141 // endfile_spec is empty.
5142 }
5143
5144 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5145 Args.AddAllArgs(CmdArgs, options::OPT_F);
5146
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005147 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005148 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005149 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005150}
5151
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005152void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005153 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005154 const InputInfoList &Inputs,
5155 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005156 const char *LinkingOutput) const {
5157 ArgStringList CmdArgs;
5158
5159 CmdArgs.push_back("-create");
5160 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005161
5162 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005163 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005164
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005165 for (InputInfoList::const_iterator
5166 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5167 const InputInfo &II = *it;
5168 assert(II.isFilename() && "Unexpected lipo input.");
5169 CmdArgs.push_back(II.getFilename());
5170 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005171 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005172 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005173 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005174}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005175
Daniel Dunbar88299622010-06-04 18:28:36 +00005176void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005177 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005178 const InputInfoList &Inputs,
5179 const ArgList &Args,
5180 const char *LinkingOutput) const {
5181 ArgStringList CmdArgs;
5182
Daniel Dunbareb86b042011-05-09 17:23:16 +00005183 CmdArgs.push_back("-o");
5184 CmdArgs.push_back(Output.getFilename());
5185
Daniel Dunbar88299622010-06-04 18:28:36 +00005186 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5187 const InputInfo &Input = Inputs[0];
5188 assert(Input.isFilename() && "Unexpected dsymutil input.");
5189 CmdArgs.push_back(Input.getFilename());
5190
Daniel Dunbar88299622010-06-04 18:28:36 +00005191 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005192 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005193 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005194}
5195
Eric Christopher551ef452011-08-23 17:56:55 +00005196void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005197 const InputInfo &Output,
5198 const InputInfoList &Inputs,
5199 const ArgList &Args,
5200 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005201 ArgStringList CmdArgs;
5202 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005203 CmdArgs.push_back("--debug-info");
5204 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005205 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005206
5207 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5208 const InputInfo &Input = Inputs[0];
5209 assert(Input.isFilename() && "Unexpected verify input");
5210
5211 // Grabbing the output of the earlier dsymutil run.
5212 CmdArgs.push_back(Input.getFilename());
5213
5214 const char *Exec =
5215 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5216 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5217}
5218
David Chisnallf571cde2012-02-15 13:39:01 +00005219void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5220 const InputInfo &Output,
5221 const InputInfoList &Inputs,
5222 const ArgList &Args,
5223 const char *LinkingOutput) const {
5224 ArgStringList CmdArgs;
5225
5226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5227 options::OPT_Xassembler);
5228
5229 CmdArgs.push_back("-o");
5230 CmdArgs.push_back(Output.getFilename());
5231
5232 for (InputInfoList::const_iterator
5233 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5234 const InputInfo &II = *it;
5235 CmdArgs.push_back(II.getFilename());
5236 }
5237
5238 const char *Exec =
5239 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5240 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5241}
5242
5243
5244void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5245 const InputInfo &Output,
5246 const InputInfoList &Inputs,
5247 const ArgList &Args,
5248 const char *LinkingOutput) const {
5249 // FIXME: Find a real GCC, don't hard-code versions here
5250 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5251 const llvm::Triple &T = getToolChain().getTriple();
5252 std::string LibPath = "/usr/lib/";
5253 llvm::Triple::ArchType Arch = T.getArch();
5254 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005255 case llvm::Triple::x86:
5256 GCCLibPath +=
5257 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5258 break;
5259 case llvm::Triple::x86_64:
5260 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5261 GCCLibPath += "/4.5.2/amd64/";
5262 LibPath += "amd64/";
5263 break;
5264 default:
5265 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005266 }
5267
5268 ArgStringList CmdArgs;
5269
David Chisnall272a0712012-02-29 15:06:12 +00005270 // Demangle C++ names in errors
5271 CmdArgs.push_back("-C");
5272
David Chisnallf571cde2012-02-15 13:39:01 +00005273 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5274 (!Args.hasArg(options::OPT_shared))) {
5275 CmdArgs.push_back("-e");
5276 CmdArgs.push_back("_start");
5277 }
5278
5279 if (Args.hasArg(options::OPT_static)) {
5280 CmdArgs.push_back("-Bstatic");
5281 CmdArgs.push_back("-dn");
5282 } else {
5283 CmdArgs.push_back("-Bdynamic");
5284 if (Args.hasArg(options::OPT_shared)) {
5285 CmdArgs.push_back("-shared");
5286 } else {
5287 CmdArgs.push_back("--dynamic-linker");
5288 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5289 }
5290 }
5291
5292 if (Output.isFilename()) {
5293 CmdArgs.push_back("-o");
5294 CmdArgs.push_back(Output.getFilename());
5295 } else {
5296 assert(Output.isNothing() && "Invalid output.");
5297 }
5298
5299 if (!Args.hasArg(options::OPT_nostdlib) &&
5300 !Args.hasArg(options::OPT_nostartfiles)) {
5301 if (!Args.hasArg(options::OPT_shared)) {
5302 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5303 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005304 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005305 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5306 } else {
5307 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005308 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5309 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005310 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005311 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005312 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005313 }
5314
5315 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5316
5317 Args.AddAllArgs(CmdArgs, options::OPT_L);
5318 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5319 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005320 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005321
5322 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5323
5324 if (!Args.hasArg(options::OPT_nostdlib) &&
5325 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005326 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005327 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005328 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005329 if (!Args.hasArg(options::OPT_shared)) {
5330 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005331 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005332 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005333 }
David Chisnallf571cde2012-02-15 13:39:01 +00005334 }
5335
5336 if (!Args.hasArg(options::OPT_nostdlib) &&
5337 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005338 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005339 }
David Chisnall96de9932012-02-16 16:00:47 +00005340 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005341
5342 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5343
5344 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005345 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005346 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5347}
5348
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005349void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005350 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005351 const InputInfoList &Inputs,
5352 const ArgList &Args,
5353 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005354 ArgStringList CmdArgs;
5355
5356 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5357 options::OPT_Xassembler);
5358
5359 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005360 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005361
5362 for (InputInfoList::const_iterator
5363 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5364 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005365 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005366 }
5367
5368 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005369 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005370 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005371}
5372
5373void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005374 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005375 const InputInfoList &Inputs,
5376 const ArgList &Args,
5377 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005378 ArgStringList CmdArgs;
5379
5380 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005381 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005382 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005383 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005384 }
5385
5386 if (Args.hasArg(options::OPT_static)) {
5387 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005388 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005389 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005390// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005391 CmdArgs.push_back("-Bdynamic");
5392 if (Args.hasArg(options::OPT_shared)) {
5393 CmdArgs.push_back("-shared");
5394 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005395 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005396 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5397 }
5398 }
5399
Daniel Dunbarb440f562010-08-02 02:38:21 +00005400 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005401 CmdArgs.push_back("-o");
5402 CmdArgs.push_back(Output.getFilename());
5403 } else {
5404 assert(Output.isNothing() && "Invalid output.");
5405 }
5406
5407 if (!Args.hasArg(options::OPT_nostdlib) &&
5408 !Args.hasArg(options::OPT_nostartfiles)) {
5409 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005410 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005411 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005412 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005413 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005414 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005415 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005416 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005417 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005418 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005419 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005420 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005421 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005422 }
5423
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005424 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5425 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005426 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005427
5428 Args.AddAllArgs(CmdArgs, options::OPT_L);
5429 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5430 Args.AddAllArgs(CmdArgs, options::OPT_e);
5431
Daniel Dunbar54423b22010-09-17 00:24:54 +00005432 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005433
5434 if (!Args.hasArg(options::OPT_nostdlib) &&
5435 !Args.hasArg(options::OPT_nodefaultlibs)) {
5436 // FIXME: For some reason GCC passes -lgcc before adding
5437 // the default system libraries. Just mimic this for now.
5438 CmdArgs.push_back("-lgcc");
5439
5440 if (Args.hasArg(options::OPT_pthread))
5441 CmdArgs.push_back("-pthread");
5442 if (!Args.hasArg(options::OPT_shared))
5443 CmdArgs.push_back("-lc");
5444 CmdArgs.push_back("-lgcc");
5445 }
5446
5447 if (!Args.hasArg(options::OPT_nostdlib) &&
5448 !Args.hasArg(options::OPT_nostartfiles)) {
5449 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005450 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005451 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005452 }
5453
Bill Wendling08760582011-06-27 19:15:03 +00005454 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005455
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005456 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005457 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005458 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005459}
5460
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005461void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005462 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005463 const InputInfoList &Inputs,
5464 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005465 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005466 ArgStringList CmdArgs;
5467
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005468 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5469 // instruct as in the base system to assemble 32-bit code.
5470 if (getToolChain().getArch() == llvm::Triple::x86)
5471 CmdArgs.push_back("--32");
5472 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5473 CmdArgs.push_back("-mppc");
5474 CmdArgs.push_back("-many");
5475 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5476 getToolChain().getArch() == llvm::Triple::mips64el) {
5477 StringRef CPUName;
5478 StringRef ABIName;
5479 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5480
5481 CmdArgs.push_back("-mabi");
5482 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5483
5484 if (getToolChain().getArch() == llvm::Triple::mips64)
5485 CmdArgs.push_back("-EB");
5486 else
5487 CmdArgs.push_back("-EL");
5488
5489 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5490 options::OPT_fpic, options::OPT_fno_pic,
5491 options::OPT_fPIE, options::OPT_fno_PIE,
5492 options::OPT_fpie, options::OPT_fno_pie);
5493 if (LastPICArg &&
5494 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5495 LastPICArg->getOption().matches(options::OPT_fpic) ||
5496 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5497 LastPICArg->getOption().matches(options::OPT_fpie))) {
5498 CmdArgs.push_back("-KPIC");
5499 }
5500 }
5501
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005502 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5503 options::OPT_Xassembler);
5504
5505 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005506 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005507
5508 for (InputInfoList::const_iterator
5509 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5510 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005511 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005512 }
5513
5514 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005515 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005516 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005517}
5518
5519void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005520 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005521 const InputInfoList &Inputs,
5522 const ArgList &Args,
5523 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005524 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005525 ArgStringList CmdArgs;
5526
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005527 // Silence warning for "clang -g foo.o -o foo"
5528 Args.ClaimAllArgs(options::OPT_g_Group);
5529 // and "clang -emit-llvm foo.o -o foo"
5530 Args.ClaimAllArgs(options::OPT_emit_llvm);
5531 // and for "clang -w foo.o -o foo". Other warning options are already
5532 // handled somewhere else.
5533 Args.ClaimAllArgs(options::OPT_w);
5534
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005535 if (getToolChain().getArch() == llvm::Triple::mips64)
5536 CmdArgs.push_back("-EB");
5537 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5538 CmdArgs.push_back("-EL");
5539
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005540 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005541 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005542 CmdArgs.push_back("-e");
5543 CmdArgs.push_back("__start");
5544 }
5545
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005546 if (Args.hasArg(options::OPT_static)) {
5547 CmdArgs.push_back("-Bstatic");
5548 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005549 if (Args.hasArg(options::OPT_rdynamic))
5550 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005551 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005552 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005553 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005554 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005555 } else {
5556 CmdArgs.push_back("-dynamic-linker");
5557 CmdArgs.push_back("/usr/libexec/ld.so");
5558 }
5559 }
5560
Rafael Espindola044f7832013-06-05 04:28:55 +00005561 if (Args.hasArg(options::OPT_nopie))
5562 CmdArgs.push_back("-nopie");
5563
Daniel Dunbarb440f562010-08-02 02:38:21 +00005564 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005565 CmdArgs.push_back("-o");
5566 CmdArgs.push_back(Output.getFilename());
5567 } else {
5568 assert(Output.isNothing() && "Invalid output.");
5569 }
5570
5571 if (!Args.hasArg(options::OPT_nostdlib) &&
5572 !Args.hasArg(options::OPT_nostartfiles)) {
5573 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005574 if (Args.hasArg(options::OPT_pg))
5575 CmdArgs.push_back(Args.MakeArgString(
5576 getToolChain().GetFilePath("gcrt0.o")));
5577 else
5578 CmdArgs.push_back(Args.MakeArgString(
5579 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005580 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005581 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005582 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005583 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005584 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005585 }
5586 }
5587
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005588 std::string Triple = getToolChain().getTripleString();
5589 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005590 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005591 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005592 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005593
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005594 Args.AddAllArgs(CmdArgs, options::OPT_L);
5595 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5596 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005597 Args.AddAllArgs(CmdArgs, options::OPT_s);
5598 Args.AddAllArgs(CmdArgs, options::OPT_t);
5599 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5600 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005601
Daniel Dunbar54423b22010-09-17 00:24:54 +00005602 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005603
5604 if (!Args.hasArg(options::OPT_nostdlib) &&
5605 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005606 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005607 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005608 if (Args.hasArg(options::OPT_pg))
5609 CmdArgs.push_back("-lm_p");
5610 else
5611 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005612 }
5613
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005614 // FIXME: For some reason GCC passes -lgcc before adding
5615 // the default system libraries. Just mimic this for now.
5616 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005617
Eric Christopher17674ec2012-09-13 06:32:34 +00005618 if (Args.hasArg(options::OPT_pthread)) {
5619 if (!Args.hasArg(options::OPT_shared) &&
5620 Args.hasArg(options::OPT_pg))
5621 CmdArgs.push_back("-lpthread_p");
5622 else
5623 CmdArgs.push_back("-lpthread");
5624 }
5625
Chandler Carruth45661652011-12-17 22:32:42 +00005626 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005627 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005628 CmdArgs.push_back("-lc_p");
5629 else
5630 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005631 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005632
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005633 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005634 }
5635
5636 if (!Args.hasArg(options::OPT_nostdlib) &&
5637 !Args.hasArg(options::OPT_nostartfiles)) {
5638 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005639 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005640 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005641 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005642 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005643 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005644 }
5645
5646 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005647 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005648 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005649}
Ed Schoutene33194b2009-04-02 19:13:12 +00005650
Eli Friedman9fa28852012-08-08 23:57:20 +00005651void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5652 const InputInfo &Output,
5653 const InputInfoList &Inputs,
5654 const ArgList &Args,
5655 const char *LinkingOutput) const {
5656 ArgStringList CmdArgs;
5657
5658 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5659 options::OPT_Xassembler);
5660
5661 CmdArgs.push_back("-o");
5662 CmdArgs.push_back(Output.getFilename());
5663
5664 for (InputInfoList::const_iterator
5665 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5666 const InputInfo &II = *it;
5667 CmdArgs.push_back(II.getFilename());
5668 }
5669
5670 const char *Exec =
5671 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5672 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5673}
5674
5675void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5676 const InputInfo &Output,
5677 const InputInfoList &Inputs,
5678 const ArgList &Args,
5679 const char *LinkingOutput) const {
5680 const Driver &D = getToolChain().getDriver();
5681 ArgStringList CmdArgs;
5682
5683 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5684 (!Args.hasArg(options::OPT_shared))) {
5685 CmdArgs.push_back("-e");
5686 CmdArgs.push_back("__start");
5687 }
5688
5689 if (Args.hasArg(options::OPT_static)) {
5690 CmdArgs.push_back("-Bstatic");
5691 } else {
5692 if (Args.hasArg(options::OPT_rdynamic))
5693 CmdArgs.push_back("-export-dynamic");
5694 CmdArgs.push_back("--eh-frame-hdr");
5695 CmdArgs.push_back("-Bdynamic");
5696 if (Args.hasArg(options::OPT_shared)) {
5697 CmdArgs.push_back("-shared");
5698 } else {
5699 CmdArgs.push_back("-dynamic-linker");
5700 CmdArgs.push_back("/usr/libexec/ld.so");
5701 }
5702 }
5703
5704 if (Output.isFilename()) {
5705 CmdArgs.push_back("-o");
5706 CmdArgs.push_back(Output.getFilename());
5707 } else {
5708 assert(Output.isNothing() && "Invalid output.");
5709 }
5710
5711 if (!Args.hasArg(options::OPT_nostdlib) &&
5712 !Args.hasArg(options::OPT_nostartfiles)) {
5713 if (!Args.hasArg(options::OPT_shared)) {
5714 if (Args.hasArg(options::OPT_pg))
5715 CmdArgs.push_back(Args.MakeArgString(
5716 getToolChain().GetFilePath("gcrt0.o")));
5717 else
5718 CmdArgs.push_back(Args.MakeArgString(
5719 getToolChain().GetFilePath("crt0.o")));
5720 CmdArgs.push_back(Args.MakeArgString(
5721 getToolChain().GetFilePath("crtbegin.o")));
5722 } else {
5723 CmdArgs.push_back(Args.MakeArgString(
5724 getToolChain().GetFilePath("crtbeginS.o")));
5725 }
5726 }
5727
5728 Args.AddAllArgs(CmdArgs, options::OPT_L);
5729 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5730 Args.AddAllArgs(CmdArgs, options::OPT_e);
5731
5732 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5733
5734 if (!Args.hasArg(options::OPT_nostdlib) &&
5735 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005736 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005737 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5738 if (Args.hasArg(options::OPT_pg))
5739 CmdArgs.push_back("-lm_p");
5740 else
5741 CmdArgs.push_back("-lm");
5742 }
5743
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005744 if (Args.hasArg(options::OPT_pthread)) {
5745 if (!Args.hasArg(options::OPT_shared) &&
5746 Args.hasArg(options::OPT_pg))
5747 CmdArgs.push_back("-lpthread_p");
5748 else
5749 CmdArgs.push_back("-lpthread");
5750 }
5751
Eli Friedman9fa28852012-08-08 23:57:20 +00005752 if (!Args.hasArg(options::OPT_shared)) {
5753 if (Args.hasArg(options::OPT_pg))
5754 CmdArgs.push_back("-lc_p");
5755 else
5756 CmdArgs.push_back("-lc");
5757 }
5758
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005759 StringRef MyArch;
5760 switch (getToolChain().getTriple().getArch()) {
5761 case llvm::Triple::arm:
5762 MyArch = "arm";
5763 break;
5764 case llvm::Triple::x86:
5765 MyArch = "i386";
5766 break;
5767 case llvm::Triple::x86_64:
5768 MyArch = "amd64";
5769 break;
5770 default:
5771 llvm_unreachable("Unsupported architecture");
5772 }
5773 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005774 }
5775
5776 if (!Args.hasArg(options::OPT_nostdlib) &&
5777 !Args.hasArg(options::OPT_nostartfiles)) {
5778 if (!Args.hasArg(options::OPT_shared))
5779 CmdArgs.push_back(Args.MakeArgString(
5780 getToolChain().GetFilePath("crtend.o")));
5781 else
5782 CmdArgs.push_back(Args.MakeArgString(
5783 getToolChain().GetFilePath("crtendS.o")));
5784 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005785
5786 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005787 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005788 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005789}
5790
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005791void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005792 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005793 const InputInfoList &Inputs,
5794 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005795 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005796 ArgStringList CmdArgs;
5797
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005798 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5799 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005800 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005801 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005802 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005803 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005804 else if (getToolChain().getArch() == llvm::Triple::mips ||
5805 getToolChain().getArch() == llvm::Triple::mipsel ||
5806 getToolChain().getArch() == llvm::Triple::mips64 ||
5807 getToolChain().getArch() == llvm::Triple::mips64el) {
5808 StringRef CPUName;
5809 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005810 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005811
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005812 CmdArgs.push_back("-march");
5813 CmdArgs.push_back(CPUName.data());
5814
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005815 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005816 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005817
5818 if (getToolChain().getArch() == llvm::Triple::mips ||
5819 getToolChain().getArch() == llvm::Triple::mips64)
5820 CmdArgs.push_back("-EB");
5821 else
5822 CmdArgs.push_back("-EL");
5823
5824 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5825 options::OPT_fpic, options::OPT_fno_pic,
5826 options::OPT_fPIE, options::OPT_fno_PIE,
5827 options::OPT_fpie, options::OPT_fno_pie);
5828 if (LastPICArg &&
5829 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5830 LastPICArg->getOption().matches(options::OPT_fpic) ||
5831 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5832 LastPICArg->getOption().matches(options::OPT_fpie))) {
5833 CmdArgs.push_back("-KPIC");
5834 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005835 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5836 getToolChain().getArch() == llvm::Triple::thumb) {
5837 CmdArgs.push_back("-mfpu=softvfp");
5838 switch(getToolChain().getTriple().getEnvironment()) {
5839 case llvm::Triple::GNUEABI:
5840 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005841 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005842 break;
5843
5844 default:
5845 CmdArgs.push_back("-matpcs");
5846 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005847 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005848
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005849 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5850 options::OPT_Xassembler);
5851
5852 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005853 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005854
5855 for (InputInfoList::const_iterator
5856 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5857 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005858 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005859 }
5860
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005861 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005862 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005863 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005864}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005865
5866void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005867 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005868 const InputInfoList &Inputs,
5869 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005870 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005871 const toolchains::FreeBSD& ToolChain =
5872 static_cast<const toolchains::FreeBSD&>(getToolChain());
5873 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005874 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005875
5876 // Silence warning for "clang -g foo.o -o foo"
5877 Args.ClaimAllArgs(options::OPT_g_Group);
5878 // and "clang -emit-llvm foo.o -o foo"
5879 Args.ClaimAllArgs(options::OPT_emit_llvm);
5880 // and for "clang -w foo.o -o foo". Other warning options are already
5881 // handled somewhere else.
5882 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005883
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005884 if (!D.SysRoot.empty())
5885 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5886
Roman Divackyafe2f232012-08-28 15:09:03 +00005887 if (Args.hasArg(options::OPT_pie))
5888 CmdArgs.push_back("-pie");
5889
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005890 if (Args.hasArg(options::OPT_static)) {
5891 CmdArgs.push_back("-Bstatic");
5892 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005893 if (Args.hasArg(options::OPT_rdynamic))
5894 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005895 CmdArgs.push_back("--eh-frame-hdr");
5896 if (Args.hasArg(options::OPT_shared)) {
5897 CmdArgs.push_back("-Bshareable");
5898 } else {
5899 CmdArgs.push_back("-dynamic-linker");
5900 CmdArgs.push_back("/libexec/ld-elf.so.1");
5901 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005902 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5903 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005904 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5905 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5906 CmdArgs.push_back("--hash-style=both");
5907 }
5908 }
5909 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005910 }
5911
5912 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5913 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005914 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005915 CmdArgs.push_back("-m");
5916 CmdArgs.push_back("elf_i386_fbsd");
5917 }
5918
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005919 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005920 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005921 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005922 }
5923
Daniel Dunbarb440f562010-08-02 02:38:21 +00005924 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005925 CmdArgs.push_back("-o");
5926 CmdArgs.push_back(Output.getFilename());
5927 } else {
5928 assert(Output.isNothing() && "Invalid output.");
5929 }
5930
5931 if (!Args.hasArg(options::OPT_nostdlib) &&
5932 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005933 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005934 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005935 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005936 crt1 = "gcrt1.o";
5937 else if (Args.hasArg(options::OPT_pie))
5938 crt1 = "Scrt1.o";
5939 else
5940 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005941 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005942 if (crt1)
5943 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5944
5945 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5946
5947 const char *crtbegin = NULL;
5948 if (Args.hasArg(options::OPT_static))
5949 crtbegin = "crtbeginT.o";
5950 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5951 crtbegin = "crtbeginS.o";
5952 else
5953 crtbegin = "crtbegin.o";
5954
5955 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005956 }
5957
5958 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005959 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005960 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5961 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005962 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005963 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5964 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005965 Args.AddAllArgs(CmdArgs, options::OPT_s);
5966 Args.AddAllArgs(CmdArgs, options::OPT_t);
5967 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5968 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005969
Alp Tokerce365ca2013-12-02 12:43:03 +00005970 if (D.IsUsingLTO(Args))
5971 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00005972
Roman Divackyafe2f232012-08-28 15:09:03 +00005973 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005974
5975 if (!Args.hasArg(options::OPT_nostdlib) &&
5976 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005977 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005978 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005979 if (Args.hasArg(options::OPT_pg))
5980 CmdArgs.push_back("-lm_p");
5981 else
5982 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005983 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005984 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5985 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005986 if (Args.hasArg(options::OPT_pg))
5987 CmdArgs.push_back("-lgcc_p");
5988 else
5989 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005990 if (Args.hasArg(options::OPT_static)) {
5991 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005992 } else if (Args.hasArg(options::OPT_pg)) {
5993 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005994 } else {
5995 CmdArgs.push_back("--as-needed");
5996 CmdArgs.push_back("-lgcc_s");
5997 CmdArgs.push_back("--no-as-needed");
5998 }
5999
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006000 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006001 if (Args.hasArg(options::OPT_pg))
6002 CmdArgs.push_back("-lpthread_p");
6003 else
6004 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006005 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006006
Roman Divacky66f22762011-02-10 16:59:40 +00006007 if (Args.hasArg(options::OPT_pg)) {
6008 if (Args.hasArg(options::OPT_shared))
6009 CmdArgs.push_back("-lc");
6010 else
6011 CmdArgs.push_back("-lc_p");
6012 CmdArgs.push_back("-lgcc_p");
6013 } else {
6014 CmdArgs.push_back("-lc");
6015 CmdArgs.push_back("-lgcc");
6016 }
6017
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006018 if (Args.hasArg(options::OPT_static)) {
6019 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006020 } else if (Args.hasArg(options::OPT_pg)) {
6021 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006022 } else {
6023 CmdArgs.push_back("--as-needed");
6024 CmdArgs.push_back("-lgcc_s");
6025 CmdArgs.push_back("--no-as-needed");
6026 }
6027 }
6028
6029 if (!Args.hasArg(options::OPT_nostdlib) &&
6030 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00006031 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00006032 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006033 else
6034 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006035 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006036 }
6037
Roman Divackyafe2f232012-08-28 15:09:03 +00006038 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006039
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006040 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006041 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006043}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006044
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006045void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6046 const InputInfo &Output,
6047 const InputInfoList &Inputs,
6048 const ArgList &Args,
6049 const char *LinkingOutput) const {
6050 ArgStringList CmdArgs;
6051
6052 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6053 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006054 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006055 CmdArgs.push_back("--32");
6056
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006057 // Pass the target CPU to GNU as for ARM, since the source code might
6058 // not have the correct .cpu annotation.
6059 if (getToolChain().getArch() == llvm::Triple::arm) {
Bernard Ogden31561762013-12-12 13:27:11 +00006060 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006061 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6062 }
6063
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006064 if (getToolChain().getArch() == llvm::Triple::mips ||
6065 getToolChain().getArch() == llvm::Triple::mipsel ||
6066 getToolChain().getArch() == llvm::Triple::mips64 ||
6067 getToolChain().getArch() == llvm::Triple::mips64el) {
6068 StringRef CPUName;
6069 StringRef ABIName;
6070 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6071
6072 CmdArgs.push_back("-march");
6073 CmdArgs.push_back(CPUName.data());
6074
6075 CmdArgs.push_back("-mabi");
6076 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6077
6078 if (getToolChain().getArch() == llvm::Triple::mips ||
6079 getToolChain().getArch() == llvm::Triple::mips64)
6080 CmdArgs.push_back("-EB");
6081 else
6082 CmdArgs.push_back("-EL");
6083
6084 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6085 options::OPT_fpic, options::OPT_fno_pic,
6086 options::OPT_fPIE, options::OPT_fno_PIE,
6087 options::OPT_fpie, options::OPT_fno_pie);
6088 if (LastPICArg &&
6089 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6090 LastPICArg->getOption().matches(options::OPT_fpic) ||
6091 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6092 LastPICArg->getOption().matches(options::OPT_fpie))) {
6093 CmdArgs.push_back("-KPIC");
6094 }
6095 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006096
6097 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6098 options::OPT_Xassembler);
6099
6100 CmdArgs.push_back("-o");
6101 CmdArgs.push_back(Output.getFilename());
6102
6103 for (InputInfoList::const_iterator
6104 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6105 const InputInfo &II = *it;
6106 CmdArgs.push_back(II.getFilename());
6107 }
6108
David Chisnallddbd68f2011-09-27 22:03:18 +00006109 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6111}
6112
6113void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6114 const InputInfo &Output,
6115 const InputInfoList &Inputs,
6116 const ArgList &Args,
6117 const char *LinkingOutput) const {
6118 const Driver &D = getToolChain().getDriver();
6119 ArgStringList CmdArgs;
6120
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006121 if (!D.SysRoot.empty())
6122 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6123
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006124 if (Args.hasArg(options::OPT_static)) {
6125 CmdArgs.push_back("-Bstatic");
6126 } else {
6127 if (Args.hasArg(options::OPT_rdynamic))
6128 CmdArgs.push_back("-export-dynamic");
6129 CmdArgs.push_back("--eh-frame-hdr");
6130 if (Args.hasArg(options::OPT_shared)) {
6131 CmdArgs.push_back("-Bshareable");
6132 } else {
6133 CmdArgs.push_back("-dynamic-linker");
6134 CmdArgs.push_back("/libexec/ld.elf_so");
6135 }
6136 }
6137
6138 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6139 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006140 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006141 CmdArgs.push_back("-m");
6142 CmdArgs.push_back("elf_i386");
6143 }
6144
6145 if (Output.isFilename()) {
6146 CmdArgs.push_back("-o");
6147 CmdArgs.push_back(Output.getFilename());
6148 } else {
6149 assert(Output.isNothing() && "Invalid output.");
6150 }
6151
6152 if (!Args.hasArg(options::OPT_nostdlib) &&
6153 !Args.hasArg(options::OPT_nostartfiles)) {
6154 if (!Args.hasArg(options::OPT_shared)) {
6155 CmdArgs.push_back(Args.MakeArgString(
6156 getToolChain().GetFilePath("crt0.o")));
6157 CmdArgs.push_back(Args.MakeArgString(
6158 getToolChain().GetFilePath("crti.o")));
6159 CmdArgs.push_back(Args.MakeArgString(
6160 getToolChain().GetFilePath("crtbegin.o")));
6161 } else {
6162 CmdArgs.push_back(Args.MakeArgString(
6163 getToolChain().GetFilePath("crti.o")));
6164 CmdArgs.push_back(Args.MakeArgString(
6165 getToolChain().GetFilePath("crtbeginS.o")));
6166 }
6167 }
6168
6169 Args.AddAllArgs(CmdArgs, options::OPT_L);
6170 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6171 Args.AddAllArgs(CmdArgs, options::OPT_e);
6172 Args.AddAllArgs(CmdArgs, options::OPT_s);
6173 Args.AddAllArgs(CmdArgs, options::OPT_t);
6174 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6175 Args.AddAllArgs(CmdArgs, options::OPT_r);
6176
6177 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6178
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006179 unsigned Major, Minor, Micro;
6180 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6181 bool useLibgcc = true;
6182 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
6183 if (getToolChain().getArch() == llvm::Triple::x86 ||
6184 getToolChain().getArch() == llvm::Triple::x86_64)
6185 useLibgcc = false;
6186 }
6187
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006188 if (!Args.hasArg(options::OPT_nostdlib) &&
6189 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006190 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006191 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6192 CmdArgs.push_back("-lm");
6193 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006194 if (Args.hasArg(options::OPT_pthread))
6195 CmdArgs.push_back("-lpthread");
6196 CmdArgs.push_back("-lc");
6197
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006198 if (useLibgcc) {
6199 if (Args.hasArg(options::OPT_static)) {
6200 // libgcc_eh depends on libc, so resolve as much as possible,
6201 // pull in any new requirements from libc and then get the rest
6202 // of libgcc.
6203 CmdArgs.push_back("-lgcc_eh");
6204 CmdArgs.push_back("-lc");
6205 CmdArgs.push_back("-lgcc");
6206 } else {
6207 CmdArgs.push_back("-lgcc");
6208 CmdArgs.push_back("--as-needed");
6209 CmdArgs.push_back("-lgcc_s");
6210 CmdArgs.push_back("--no-as-needed");
6211 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006212 }
6213 }
6214
6215 if (!Args.hasArg(options::OPT_nostdlib) &&
6216 !Args.hasArg(options::OPT_nostartfiles)) {
6217 if (!Args.hasArg(options::OPT_shared))
6218 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6219 "crtend.o")));
6220 else
6221 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6222 "crtendS.o")));
6223 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6224 "crtn.o")));
6225 }
6226
Bill Wendling08760582011-06-27 19:15:03 +00006227 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006228
Rafael Espindola236db462013-11-09 20:07:19 +00006229 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006230 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6231}
6232
Thomas Schwinge4e555262013-03-28 19:04:25 +00006233void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6234 const InputInfo &Output,
6235 const InputInfoList &Inputs,
6236 const ArgList &Args,
6237 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006238 ArgStringList CmdArgs;
6239
6240 // Add --32/--64 to make sure we get the format we want.
6241 // This is incomplete
6242 if (getToolChain().getArch() == llvm::Triple::x86) {
6243 CmdArgs.push_back("--32");
6244 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6245 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006246 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6247 CmdArgs.push_back("-a32");
6248 CmdArgs.push_back("-mppc");
6249 CmdArgs.push_back("-many");
6250 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6251 CmdArgs.push_back("-a64");
6252 CmdArgs.push_back("-mppc64");
6253 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006254 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6255 CmdArgs.push_back("-a64");
6256 CmdArgs.push_back("-mppc64le");
6257 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00006258 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006259 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006260 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6261 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006262 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6263 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006264
Tim Northover9c7e0352013-12-12 11:55:52 +00006265 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6266 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006267 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006268
6269 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006270
6271 // FIXME: remove krait check when GNU tools support krait cpu
6272 // for now replace it with -march=armv7-a to avoid a lower
6273 // march from being picked in the absence of a cpu flag.
6274 Arg *A;
6275 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6276 StringRef(A->getValue()) == "krait")
6277 CmdArgs.push_back("-march=armv7-a");
6278 else
6279 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006280 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006281 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6282 getToolChain().getArch() == llvm::Triple::mipsel ||
6283 getToolChain().getArch() == llvm::Triple::mips64 ||
6284 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006285 StringRef CPUName;
6286 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006287 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006288
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006289 CmdArgs.push_back("-march");
6290 CmdArgs.push_back(CPUName.data());
6291
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006292 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006293 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006294
6295 if (getToolChain().getArch() == llvm::Triple::mips ||
6296 getToolChain().getArch() == llvm::Triple::mips64)
6297 CmdArgs.push_back("-EB");
6298 else
6299 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006300
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006301 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6302 if (StringRef(A->getValue()) == "2008")
6303 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6304 }
6305
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006306 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006307 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6308 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6309 options::OPT_mno_micromips);
6310 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6311 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6312
Simon Atanasyanbd986632013-11-26 11:58:04 +00006313 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6314 // Do not use AddLastArg because not all versions of MIPS assembler
6315 // support -mmsa / -mno-msa options.
6316 if (A->getOption().matches(options::OPT_mmsa))
6317 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6318 }
6319
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006320 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6321 options::OPT_fpic, options::OPT_fno_pic,
6322 options::OPT_fPIE, options::OPT_fno_PIE,
6323 options::OPT_fpie, options::OPT_fno_pie);
6324 if (LastPICArg &&
6325 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6326 LastPICArg->getOption().matches(options::OPT_fpic) ||
6327 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6328 LastPICArg->getOption().matches(options::OPT_fpie))) {
6329 CmdArgs.push_back("-KPIC");
6330 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006331 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006332 // Always pass an -march option, since our default of z10 is later
6333 // than the GNU assembler's default.
6334 StringRef CPUName = getSystemZTargetCPU(Args);
6335 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006336 }
6337
6338 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6339 options::OPT_Xassembler);
6340
6341 CmdArgs.push_back("-o");
6342 CmdArgs.push_back(Output.getFilename());
6343
6344 for (InputInfoList::const_iterator
6345 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6346 const InputInfo &II = *it;
6347 CmdArgs.push_back(II.getFilename());
6348 }
6349
6350 const char *Exec =
6351 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6352 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006353
6354 // Handle the debug info splitting at object creation time if we're
6355 // creating an object.
6356 // TODO: Currently only works on linux with newer objcopy.
6357 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006358 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006359 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6360 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006361}
6362
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006363static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6364 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006365 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006366 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6367 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006368 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006369 CmdArgs.push_back("-lgcc");
6370
Logan Chien3d3373c2012-11-19 12:04:11 +00006371 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006372 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006373 CmdArgs.push_back("-lgcc");
6374 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006375 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006376 CmdArgs.push_back("--as-needed");
6377 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006378 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006379 CmdArgs.push_back("--no-as-needed");
6380 }
6381
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006382 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006383 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006384 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006385 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006386
6387 // According to Android ABI, we have to link with libdl if we are
6388 // linking with non-static libgcc.
6389 //
6390 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6391 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6392 if (isAndroid && !StaticLibgcc)
6393 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006394}
6395
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006396static bool hasMipsN32ABIArg(const ArgList &Args) {
6397 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006398 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006399}
6400
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006401static StringRef getLinuxDynamicLinker(const ArgList &Args,
6402 const toolchains::Linux &ToolChain) {
6403 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6404 return "/system/bin/linker";
6405 else if (ToolChain.getArch() == llvm::Triple::x86)
6406 return "/lib/ld-linux.so.2";
6407 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6408 return "/lib/ld-linux-aarch64.so.1";
6409 else if (ToolChain.getArch() == llvm::Triple::arm ||
6410 ToolChain.getArch() == llvm::Triple::thumb) {
6411 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6412 return "/lib/ld-linux-armhf.so.3";
6413 else
6414 return "/lib/ld-linux.so.3";
6415 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6416 ToolChain.getArch() == llvm::Triple::mipsel)
6417 return "/lib/ld.so.1";
6418 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6419 ToolChain.getArch() == llvm::Triple::mips64el) {
6420 if (hasMipsN32ABIArg(Args))
6421 return "/lib32/ld.so.1";
6422 else
6423 return "/lib64/ld.so.1";
6424 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6425 return "/lib/ld.so.1";
6426 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006427 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006428 ToolChain.getArch() == llvm::Triple::systemz)
6429 return "/lib64/ld64.so.1";
6430 else
6431 return "/lib64/ld-linux-x86-64.so.2";
6432}
6433
Thomas Schwinge4e555262013-03-28 19:04:25 +00006434void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6435 const InputInfo &Output,
6436 const InputInfoList &Inputs,
6437 const ArgList &Args,
6438 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006439 const toolchains::Linux& ToolChain =
6440 static_cast<const toolchains::Linux&>(getToolChain());
6441 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006442 const bool isAndroid =
6443 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006444 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006445 const bool IsPIE =
6446 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006447 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006448
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006449 ArgStringList CmdArgs;
6450
Rafael Espindolad1002f62010-11-15 18:28:16 +00006451 // Silence warning for "clang -g foo.o -o foo"
6452 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006453 // and "clang -emit-llvm foo.o -o foo"
6454 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006455 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006456 // handled somewhere else.
6457 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006458
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006459 if (!D.SysRoot.empty())
6460 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006461
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006462 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006463 CmdArgs.push_back("-pie");
6464
Rafael Espindola1c76c592010-11-07 22:57:16 +00006465 if (Args.hasArg(options::OPT_rdynamic))
6466 CmdArgs.push_back("-export-dynamic");
6467
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006468 if (Args.hasArg(options::OPT_s))
6469 CmdArgs.push_back("-s");
6470
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006471 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6472 e = ToolChain.ExtraOpts.end();
6473 i != e; ++i)
6474 CmdArgs.push_back(i->c_str());
6475
6476 if (!Args.hasArg(options::OPT_static)) {
6477 CmdArgs.push_back("--eh-frame-hdr");
6478 }
6479
6480 CmdArgs.push_back("-m");
6481 if (ToolChain.getArch() == llvm::Triple::x86)
6482 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006483 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6484 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006485 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006486 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006487 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006488 else if (ToolChain.getArch() == llvm::Triple::ppc)
6489 CmdArgs.push_back("elf32ppclinux");
6490 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6491 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006492 else if (ToolChain.getArch() == llvm::Triple::mips)
6493 CmdArgs.push_back("elf32btsmip");
6494 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6495 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006496 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6497 if (hasMipsN32ABIArg(Args))
6498 CmdArgs.push_back("elf32btsmipn32");
6499 else
6500 CmdArgs.push_back("elf64btsmip");
6501 }
6502 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6503 if (hasMipsN32ABIArg(Args))
6504 CmdArgs.push_back("elf32ltsmipn32");
6505 else
6506 CmdArgs.push_back("elf64ltsmip");
6507 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006508 else if (ToolChain.getArch() == llvm::Triple::systemz)
6509 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006510 else
6511 CmdArgs.push_back("elf_x86_64");
6512
6513 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006514 if (ToolChain.getArch() == llvm::Triple::arm
6515 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006516 CmdArgs.push_back("-Bstatic");
6517 else
6518 CmdArgs.push_back("-static");
6519 } else if (Args.hasArg(options::OPT_shared)) {
6520 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006521 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006522 CmdArgs.push_back("-Bsymbolic");
6523 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006524 }
6525
6526 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006527 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006528 (!Args.hasArg(options::OPT_static) &&
6529 !Args.hasArg(options::OPT_shared))) {
6530 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006531 CmdArgs.push_back(Args.MakeArgString(
6532 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006533 }
6534
6535 CmdArgs.push_back("-o");
6536 CmdArgs.push_back(Output.getFilename());
6537
Rafael Espindola81937ec2010-12-01 01:52:43 +00006538 if (!Args.hasArg(options::OPT_nostdlib) &&
6539 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006540 if (!isAndroid) {
6541 const char *crt1 = NULL;
6542 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006543 if (Args.hasArg(options::OPT_pg))
6544 crt1 = "gcrt1.o";
6545 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006546 crt1 = "Scrt1.o";
6547 else
6548 crt1 = "crt1.o";
6549 }
6550 if (crt1)
6551 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006552
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006553 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6554 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006555
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006556 const char *crtbegin;
6557 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006558 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006559 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006560 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006561 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006562 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006563 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006564 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006565 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006566
6567 // Add crtfastmath.o if available and fast math is enabled.
6568 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006569 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006570
6571 Args.AddAllArgs(CmdArgs, options::OPT_L);
6572
6573 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6574
Roman Divackyee8188a2011-03-01 17:53:14 +00006575 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6576 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006577 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006578
Alp Tokerce365ca2013-12-02 12:43:03 +00006579 if (D.IsUsingLTO(Args))
6580 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006581
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006582 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6583 CmdArgs.push_back("--no-demangle");
6584
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006585 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6586
Eric Christopher04997782012-11-29 18:51:05 +00006587 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006588 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006589 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006590 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006591 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006592 if (Sanitize.needsAsanRt())
6593 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6594 if (Sanitize.needsTsanRt())
6595 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006596 if (Sanitize.needsMsanRt())
6597 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006598 if (Sanitize.needsLsanRt())
6599 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006600 if (Sanitize.needsDfsanRt())
6601 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006602
Chandler Carruthe4458b32013-06-24 09:38:45 +00006603 // The profile runtime also needs access to system libraries.
6604 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6605
Hans Wennborg70850d82013-07-18 20:29:38 +00006606 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006607 !Args.hasArg(options::OPT_nostdlib) &&
6608 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006609 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6610 !Args.hasArg(options::OPT_static);
6611 if (OnlyLibstdcxxStatic)
6612 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006613 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006614 if (OnlyLibstdcxxStatic)
6615 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006616 CmdArgs.push_back("-lm");
6617 }
6618
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006619 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006620 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6621 if (Args.hasArg(options::OPT_static))
6622 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006623
Chandler Carruth01538002013-01-17 13:19:29 +00006624 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6625 if (OpenMP) {
6626 CmdArgs.push_back("-lgomp");
6627
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006628 // FIXME: Exclude this for platforms with libgomp that don't require
6629 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006630 CmdArgs.push_back("-lrt");
6631 }
6632
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006633 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006634
Chandler Carruth94a32012012-05-14 18:31:18 +00006635 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006636 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006637 CmdArgs.push_back("-lpthread");
6638
6639 CmdArgs.push_back("-lc");
6640
6641 if (Args.hasArg(options::OPT_static))
6642 CmdArgs.push_back("--end-group");
6643 else
6644 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6645 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006646
Rafael Espindola81937ec2010-12-01 01:52:43 +00006647 if (!Args.hasArg(options::OPT_nostartfiles)) {
6648 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006649 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006650 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006651 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006652 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006653 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006654 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006655
Rafael Espindola81937ec2010-12-01 01:52:43 +00006656 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006657 if (!isAndroid)
6658 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006659 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006660 }
6661
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006662 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6663}
Rafael Espindola92b00932010-08-10 00:25:48 +00006664
Chris Lattner3e2ee142010-07-07 16:01:42 +00006665void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006666 const InputInfo &Output,
6667 const InputInfoList &Inputs,
6668 const ArgList &Args,
6669 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006670 ArgStringList CmdArgs;
6671
6672 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6673 options::OPT_Xassembler);
6674
6675 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006676 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006677
6678 for (InputInfoList::const_iterator
6679 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6680 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006681 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006682 }
6683
6684 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006685 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006686 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006687}
6688
6689void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006690 const InputInfo &Output,
6691 const InputInfoList &Inputs,
6692 const ArgList &Args,
6693 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006694 const Driver &D = getToolChain().getDriver();
6695 ArgStringList CmdArgs;
6696
Daniel Dunbarb440f562010-08-02 02:38:21 +00006697 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006698 CmdArgs.push_back("-o");
6699 CmdArgs.push_back(Output.getFilename());
6700 } else {
6701 assert(Output.isNothing() && "Invalid output.");
6702 }
6703
6704 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006705 !Args.hasArg(options::OPT_nostartfiles)) {
6706 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6707 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6708 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6709 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6710 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006711
6712 Args.AddAllArgs(CmdArgs, options::OPT_L);
6713 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6714 Args.AddAllArgs(CmdArgs, options::OPT_e);
6715
Daniel Dunbar54423b22010-09-17 00:24:54 +00006716 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006717
Eli Friedman83de5132011-12-08 23:54:21 +00006718 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6719
Chris Lattner3e2ee142010-07-07 16:01:42 +00006720 if (!Args.hasArg(options::OPT_nostdlib) &&
6721 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006722 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006723 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006724 CmdArgs.push_back("-lm");
6725 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006726 }
6727
6728 if (!Args.hasArg(options::OPT_nostdlib) &&
6729 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006730 if (Args.hasArg(options::OPT_pthread))
6731 CmdArgs.push_back("-lpthread");
6732 CmdArgs.push_back("-lc");
6733 CmdArgs.push_back("-lCompilerRT-Generic");
6734 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6735 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006736 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006737 }
6738
Rafael Espindola236db462013-11-09 20:07:19 +00006739 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006740 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006741}
6742
Daniel Dunbarcc912342009-05-02 18:28:39 +00006743/// DragonFly Tools
6744
6745// For now, DragonFly Assemble does just about the same as for
6746// FreeBSD, but this may change soon.
6747void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006748 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006749 const InputInfoList &Inputs,
6750 const ArgList &Args,
6751 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006752 ArgStringList CmdArgs;
6753
6754 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6755 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006756 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006757 CmdArgs.push_back("--32");
6758
6759 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6760 options::OPT_Xassembler);
6761
6762 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006763 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006764
6765 for (InputInfoList::const_iterator
6766 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6767 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006768 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006769 }
6770
6771 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006772 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006773 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006774}
6775
6776void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006777 const InputInfo &Output,
6778 const InputInfoList &Inputs,
6779 const ArgList &Args,
6780 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006781 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006782 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006783 ArgStringList CmdArgs;
6784
John McCall65b8da02013-04-11 22:55:55 +00006785 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6786 UseGCC47 = false;
6787
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006788 if (!D.SysRoot.empty())
6789 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6790
John McCall65b8da02013-04-11 22:55:55 +00006791 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006792 if (Args.hasArg(options::OPT_static)) {
6793 CmdArgs.push_back("-Bstatic");
6794 } else {
John McCall65b8da02013-04-11 22:55:55 +00006795 if (Args.hasArg(options::OPT_rdynamic))
6796 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006797 if (Args.hasArg(options::OPT_shared))
6798 CmdArgs.push_back("-Bshareable");
6799 else {
6800 CmdArgs.push_back("-dynamic-linker");
6801 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6802 }
John McCall65b8da02013-04-11 22:55:55 +00006803 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006804 }
6805
6806 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6807 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006808 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006809 CmdArgs.push_back("-m");
6810 CmdArgs.push_back("elf_i386");
6811 }
6812
Daniel Dunbarb440f562010-08-02 02:38:21 +00006813 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006814 CmdArgs.push_back("-o");
6815 CmdArgs.push_back(Output.getFilename());
6816 } else {
6817 assert(Output.isNothing() && "Invalid output.");
6818 }
6819
6820 if (!Args.hasArg(options::OPT_nostdlib) &&
6821 !Args.hasArg(options::OPT_nostartfiles)) {
6822 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006823 if (Args.hasArg(options::OPT_pg))
6824 CmdArgs.push_back(Args.MakeArgString(
6825 getToolChain().GetFilePath("gcrt1.o")));
6826 else {
6827 if (Args.hasArg(options::OPT_pie))
6828 CmdArgs.push_back(Args.MakeArgString(
6829 getToolChain().GetFilePath("Scrt1.o")));
6830 else
6831 CmdArgs.push_back(Args.MakeArgString(
6832 getToolChain().GetFilePath("crt1.o")));
6833 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006834 }
John McCall65b8da02013-04-11 22:55:55 +00006835 CmdArgs.push_back(Args.MakeArgString(
6836 getToolChain().GetFilePath("crti.o")));
6837 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6838 CmdArgs.push_back(Args.MakeArgString(
6839 getToolChain().GetFilePath("crtbeginS.o")));
6840 else
6841 CmdArgs.push_back(Args.MakeArgString(
6842 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006843 }
6844
6845 Args.AddAllArgs(CmdArgs, options::OPT_L);
6846 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6847 Args.AddAllArgs(CmdArgs, options::OPT_e);
6848
Daniel Dunbar54423b22010-09-17 00:24:54 +00006849 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006850
6851 if (!Args.hasArg(options::OPT_nostdlib) &&
6852 !Args.hasArg(options::OPT_nodefaultlibs)) {
6853 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6854 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006855 if (UseGCC47)
6856 CmdArgs.push_back("-L/usr/lib/gcc47");
6857 else
6858 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006859
6860 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006861 if (UseGCC47) {
6862 CmdArgs.push_back("-rpath");
6863 CmdArgs.push_back("/usr/lib/gcc47");
6864 } else {
6865 CmdArgs.push_back("-rpath");
6866 CmdArgs.push_back("/usr/lib/gcc44");
6867 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006868 }
6869
Hans Wennborg70850d82013-07-18 20:29:38 +00006870 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006871 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006872 CmdArgs.push_back("-lm");
6873 }
6874
Daniel Dunbarcc912342009-05-02 18:28:39 +00006875 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006876 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006877
6878 if (!Args.hasArg(options::OPT_nolibc)) {
6879 CmdArgs.push_back("-lc");
6880 }
6881
John McCall65b8da02013-04-11 22:55:55 +00006882 if (UseGCC47) {
6883 if (Args.hasArg(options::OPT_static) ||
6884 Args.hasArg(options::OPT_static_libgcc)) {
6885 CmdArgs.push_back("-lgcc");
6886 CmdArgs.push_back("-lgcc_eh");
6887 } else {
6888 if (Args.hasArg(options::OPT_shared_libgcc)) {
6889 CmdArgs.push_back("-lgcc_pic");
6890 if (!Args.hasArg(options::OPT_shared))
6891 CmdArgs.push_back("-lgcc");
6892 } else {
6893 CmdArgs.push_back("-lgcc");
6894 CmdArgs.push_back("--as-needed");
6895 CmdArgs.push_back("-lgcc_pic");
6896 CmdArgs.push_back("--no-as-needed");
6897 }
6898 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006899 } else {
John McCall65b8da02013-04-11 22:55:55 +00006900 if (Args.hasArg(options::OPT_shared)) {
6901 CmdArgs.push_back("-lgcc_pic");
6902 } else {
6903 CmdArgs.push_back("-lgcc");
6904 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006905 }
6906 }
6907
6908 if (!Args.hasArg(options::OPT_nostdlib) &&
6909 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006910 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006911 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006912 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006913 else
6914 CmdArgs.push_back(Args.MakeArgString(
6915 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006916 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006917 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006918 }
6919
Bill Wendling08760582011-06-27 19:15:03 +00006920 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006921
Daniel Dunbarcc912342009-05-02 18:28:39 +00006922 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006923 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006924 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006925}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006926
6927void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6928 const InputInfo &Output,
6929 const InputInfoList &Inputs,
6930 const ArgList &Args,
6931 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006932 ArgStringList CmdArgs;
6933
6934 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006935 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6936 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006937 } else {
6938 assert(Output.isNothing() && "Invalid output.");
6939 }
6940
6941 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006942 !Args.hasArg(options::OPT_nostartfiles) &&
6943 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006944 CmdArgs.push_back("-defaultlib:libcmt");
6945 }
6946
6947 CmdArgs.push_back("-nologo");
6948
Hans Wennborgf1a74252013-09-10 20:18:04 +00006949 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6950
6951 if (DLL) {
6952 CmdArgs.push_back(Args.MakeArgString("-dll"));
6953
6954 SmallString<128> ImplibName(Output.getFilename());
6955 llvm::sys::path::replace_extension(ImplibName, "lib");
6956 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6957 ImplibName.str()));
6958 }
6959
Peter Collingbourne32701642013-11-01 18:16:25 +00006960 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006961 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006962 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006963 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006964 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6965 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006966 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006967 } else {
6968 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6969 }
6970 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006971 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6972 }
6973
Michael J. Spencere2f49362012-06-18 16:56:04 +00006974 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006975 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006976
6977 // Add filenames immediately.
6978 for (InputInfoList::const_iterator
6979 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6980 if (it->isFilename())
6981 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006982 else
6983 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006984 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006985
6986 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006987 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006988 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6989}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006990
6991void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6992 const InputInfo &Output,
6993 const InputInfoList &Inputs,
6994 const ArgList &Args,
6995 const char *LinkingOutput) const {
6996 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6997}
6998
Hans Wennborg188382e2013-09-20 18:16:35 +00006999// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7000// If one cannot be found, return FallbackName.
7001// We do this special search to prevent clang-cl from falling back onto itself
7002// if it's available as cl.exe on the path.
7003static std::string FindFallback(const char *FallbackName,
7004 const char *ClangProgramPath) {
7005 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7006 if (!OptPath.hasValue())
7007 return FallbackName;
7008
7009#ifdef LLVM_ON_WIN32
7010 const StringRef PathSeparators = ";";
7011#else
7012 const StringRef PathSeparators = ":";
7013#endif
7014
7015 SmallVector<StringRef, 8> PathSegments;
7016 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7017
7018 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7019 const StringRef &PathSegment = PathSegments[i];
7020 if (PathSegment.empty())
7021 continue;
7022
7023 SmallString<128> FilePath(PathSegment);
7024 llvm::sys::path::append(FilePath, FallbackName);
7025 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7026 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7027 return FilePath.str();
7028 }
7029
7030 return FallbackName;
7031}
7032
Hans Wennborg87cfa712013-09-19 20:32:16 +00007033Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7034 const InputInfo &Output,
7035 const InputInfoList &Inputs,
7036 const ArgList &Args,
7037 const char *LinkingOutput) const {
7038 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007039 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007040 CmdArgs.push_back("/c"); // Compile only.
7041 CmdArgs.push_back("/W0"); // No warnings.
7042
7043 // The goal is to be able to invoke this tool correctly based on
7044 // any flag accepted by clang-cl.
7045
7046 // These are spelled the same way in clang and cl.exe,.
7047 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7048 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007049
7050 // Optimization level.
7051 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7052 if (A->getOption().getID() == options::OPT_O0) {
7053 CmdArgs.push_back("/Od");
7054 } else {
7055 StringRef OptLevel = A->getValue();
7056 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7057 A->render(Args, CmdArgs);
7058 else if (OptLevel == "3")
7059 CmdArgs.push_back("/Ox");
7060 }
7061 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007062
7063 // Flags for which clang-cl have an alias.
7064 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7065
7066 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7067 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7068 : "/GR-");
7069 if (Args.hasArg(options::OPT_fsyntax_only))
7070 CmdArgs.push_back("/Zs");
7071
Hans Wennborg260ff402013-09-27 17:54:18 +00007072 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7073 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7074 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7075
Hans Wennborg87cfa712013-09-19 20:32:16 +00007076 // Flags that can simply be passed through.
7077 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7078 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7079
7080 // The order of these flags is relevant, so pick the last one.
7081 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7082 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7083 A->render(Args, CmdArgs);
7084
7085
7086 // Input filename.
7087 assert(Inputs.size() == 1);
7088 const InputInfo &II = Inputs[0];
7089 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7090 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7091 if (II.isFilename())
7092 CmdArgs.push_back(II.getFilename());
7093 else
7094 II.getInputArg().renderAsInput(Args, CmdArgs);
7095
7096 // Output filename.
7097 assert(Output.getType() == types::TY_Object);
7098 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7099 Output.getFilename());
7100 CmdArgs.push_back(Fo);
7101
Hans Wennborg188382e2013-09-20 18:16:35 +00007102 const Driver &D = getToolChain().getDriver();
7103 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007104
Hans Wennborg188382e2013-09-20 18:16:35 +00007105 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007106}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007107
7108
7109/// XCore Tools
7110// We pass assemble and link construction to the xcc tool.
7111
7112void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7113 const InputInfo &Output,
7114 const InputInfoList &Inputs,
7115 const ArgList &Args,
7116 const char *LinkingOutput) const {
7117 ArgStringList CmdArgs;
7118
7119 CmdArgs.push_back("-o");
7120 CmdArgs.push_back(Output.getFilename());
7121
7122 CmdArgs.push_back("-c");
7123
7124 if (Args.hasArg(options::OPT_g_Group)) {
7125 CmdArgs.push_back("-g");
7126 }
7127
7128 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7129 options::OPT_Xassembler);
7130
7131 for (InputInfoList::const_iterator
7132 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7133 const InputInfo &II = *it;
7134 CmdArgs.push_back(II.getFilename());
7135 }
7136
7137 const char *Exec =
7138 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7139 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7140}
7141
7142void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7143 const InputInfo &Output,
7144 const InputInfoList &Inputs,
7145 const ArgList &Args,
7146 const char *LinkingOutput) const {
7147 ArgStringList CmdArgs;
7148
7149 if (Output.isFilename()) {
7150 CmdArgs.push_back("-o");
7151 CmdArgs.push_back(Output.getFilename());
7152 } else {
7153 assert(Output.isNothing() && "Invalid output.");
7154 }
7155
7156 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7157
7158 const char *Exec =
7159 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7160 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7161}