blob: 04f8e8ca5f8e6ebdf59acb55235e9859ca8f24fa [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.
4469 std::string NativeMArch;
4470 if (MArch == "native") {
4471 std::string CPU = llvm::sys::getHostCPUName();
4472 if (CPU != "generic") {
4473 // Translate the native cpu into the architecture. The switch below will
4474 // then chose the minimum cpu for that arch.
4475 NativeMArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
4476 MArch = NativeMArch;
4477 }
4478 }
4479
4480 if (Triple.getOS() == llvm::Triple::NetBSD) {
4481 if (MArch == "armv6")
4482 return "arm1176jzf-s";
4483 }
4484
4485 const char *result = llvm::StringSwitch<const char *>(MArch)
4486 .Cases("armv2", "armv2a","arm2")
4487 .Case("armv3", "arm6")
4488 .Case("armv3m", "arm7m")
4489 .Case("armv4", "strongarm")
4490 .Case("armv4t", "arm7tdmi")
4491 .Case("thumbv4t", "arm7tdmi")
4492 .Cases("armv5", "armv5t", "arm10tdmi")
4493 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4494 .Cases("armv5e", "armv5te", "arm1022e")
4495 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4496 .Case("armv5tej", "arm926ej-s")
4497 .Case("thumbv5tej", "arm926ej-s")
4498 .Cases("armv6", "armv6k", "arm1136jf-s")
4499 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4500 .Case("armv6j", "arm1136j-s")
4501 .Case("thumbv6j", "arm1136j-s")
4502 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4503 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4504 .Case("armv6t2", "arm1156t2-s")
4505 .Case("thumbv6t2", "arm1156t2-s")
4506 .Cases("armv6m", "armv6-m", "cortex-m0")
4507 .Case("thumbv6m", "cortex-m0")
4508 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
4509 .Cases("thumbv7", "thumbv7a", "cortex-a8")
4510 .Cases("armv7l", "armv7-l", "cortex-a8")
4511 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
4512 .Cases("armv7s", "armv7-s", "swift")
4513 .Cases("armv7r", "armv7-r", "cortex-r4")
4514 .Case("thumbv7r", "cortex-r4")
4515 .Cases("armv7m", "armv7-m", "cortex-m3")
4516 .Case("thumbv7m", "cortex-m3")
4517 .Cases("armv7em", "armv7e-m", "cortex-m4")
4518 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
4519 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
4520 .Cases("thumbv8", "thumbv8a", "cortex-a53")
4521 .Case("ep9312", "ep9312")
4522 .Case("iwmmxt", "iwmmxt")
4523 .Case("xscale", "xscale")
4524 // If all else failed, return the most base CPU with thumb interworking
4525 // supported by LLVM.
4526 .Default(0);
4527
4528 if (result)
4529 return result;
4530
4531 return
4532 Triple.getEnvironment() == llvm::Triple::GNUEABIHF
4533 ? "arm1176jzf-s"
4534 : "arm7tdmi";
4535}
4536
4537/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
4538const char *arm::getARMTargetCPU(const ArgList &Args,
4539 const llvm::Triple &Triple) {
4540 // FIXME: Warn on inconsistent use of -mcpu and -march.
4541 // If we have -mcpu=, use that.
4542 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4543 StringRef MCPU = A->getValue();
4544 // Handle -mcpu=native.
4545 if (MCPU == "native")
4546 return llvm::sys::getHostCPUName().c_str();
4547 else
4548 return MCPU.str().c_str();
4549 }
4550
4551 return getARMCPUForMArch(Args, Triple);
4552}
4553
4554/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4555/// CPU.
4556//
4557// FIXME: This is redundant with -mcpu, why does LLVM use this.
4558// FIXME: tblgen this, or kill it!
4559const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4560 return llvm::StringSwitch<const char *>(CPU)
4561 .Case("strongarm", "v4")
4562 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4563 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4564 .Cases("arm920", "arm920t", "arm922t", "v4t")
4565 .Cases("arm940t", "ep9312","v4t")
4566 .Cases("arm10tdmi", "arm1020t", "v5")
4567 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4568 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4569 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4570 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4571 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4572 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
4573 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
4574 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4575 .Cases("cortex-r4", "cortex-r5", "v7r")
4576 .Case("cortex-m0", "v6m")
4577 .Case("cortex-m3", "v7m")
4578 .Case("cortex-m4", "v7em")
4579 .Case("cortex-a9-mp", "v7f")
4580 .Case("swift", "v7s")
4581 .Cases("cortex-a53", "cortex-a57", "v8")
4582 .Default("");
4583}
4584
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004585llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4586 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4587 // archs which Darwin doesn't use.
4588
4589 // The matching this routine does is fairly pointless, since it is neither the
4590 // complete architecture list, nor a reasonable subset. The problem is that
4591 // historically the driver driver accepts this and also ties its -march=
4592 // handling to the architecture name, so we need to be careful before removing
4593 // support for it.
4594
4595 // This code must be kept in sync with Clang's Darwin specific argument
4596 // translation.
4597
4598 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4599 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4600 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4601 .Case("ppc64", llvm::Triple::ppc64)
4602 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4603 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4604 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004605 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004606 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004607 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4608 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4609 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004610 .Case("r600", llvm::Triple::r600)
4611 .Case("nvptx", llvm::Triple::nvptx)
4612 .Case("nvptx64", llvm::Triple::nvptx64)
4613 .Case("amdil", llvm::Triple::amdil)
4614 .Case("spir", llvm::Triple::spir)
4615 .Default(llvm::Triple::UnknownArch);
4616}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004617
Bob Wilsondecc03e2012-11-23 06:14:39 +00004618const char *Clang::getBaseInputName(const ArgList &Args,
4619 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004620 return Args.MakeArgString(
4621 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004622}
4623
Bob Wilsondecc03e2012-11-23 06:14:39 +00004624const char *Clang::getBaseInputStem(const ArgList &Args,
4625 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004626 const char *Str = getBaseInputName(Args, Inputs);
4627
Chris Lattner906bb902011-01-16 08:14:11 +00004628 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004629 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004630
4631 return Str;
4632}
4633
Bob Wilsondecc03e2012-11-23 06:14:39 +00004634const char *Clang::getDependencyFileName(const ArgList &Args,
4635 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004636 // FIXME: Think about this more.
4637 std::string Res;
4638
4639 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004640 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004641 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004642 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004643 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004644 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004645 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004646}
4647
Daniel Dunbarbe220842009-03-20 16:06:39 +00004648void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004649 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004650 const InputInfoList &Inputs,
4651 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004652 const char *LinkingOutput) const {
4653 ArgStringList CmdArgs;
4654
4655 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4656 const InputInfo &Input = Inputs[0];
4657
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004658 // Determine the original source input.
4659 const Action *SourceAction = &JA;
4660 while (SourceAction->getKind() != Action::InputClass) {
4661 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4662 SourceAction = SourceAction->getInputs()[0];
4663 }
4664
Kevin Enderby319baa42013-11-18 23:30:29 +00004665 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4666 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004667 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4668 // FIXME: at run-time detect assembler capabilities or rely on version
4669 // information forwarded by -target-assembler-version (future)
4670 if (Args.hasArg(options::OPT_no_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004671 const llvm::Triple &T(getToolChain().getTriple());
4672 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004673 CmdArgs.push_back("-Q");
4674 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004675
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004676 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004677 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004678 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004679 if (Args.hasArg(options::OPT_gstabs))
4680 CmdArgs.push_back("--gstabs");
4681 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004682 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004683 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004684
Daniel Dunbarbe220842009-03-20 16:06:39 +00004685 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004686 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004687
Daniel Dunbar6d484762010-07-22 01:47:22 +00004688 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004689 if (getToolChain().getArch() == llvm::Triple::x86 ||
4690 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004691 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4692 CmdArgs.push_back("-force_cpusubtype_ALL");
4693
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004694 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004695 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004696 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004697 (!getDarwinToolChain().isTargetIPhoneOS() ||
4698 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4699 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004700 CmdArgs.push_back("-static");
4701
Daniel Dunbarbe220842009-03-20 16:06:39 +00004702 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4703 options::OPT_Xassembler);
4704
4705 assert(Output.isFilename() && "Unexpected lipo output.");
4706 CmdArgs.push_back("-o");
4707 CmdArgs.push_back(Output.getFilename());
4708
Daniel Dunbarb440f562010-08-02 02:38:21 +00004709 assert(Input.isFilename() && "Invalid input.");
4710 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004711
4712 // asm_final spec is empty.
4713
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004714 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004715 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004716 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004717}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004718
David Blaikie68e081d2011-12-20 02:48:34 +00004719void darwin::DarwinTool::anchor() {}
4720
Daniel Dunbare9ded432009-09-09 18:36:20 +00004721void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4722 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004723 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004724
Daniel Dunbarc1964212009-03-26 16:23:12 +00004725 // Derived from darwin_arch spec.
4726 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004727 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004728
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004729 // FIXME: Is this needed anymore?
4730 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004731 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004732}
4733
Bill Wendling3b2000f2012-10-02 18:02:50 +00004734bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4735 // We only need to generate a temp path for LTO if we aren't compiling object
4736 // files. When compiling source files, we run 'dsymutil' after linking. We
4737 // don't run 'dsymutil' when compiling object files.
4738 for (InputInfoList::const_iterator
4739 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4740 if (it->getType() != types::TY_Object)
4741 return true;
4742
4743 return false;
4744}
4745
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004746void darwin::Link::AddLinkArgs(Compilation &C,
4747 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004748 ArgStringList &CmdArgs,
4749 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004750 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004751 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004752
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004753 unsigned Version[3] = { 0, 0, 0 };
4754 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4755 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004756 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004757 Version[1], Version[2], HadExtra) ||
4758 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004759 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004760 << A->getAsString(Args);
4761 }
4762
4763 // Newer linkers support -demangle, pass it if supported and not disabled by
4764 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004765 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004766 // Don't pass -demangle to ld_classic.
4767 //
4768 // FIXME: This is a temporary workaround, ld should be handling this.
4769 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4770 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004771 if (getToolChain().getArch() == llvm::Triple::x86) {
4772 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4773 options::OPT_Wl_COMMA),
4774 ie = Args.filtered_end(); it != ie; ++it) {
4775 const Arg *A = *it;
4776 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004777 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004778 UsesLdClassic = true;
4779 }
4780 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004781 if (!UsesLdClassic)
4782 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004783 }
4784
Bob Wilson3d27dad2013-08-02 22:25:34 +00004785 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4786 CmdArgs.push_back("-export_dynamic");
4787
Bill Wendling313b6bf2012-11-16 23:03:00 +00004788 // If we are using LTO, then automatically create a temporary file path for
4789 // the linker to use, so that it's lifetime will extend past a possible
4790 // dsymutil step.
4791 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4792 const char *TmpPath = C.getArgs().MakeArgString(
4793 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4794 C.addTempFile(TmpPath);
4795 CmdArgs.push_back("-object_path_lto");
4796 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004797 }
4798
Daniel Dunbarc1964212009-03-26 16:23:12 +00004799 // Derived from the "link" spec.
4800 Args.AddAllArgs(CmdArgs, options::OPT_static);
4801 if (!Args.hasArg(options::OPT_static))
4802 CmdArgs.push_back("-dynamic");
4803 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4804 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4805 // here. How do we wish to handle such things?
4806 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004807
Daniel Dunbarc1964212009-03-26 16:23:12 +00004808 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004809 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004810 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004811 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004812
4813 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4814 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4815 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4816
4817 Arg *A;
4818 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4819 (A = Args.getLastArg(options::OPT_current__version)) ||
4820 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004821 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004822 << A->getAsString(Args) << "-dynamiclib";
4823
4824 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4825 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4826 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4827 } else {
4828 CmdArgs.push_back("-dylib");
4829
4830 Arg *A;
4831 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4832 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4833 (A = Args.getLastArg(options::OPT_client__name)) ||
4834 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4835 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4836 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004837 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004838 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004839
Daniel Dunbarc1964212009-03-26 16:23:12 +00004840 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4841 "-dylib_compatibility_version");
4842 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4843 "-dylib_current_version");
4844
Daniel Dunbara48823f2010-01-22 02:04:52 +00004845 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004846
4847 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4848 "-dylib_install_name");
4849 }
4850
4851 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4852 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4853 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover9c7e0352013-12-12 11:55:52 +00004854 if (DarwinTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004855 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004856 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4857 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4858 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4859 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4860 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4861 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004862 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004863 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4864 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4865 Args.AddAllArgs(CmdArgs, options::OPT_init);
4866
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004867 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004868 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004869
4870 // If we had an explicit -mios-simulator-version-min argument, honor that,
4871 // otherwise use the traditional deployment targets. We can't just check the
4872 // is-sim attribute because existing code follows this path, and the linker
4873 // may not handle the argument.
4874 //
4875 // FIXME: We may be able to remove this, once we can verify no one depends on
4876 // it.
Tim Northover9c7e0352013-12-12 11:55:52 +00004877 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004878 CmdArgs.push_back("-ios_simulator_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004879 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4880 } else if (DarwinTC.isTargetIOSBased()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004881 CmdArgs.push_back("-iphoneos_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004882 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4883 } else if (DarwinTC.isTargetMacOS()) {
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004884 CmdArgs.push_back("-macosx_version_min");
Tim Northover9c7e0352013-12-12 11:55:52 +00004885 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4886 }
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004887
Daniel Dunbarc1964212009-03-26 16:23:12 +00004888 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4889 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4890 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4891 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4892 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004893
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004894 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4895 options::OPT_fno_pie,
4896 options::OPT_fno_PIE)) {
4897 if (A->getOption().matches(options::OPT_fpie) ||
4898 A->getOption().matches(options::OPT_fPIE))
4899 CmdArgs.push_back("-pie");
4900 else
4901 CmdArgs.push_back("-no_pie");
4902 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004903
4904 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4905 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4906 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4907 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4908 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4909 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4910 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4911 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4912 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4913 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4914 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4915 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4916 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4917 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4918 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4919 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004920
Daniel Dunbar84384642011-05-02 21:03:47 +00004921 // Give --sysroot= preference, over the Apple specific behavior to also use
4922 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004923 StringRef sysroot = C.getSysRoot();
4924 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004925 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004926 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004927 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4928 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004929 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004930 }
4931
Daniel Dunbarc1964212009-03-26 16:23:12 +00004932 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4933 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4934 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4935 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4936 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004937 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004938 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4939 Args.AddAllArgs(CmdArgs, options::OPT_y);
4940 Args.AddLastArg(CmdArgs, options::OPT_w);
4941 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4942 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4943 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4944 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4945 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4946 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4947 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4948 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4949 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4950 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4951 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4952 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4953}
4954
4955void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004956 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004957 const InputInfoList &Inputs,
4958 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004959 const char *LinkingOutput) const {
4960 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004961
Daniel Dunbarc1964212009-03-26 16:23:12 +00004962 // The logic here is derived from gcc's behavior; most of which
4963 // comes from specs (starting with link_command). Consult gcc for
4964 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004965 ArgStringList CmdArgs;
4966
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004967 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4968 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4969 options::OPT_ccc_arcmt_migrate)) {
4970 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4971 (*I)->claim();
4972 const char *Exec =
4973 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4974 CmdArgs.push_back(Output.getFilename());
4975 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4976 return;
4977 }
4978
Daniel Dunbarc1964212009-03-26 16:23:12 +00004979 // I'm not sure why this particular decomposition exists in gcc, but
4980 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004981 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004982
Daniel Dunbarc1964212009-03-26 16:23:12 +00004983 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4984 Args.AddAllArgs(CmdArgs, options::OPT_s);
4985 Args.AddAllArgs(CmdArgs, options::OPT_t);
4986 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4987 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004988 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004989 Args.AddAllArgs(CmdArgs, options::OPT_r);
4990
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004991 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4992 // members of static archive libraries which implement Objective-C classes or
4993 // categories.
4994 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4995 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004996
Daniel Dunbarc1964212009-03-26 16:23:12 +00004997 CmdArgs.push_back("-o");
4998 CmdArgs.push_back(Output.getFilename());
4999
Chad Rosier06fd3c62012-05-16 23:45:12 +00005000 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005001 !Args.hasArg(options::OPT_nostartfiles)) {
5002 // Derived from startfile spec.
5003 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005004 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00005005 if (getDarwinToolChain().isTargetIOSSimulator()) {
5006 // The simulator doesn't have a versioned crt1 file.
5007 CmdArgs.push_back("-ldylib1.o");
5008 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005009 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5010 CmdArgs.push_back("-ldylib1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005011 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005012 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00005013 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005014 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005015 CmdArgs.push_back("-ldylib1.10.5.o");
5016 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005017 } else {
5018 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005019 if (!Args.hasArg(options::OPT_static)) {
5020 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00005021 if (getDarwinToolChain().isTargetIOSSimulator()) {
5022 // The simulator doesn't have a versioned crt1 file.
5023 CmdArgs.push_back("-lbundle1.o");
5024 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005025 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5026 CmdArgs.push_back("-lbundle1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005027 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005028 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00005029 CmdArgs.push_back("-lbundle1.o");
5030 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00005031 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005032 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00005033 if (Args.hasArg(options::OPT_pg) &&
5034 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00005035 if (Args.hasArg(options::OPT_static) ||
5036 Args.hasArg(options::OPT_object) ||
5037 Args.hasArg(options::OPT_preload)) {
5038 CmdArgs.push_back("-lgcrt0.o");
5039 } else {
5040 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005041
Daniel Dunbarc1964212009-03-26 16:23:12 +00005042 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005043 }
Bob Wilsonef285b42012-07-04 00:18:41 +00005044 // By default on OS X 10.8 and later, we don't link with a crt1.o
5045 // file and the linker knows to use _main as the entry point. But,
5046 // when compiling with -pg, we need to link with the gcrt1.o file,
5047 // so pass the -no_new_main option to tell the linker to use the
5048 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00005049 if (getDarwinToolChain().isTargetMacOS() &&
5050 !getDarwinToolChain().isMacosxVersionLT(10, 8))
5051 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005052 } else {
5053 if (Args.hasArg(options::OPT_static) ||
5054 Args.hasArg(options::OPT_object) ||
5055 Args.hasArg(options::OPT_preload)) {
5056 CmdArgs.push_back("-lcrt0.o");
5057 } else {
5058 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00005059 if (getDarwinToolChain().isTargetIOSSimulator()) {
5060 // The simulator doesn't have a versioned crt1 file.
5061 CmdArgs.push_back("-lcrt1.o");
5062 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00005063 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5064 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005065 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00005066 CmdArgs.push_back("-lcrt1.3.1.o");
Tim Northover9c7e0352013-12-12 11:55:52 +00005067 } else if (getDarwinToolChain().isTargetMacOS()) {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005068 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
5069 CmdArgs.push_back("-lcrt1.o");
5070 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
5071 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005072 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005073 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005074
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005075 // darwin_crt2 spec is empty.
5076 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005077 }
5078 }
5079 }
5080 }
5081
Tim Northover9c7e0352013-12-12 11:55:52 +00005082 if (getDarwinToolChain().isTargetMacOS() &&
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00005083 Args.hasArg(options::OPT_shared_libgcc) &&
5084 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005085 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005086 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005087 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005088 }
5089 }
5090
5091 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005092
Daniel Dunbarc1964212009-03-26 16:23:12 +00005093 if (Args.hasArg(options::OPT_fopenmp))
5094 // This is more complicated in gcc...
5095 CmdArgs.push_back("-lgomp");
5096
Douglas Gregor9295df02012-05-15 21:00:27 +00005097 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5098
Bob Wilson16d93952012-05-15 18:57:39 +00005099 if (isObjCRuntimeLinked(Args) &&
5100 !Args.hasArg(options::OPT_nostdlib) &&
5101 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005102 // Avoid linking compatibility stubs on i386 mac.
5103 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005104 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00005105 // If we don't have ARC or subscripting runtime support, link in the
5106 // runtime stubs. We have to do this *before* adding any of the normal
5107 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00005108 ObjCRuntime runtime =
5109 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005110 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00005111 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00005112 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00005113 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00005114 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005115 CmdArgs.push_back("-framework");
5116 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005117 // Link libobj.
5118 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005119 }
John McCall31168b02011-06-15 23:02:42 +00005120
Daniel Dunbarc1964212009-03-26 16:23:12 +00005121 if (LinkingOutput) {
5122 CmdArgs.push_back("-arch_multiple");
5123 CmdArgs.push_back("-final_output");
5124 CmdArgs.push_back(LinkingOutput);
5125 }
5126
Daniel Dunbarc1964212009-03-26 16:23:12 +00005127 if (Args.hasArg(options::OPT_fnested_functions))
5128 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005129
Daniel Dunbarc1964212009-03-26 16:23:12 +00005130 if (!Args.hasArg(options::OPT_nostdlib) &&
5131 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005132 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005133 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005134
Daniel Dunbarc1964212009-03-26 16:23:12 +00005135 // link_ssp spec is empty.
5136
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005137 // Let the tool chain choose which runtime library to link.
5138 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005139 }
5140
Chad Rosier06fd3c62012-05-16 23:45:12 +00005141 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005142 !Args.hasArg(options::OPT_nostartfiles)) {
5143 // endfile_spec is empty.
5144 }
5145
5146 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5147 Args.AddAllArgs(CmdArgs, options::OPT_F);
5148
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005149 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005150 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005151 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005152}
5153
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005154void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005155 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005156 const InputInfoList &Inputs,
5157 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005158 const char *LinkingOutput) const {
5159 ArgStringList CmdArgs;
5160
5161 CmdArgs.push_back("-create");
5162 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005163
5164 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005165 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005166
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005167 for (InputInfoList::const_iterator
5168 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5169 const InputInfo &II = *it;
5170 assert(II.isFilename() && "Unexpected lipo input.");
5171 CmdArgs.push_back(II.getFilename());
5172 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005173 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005174 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005175 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005176}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005177
Daniel Dunbar88299622010-06-04 18:28:36 +00005178void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005179 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005180 const InputInfoList &Inputs,
5181 const ArgList &Args,
5182 const char *LinkingOutput) const {
5183 ArgStringList CmdArgs;
5184
Daniel Dunbareb86b042011-05-09 17:23:16 +00005185 CmdArgs.push_back("-o");
5186 CmdArgs.push_back(Output.getFilename());
5187
Daniel Dunbar88299622010-06-04 18:28:36 +00005188 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5189 const InputInfo &Input = Inputs[0];
5190 assert(Input.isFilename() && "Unexpected dsymutil input.");
5191 CmdArgs.push_back(Input.getFilename());
5192
Daniel Dunbar88299622010-06-04 18:28:36 +00005193 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005194 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005195 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005196}
5197
Eric Christopher551ef452011-08-23 17:56:55 +00005198void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005199 const InputInfo &Output,
5200 const InputInfoList &Inputs,
5201 const ArgList &Args,
5202 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005203 ArgStringList CmdArgs;
5204 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005205 CmdArgs.push_back("--debug-info");
5206 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005207 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005208
5209 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5210 const InputInfo &Input = Inputs[0];
5211 assert(Input.isFilename() && "Unexpected verify input");
5212
5213 // Grabbing the output of the earlier dsymutil run.
5214 CmdArgs.push_back(Input.getFilename());
5215
5216 const char *Exec =
5217 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5218 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5219}
5220
David Chisnallf571cde2012-02-15 13:39:01 +00005221void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5222 const InputInfo &Output,
5223 const InputInfoList &Inputs,
5224 const ArgList &Args,
5225 const char *LinkingOutput) const {
5226 ArgStringList CmdArgs;
5227
5228 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5229 options::OPT_Xassembler);
5230
5231 CmdArgs.push_back("-o");
5232 CmdArgs.push_back(Output.getFilename());
5233
5234 for (InputInfoList::const_iterator
5235 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5236 const InputInfo &II = *it;
5237 CmdArgs.push_back(II.getFilename());
5238 }
5239
5240 const char *Exec =
5241 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5242 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5243}
5244
5245
5246void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5247 const InputInfo &Output,
5248 const InputInfoList &Inputs,
5249 const ArgList &Args,
5250 const char *LinkingOutput) const {
5251 // FIXME: Find a real GCC, don't hard-code versions here
5252 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5253 const llvm::Triple &T = getToolChain().getTriple();
5254 std::string LibPath = "/usr/lib/";
5255 llvm::Triple::ArchType Arch = T.getArch();
5256 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005257 case llvm::Triple::x86:
5258 GCCLibPath +=
5259 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5260 break;
5261 case llvm::Triple::x86_64:
5262 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5263 GCCLibPath += "/4.5.2/amd64/";
5264 LibPath += "amd64/";
5265 break;
5266 default:
5267 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005268 }
5269
5270 ArgStringList CmdArgs;
5271
David Chisnall272a0712012-02-29 15:06:12 +00005272 // Demangle C++ names in errors
5273 CmdArgs.push_back("-C");
5274
David Chisnallf571cde2012-02-15 13:39:01 +00005275 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5276 (!Args.hasArg(options::OPT_shared))) {
5277 CmdArgs.push_back("-e");
5278 CmdArgs.push_back("_start");
5279 }
5280
5281 if (Args.hasArg(options::OPT_static)) {
5282 CmdArgs.push_back("-Bstatic");
5283 CmdArgs.push_back("-dn");
5284 } else {
5285 CmdArgs.push_back("-Bdynamic");
5286 if (Args.hasArg(options::OPT_shared)) {
5287 CmdArgs.push_back("-shared");
5288 } else {
5289 CmdArgs.push_back("--dynamic-linker");
5290 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5291 }
5292 }
5293
5294 if (Output.isFilename()) {
5295 CmdArgs.push_back("-o");
5296 CmdArgs.push_back(Output.getFilename());
5297 } else {
5298 assert(Output.isNothing() && "Invalid output.");
5299 }
5300
5301 if (!Args.hasArg(options::OPT_nostdlib) &&
5302 !Args.hasArg(options::OPT_nostartfiles)) {
5303 if (!Args.hasArg(options::OPT_shared)) {
5304 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5305 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005306 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005307 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5308 } else {
5309 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005310 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5311 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005312 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005313 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005314 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005315 }
5316
5317 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5318
5319 Args.AddAllArgs(CmdArgs, options::OPT_L);
5320 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5321 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005322 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005323
5324 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5325
5326 if (!Args.hasArg(options::OPT_nostdlib) &&
5327 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005328 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005329 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005330 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005331 if (!Args.hasArg(options::OPT_shared)) {
5332 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005333 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005334 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005335 }
David Chisnallf571cde2012-02-15 13:39:01 +00005336 }
5337
5338 if (!Args.hasArg(options::OPT_nostdlib) &&
5339 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005340 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005341 }
David Chisnall96de9932012-02-16 16:00:47 +00005342 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005343
5344 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5345
5346 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005347 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005348 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5349}
5350
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005351void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005352 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005353 const InputInfoList &Inputs,
5354 const ArgList &Args,
5355 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005356 ArgStringList CmdArgs;
5357
5358 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5359 options::OPT_Xassembler);
5360
5361 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005362 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005363
5364 for (InputInfoList::const_iterator
5365 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5366 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005367 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005368 }
5369
5370 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005371 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005372 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005373}
5374
5375void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005376 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005377 const InputInfoList &Inputs,
5378 const ArgList &Args,
5379 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005380 ArgStringList CmdArgs;
5381
5382 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005383 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005384 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005385 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005386 }
5387
5388 if (Args.hasArg(options::OPT_static)) {
5389 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005390 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005391 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005392// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005393 CmdArgs.push_back("-Bdynamic");
5394 if (Args.hasArg(options::OPT_shared)) {
5395 CmdArgs.push_back("-shared");
5396 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005397 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005398 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5399 }
5400 }
5401
Daniel Dunbarb440f562010-08-02 02:38:21 +00005402 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005403 CmdArgs.push_back("-o");
5404 CmdArgs.push_back(Output.getFilename());
5405 } else {
5406 assert(Output.isNothing() && "Invalid output.");
5407 }
5408
5409 if (!Args.hasArg(options::OPT_nostdlib) &&
5410 !Args.hasArg(options::OPT_nostartfiles)) {
5411 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005412 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005413 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005414 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005415 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005416 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005417 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005418 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005419 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005420 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005421 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005422 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005423 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005424 }
5425
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005426 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5427 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005428 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005429
5430 Args.AddAllArgs(CmdArgs, options::OPT_L);
5431 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5432 Args.AddAllArgs(CmdArgs, options::OPT_e);
5433
Daniel Dunbar54423b22010-09-17 00:24:54 +00005434 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005435
5436 if (!Args.hasArg(options::OPT_nostdlib) &&
5437 !Args.hasArg(options::OPT_nodefaultlibs)) {
5438 // FIXME: For some reason GCC passes -lgcc before adding
5439 // the default system libraries. Just mimic this for now.
5440 CmdArgs.push_back("-lgcc");
5441
5442 if (Args.hasArg(options::OPT_pthread))
5443 CmdArgs.push_back("-pthread");
5444 if (!Args.hasArg(options::OPT_shared))
5445 CmdArgs.push_back("-lc");
5446 CmdArgs.push_back("-lgcc");
5447 }
5448
5449 if (!Args.hasArg(options::OPT_nostdlib) &&
5450 !Args.hasArg(options::OPT_nostartfiles)) {
5451 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005452 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005453 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005454 }
5455
Bill Wendling08760582011-06-27 19:15:03 +00005456 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005457
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005458 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005459 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005460 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005461}
5462
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005463void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005464 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005465 const InputInfoList &Inputs,
5466 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005467 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005468 ArgStringList CmdArgs;
5469
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005470 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5471 // instruct as in the base system to assemble 32-bit code.
5472 if (getToolChain().getArch() == llvm::Triple::x86)
5473 CmdArgs.push_back("--32");
5474 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5475 CmdArgs.push_back("-mppc");
5476 CmdArgs.push_back("-many");
5477 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5478 getToolChain().getArch() == llvm::Triple::mips64el) {
5479 StringRef CPUName;
5480 StringRef ABIName;
5481 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5482
5483 CmdArgs.push_back("-mabi");
5484 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5485
5486 if (getToolChain().getArch() == llvm::Triple::mips64)
5487 CmdArgs.push_back("-EB");
5488 else
5489 CmdArgs.push_back("-EL");
5490
5491 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5492 options::OPT_fpic, options::OPT_fno_pic,
5493 options::OPT_fPIE, options::OPT_fno_PIE,
5494 options::OPT_fpie, options::OPT_fno_pie);
5495 if (LastPICArg &&
5496 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5497 LastPICArg->getOption().matches(options::OPT_fpic) ||
5498 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5499 LastPICArg->getOption().matches(options::OPT_fpie))) {
5500 CmdArgs.push_back("-KPIC");
5501 }
5502 }
5503
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005504 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5505 options::OPT_Xassembler);
5506
5507 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005508 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005509
5510 for (InputInfoList::const_iterator
5511 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5512 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005513 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005514 }
5515
5516 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005517 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005518 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005519}
5520
5521void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005522 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005523 const InputInfoList &Inputs,
5524 const ArgList &Args,
5525 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005526 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005527 ArgStringList CmdArgs;
5528
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005529 // Silence warning for "clang -g foo.o -o foo"
5530 Args.ClaimAllArgs(options::OPT_g_Group);
5531 // and "clang -emit-llvm foo.o -o foo"
5532 Args.ClaimAllArgs(options::OPT_emit_llvm);
5533 // and for "clang -w foo.o -o foo". Other warning options are already
5534 // handled somewhere else.
5535 Args.ClaimAllArgs(options::OPT_w);
5536
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005537 if (getToolChain().getArch() == llvm::Triple::mips64)
5538 CmdArgs.push_back("-EB");
5539 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5540 CmdArgs.push_back("-EL");
5541
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005542 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005543 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005544 CmdArgs.push_back("-e");
5545 CmdArgs.push_back("__start");
5546 }
5547
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005548 if (Args.hasArg(options::OPT_static)) {
5549 CmdArgs.push_back("-Bstatic");
5550 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005551 if (Args.hasArg(options::OPT_rdynamic))
5552 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005553 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005554 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005555 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005556 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005557 } else {
5558 CmdArgs.push_back("-dynamic-linker");
5559 CmdArgs.push_back("/usr/libexec/ld.so");
5560 }
5561 }
5562
Rafael Espindola044f7832013-06-05 04:28:55 +00005563 if (Args.hasArg(options::OPT_nopie))
5564 CmdArgs.push_back("-nopie");
5565
Daniel Dunbarb440f562010-08-02 02:38:21 +00005566 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005567 CmdArgs.push_back("-o");
5568 CmdArgs.push_back(Output.getFilename());
5569 } else {
5570 assert(Output.isNothing() && "Invalid output.");
5571 }
5572
5573 if (!Args.hasArg(options::OPT_nostdlib) &&
5574 !Args.hasArg(options::OPT_nostartfiles)) {
5575 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005576 if (Args.hasArg(options::OPT_pg))
5577 CmdArgs.push_back(Args.MakeArgString(
5578 getToolChain().GetFilePath("gcrt0.o")));
5579 else
5580 CmdArgs.push_back(Args.MakeArgString(
5581 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005582 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005583 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005584 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005585 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005586 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005587 }
5588 }
5589
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005590 std::string Triple = getToolChain().getTripleString();
5591 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005592 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005593 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005594 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005595
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005596 Args.AddAllArgs(CmdArgs, options::OPT_L);
5597 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5598 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005599 Args.AddAllArgs(CmdArgs, options::OPT_s);
5600 Args.AddAllArgs(CmdArgs, options::OPT_t);
5601 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5602 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005603
Daniel Dunbar54423b22010-09-17 00:24:54 +00005604 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005605
5606 if (!Args.hasArg(options::OPT_nostdlib) &&
5607 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005608 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005609 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005610 if (Args.hasArg(options::OPT_pg))
5611 CmdArgs.push_back("-lm_p");
5612 else
5613 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005614 }
5615
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005616 // FIXME: For some reason GCC passes -lgcc before adding
5617 // the default system libraries. Just mimic this for now.
5618 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005619
Eric Christopher17674ec2012-09-13 06:32:34 +00005620 if (Args.hasArg(options::OPT_pthread)) {
5621 if (!Args.hasArg(options::OPT_shared) &&
5622 Args.hasArg(options::OPT_pg))
5623 CmdArgs.push_back("-lpthread_p");
5624 else
5625 CmdArgs.push_back("-lpthread");
5626 }
5627
Chandler Carruth45661652011-12-17 22:32:42 +00005628 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005629 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005630 CmdArgs.push_back("-lc_p");
5631 else
5632 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005633 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005634
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005635 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005636 }
5637
5638 if (!Args.hasArg(options::OPT_nostdlib) &&
5639 !Args.hasArg(options::OPT_nostartfiles)) {
5640 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005641 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005642 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005643 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005644 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005645 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005646 }
5647
5648 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005649 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005650 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005651}
Ed Schoutene33194b2009-04-02 19:13:12 +00005652
Eli Friedman9fa28852012-08-08 23:57:20 +00005653void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5654 const InputInfo &Output,
5655 const InputInfoList &Inputs,
5656 const ArgList &Args,
5657 const char *LinkingOutput) const {
5658 ArgStringList CmdArgs;
5659
5660 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5661 options::OPT_Xassembler);
5662
5663 CmdArgs.push_back("-o");
5664 CmdArgs.push_back(Output.getFilename());
5665
5666 for (InputInfoList::const_iterator
5667 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5668 const InputInfo &II = *it;
5669 CmdArgs.push_back(II.getFilename());
5670 }
5671
5672 const char *Exec =
5673 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5674 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5675}
5676
5677void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5678 const InputInfo &Output,
5679 const InputInfoList &Inputs,
5680 const ArgList &Args,
5681 const char *LinkingOutput) const {
5682 const Driver &D = getToolChain().getDriver();
5683 ArgStringList CmdArgs;
5684
5685 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5686 (!Args.hasArg(options::OPT_shared))) {
5687 CmdArgs.push_back("-e");
5688 CmdArgs.push_back("__start");
5689 }
5690
5691 if (Args.hasArg(options::OPT_static)) {
5692 CmdArgs.push_back("-Bstatic");
5693 } else {
5694 if (Args.hasArg(options::OPT_rdynamic))
5695 CmdArgs.push_back("-export-dynamic");
5696 CmdArgs.push_back("--eh-frame-hdr");
5697 CmdArgs.push_back("-Bdynamic");
5698 if (Args.hasArg(options::OPT_shared)) {
5699 CmdArgs.push_back("-shared");
5700 } else {
5701 CmdArgs.push_back("-dynamic-linker");
5702 CmdArgs.push_back("/usr/libexec/ld.so");
5703 }
5704 }
5705
5706 if (Output.isFilename()) {
5707 CmdArgs.push_back("-o");
5708 CmdArgs.push_back(Output.getFilename());
5709 } else {
5710 assert(Output.isNothing() && "Invalid output.");
5711 }
5712
5713 if (!Args.hasArg(options::OPT_nostdlib) &&
5714 !Args.hasArg(options::OPT_nostartfiles)) {
5715 if (!Args.hasArg(options::OPT_shared)) {
5716 if (Args.hasArg(options::OPT_pg))
5717 CmdArgs.push_back(Args.MakeArgString(
5718 getToolChain().GetFilePath("gcrt0.o")));
5719 else
5720 CmdArgs.push_back(Args.MakeArgString(
5721 getToolChain().GetFilePath("crt0.o")));
5722 CmdArgs.push_back(Args.MakeArgString(
5723 getToolChain().GetFilePath("crtbegin.o")));
5724 } else {
5725 CmdArgs.push_back(Args.MakeArgString(
5726 getToolChain().GetFilePath("crtbeginS.o")));
5727 }
5728 }
5729
5730 Args.AddAllArgs(CmdArgs, options::OPT_L);
5731 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5732 Args.AddAllArgs(CmdArgs, options::OPT_e);
5733
5734 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5735
5736 if (!Args.hasArg(options::OPT_nostdlib) &&
5737 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005738 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005739 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5740 if (Args.hasArg(options::OPT_pg))
5741 CmdArgs.push_back("-lm_p");
5742 else
5743 CmdArgs.push_back("-lm");
5744 }
5745
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005746 if (Args.hasArg(options::OPT_pthread)) {
5747 if (!Args.hasArg(options::OPT_shared) &&
5748 Args.hasArg(options::OPT_pg))
5749 CmdArgs.push_back("-lpthread_p");
5750 else
5751 CmdArgs.push_back("-lpthread");
5752 }
5753
Eli Friedman9fa28852012-08-08 23:57:20 +00005754 if (!Args.hasArg(options::OPT_shared)) {
5755 if (Args.hasArg(options::OPT_pg))
5756 CmdArgs.push_back("-lc_p");
5757 else
5758 CmdArgs.push_back("-lc");
5759 }
5760
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005761 StringRef MyArch;
5762 switch (getToolChain().getTriple().getArch()) {
5763 case llvm::Triple::arm:
5764 MyArch = "arm";
5765 break;
5766 case llvm::Triple::x86:
5767 MyArch = "i386";
5768 break;
5769 case llvm::Triple::x86_64:
5770 MyArch = "amd64";
5771 break;
5772 default:
5773 llvm_unreachable("Unsupported architecture");
5774 }
5775 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005776 }
5777
5778 if (!Args.hasArg(options::OPT_nostdlib) &&
5779 !Args.hasArg(options::OPT_nostartfiles)) {
5780 if (!Args.hasArg(options::OPT_shared))
5781 CmdArgs.push_back(Args.MakeArgString(
5782 getToolChain().GetFilePath("crtend.o")));
5783 else
5784 CmdArgs.push_back(Args.MakeArgString(
5785 getToolChain().GetFilePath("crtendS.o")));
5786 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005787
5788 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005789 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005790 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005791}
5792
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005793void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005794 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005795 const InputInfoList &Inputs,
5796 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005797 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005798 ArgStringList CmdArgs;
5799
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005800 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5801 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005802 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005803 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005804 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005805 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005806 else if (getToolChain().getArch() == llvm::Triple::mips ||
5807 getToolChain().getArch() == llvm::Triple::mipsel ||
5808 getToolChain().getArch() == llvm::Triple::mips64 ||
5809 getToolChain().getArch() == llvm::Triple::mips64el) {
5810 StringRef CPUName;
5811 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005812 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005813
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005814 CmdArgs.push_back("-march");
5815 CmdArgs.push_back(CPUName.data());
5816
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005817 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005818 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005819
5820 if (getToolChain().getArch() == llvm::Triple::mips ||
5821 getToolChain().getArch() == llvm::Triple::mips64)
5822 CmdArgs.push_back("-EB");
5823 else
5824 CmdArgs.push_back("-EL");
5825
5826 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5827 options::OPT_fpic, options::OPT_fno_pic,
5828 options::OPT_fPIE, options::OPT_fno_PIE,
5829 options::OPT_fpie, options::OPT_fno_pie);
5830 if (LastPICArg &&
5831 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5832 LastPICArg->getOption().matches(options::OPT_fpic) ||
5833 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5834 LastPICArg->getOption().matches(options::OPT_fpie))) {
5835 CmdArgs.push_back("-KPIC");
5836 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005837 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5838 getToolChain().getArch() == llvm::Triple::thumb) {
5839 CmdArgs.push_back("-mfpu=softvfp");
5840 switch(getToolChain().getTriple().getEnvironment()) {
5841 case llvm::Triple::GNUEABI:
5842 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005843 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005844 break;
5845
5846 default:
5847 CmdArgs.push_back("-matpcs");
5848 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005849 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005850
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005851 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5852 options::OPT_Xassembler);
5853
5854 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005855 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005856
5857 for (InputInfoList::const_iterator
5858 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5859 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005860 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005861 }
5862
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005863 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005864 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005865 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005866}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005867
5868void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005869 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005870 const InputInfoList &Inputs,
5871 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005872 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005873 const toolchains::FreeBSD& ToolChain =
5874 static_cast<const toolchains::FreeBSD&>(getToolChain());
5875 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005876 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005877
5878 // Silence warning for "clang -g foo.o -o foo"
5879 Args.ClaimAllArgs(options::OPT_g_Group);
5880 // and "clang -emit-llvm foo.o -o foo"
5881 Args.ClaimAllArgs(options::OPT_emit_llvm);
5882 // and for "clang -w foo.o -o foo". Other warning options are already
5883 // handled somewhere else.
5884 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005885
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005886 if (!D.SysRoot.empty())
5887 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5888
Roman Divackyafe2f232012-08-28 15:09:03 +00005889 if (Args.hasArg(options::OPT_pie))
5890 CmdArgs.push_back("-pie");
5891
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005892 if (Args.hasArg(options::OPT_static)) {
5893 CmdArgs.push_back("-Bstatic");
5894 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005895 if (Args.hasArg(options::OPT_rdynamic))
5896 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005897 CmdArgs.push_back("--eh-frame-hdr");
5898 if (Args.hasArg(options::OPT_shared)) {
5899 CmdArgs.push_back("-Bshareable");
5900 } else {
5901 CmdArgs.push_back("-dynamic-linker");
5902 CmdArgs.push_back("/libexec/ld-elf.so.1");
5903 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005904 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5905 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005906 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5907 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5908 CmdArgs.push_back("--hash-style=both");
5909 }
5910 }
5911 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005912 }
5913
5914 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5915 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005916 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005917 CmdArgs.push_back("-m");
5918 CmdArgs.push_back("elf_i386_fbsd");
5919 }
5920
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005921 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005922 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005923 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005924 }
5925
Daniel Dunbarb440f562010-08-02 02:38:21 +00005926 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005927 CmdArgs.push_back("-o");
5928 CmdArgs.push_back(Output.getFilename());
5929 } else {
5930 assert(Output.isNothing() && "Invalid output.");
5931 }
5932
5933 if (!Args.hasArg(options::OPT_nostdlib) &&
5934 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005935 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005936 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005937 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005938 crt1 = "gcrt1.o";
5939 else if (Args.hasArg(options::OPT_pie))
5940 crt1 = "Scrt1.o";
5941 else
5942 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005943 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005944 if (crt1)
5945 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5946
5947 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5948
5949 const char *crtbegin = NULL;
5950 if (Args.hasArg(options::OPT_static))
5951 crtbegin = "crtbeginT.o";
5952 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5953 crtbegin = "crtbeginS.o";
5954 else
5955 crtbegin = "crtbegin.o";
5956
5957 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005958 }
5959
5960 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005961 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005962 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5963 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005964 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005965 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5966 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005967 Args.AddAllArgs(CmdArgs, options::OPT_s);
5968 Args.AddAllArgs(CmdArgs, options::OPT_t);
5969 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5970 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005971
Alp Tokerce365ca2013-12-02 12:43:03 +00005972 if (D.IsUsingLTO(Args))
5973 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00005974
Roman Divackyafe2f232012-08-28 15:09:03 +00005975 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005976
5977 if (!Args.hasArg(options::OPT_nostdlib) &&
5978 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005979 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005980 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005981 if (Args.hasArg(options::OPT_pg))
5982 CmdArgs.push_back("-lm_p");
5983 else
5984 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005985 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005986 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5987 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005988 if (Args.hasArg(options::OPT_pg))
5989 CmdArgs.push_back("-lgcc_p");
5990 else
5991 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005992 if (Args.hasArg(options::OPT_static)) {
5993 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005994 } else if (Args.hasArg(options::OPT_pg)) {
5995 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005996 } else {
5997 CmdArgs.push_back("--as-needed");
5998 CmdArgs.push_back("-lgcc_s");
5999 CmdArgs.push_back("--no-as-needed");
6000 }
6001
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006002 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006003 if (Args.hasArg(options::OPT_pg))
6004 CmdArgs.push_back("-lpthread_p");
6005 else
6006 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006007 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006008
Roman Divacky66f22762011-02-10 16:59:40 +00006009 if (Args.hasArg(options::OPT_pg)) {
6010 if (Args.hasArg(options::OPT_shared))
6011 CmdArgs.push_back("-lc");
6012 else
6013 CmdArgs.push_back("-lc_p");
6014 CmdArgs.push_back("-lgcc_p");
6015 } else {
6016 CmdArgs.push_back("-lc");
6017 CmdArgs.push_back("-lgcc");
6018 }
6019
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006020 if (Args.hasArg(options::OPT_static)) {
6021 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006022 } else if (Args.hasArg(options::OPT_pg)) {
6023 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006024 } else {
6025 CmdArgs.push_back("--as-needed");
6026 CmdArgs.push_back("-lgcc_s");
6027 CmdArgs.push_back("--no-as-needed");
6028 }
6029 }
6030
6031 if (!Args.hasArg(options::OPT_nostdlib) &&
6032 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00006033 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00006034 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006035 else
6036 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006037 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006038 }
6039
Roman Divackyafe2f232012-08-28 15:09:03 +00006040 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006041
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006042 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006043 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006044 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006045}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006046
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006047void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6048 const InputInfo &Output,
6049 const InputInfoList &Inputs,
6050 const ArgList &Args,
6051 const char *LinkingOutput) const {
6052 ArgStringList CmdArgs;
6053
6054 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6055 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006056 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006057 CmdArgs.push_back("--32");
6058
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006059 // Pass the target CPU to GNU as for ARM, since the source code might
6060 // not have the correct .cpu annotation.
6061 if (getToolChain().getArch() == llvm::Triple::arm) {
Bernard Ogden31561762013-12-12 13:27:11 +00006062 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006063 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6064 }
6065
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006066 if (getToolChain().getArch() == llvm::Triple::mips ||
6067 getToolChain().getArch() == llvm::Triple::mipsel ||
6068 getToolChain().getArch() == llvm::Triple::mips64 ||
6069 getToolChain().getArch() == llvm::Triple::mips64el) {
6070 StringRef CPUName;
6071 StringRef ABIName;
6072 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6073
6074 CmdArgs.push_back("-march");
6075 CmdArgs.push_back(CPUName.data());
6076
6077 CmdArgs.push_back("-mabi");
6078 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6079
6080 if (getToolChain().getArch() == llvm::Triple::mips ||
6081 getToolChain().getArch() == llvm::Triple::mips64)
6082 CmdArgs.push_back("-EB");
6083 else
6084 CmdArgs.push_back("-EL");
6085
6086 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6087 options::OPT_fpic, options::OPT_fno_pic,
6088 options::OPT_fPIE, options::OPT_fno_PIE,
6089 options::OPT_fpie, options::OPT_fno_pie);
6090 if (LastPICArg &&
6091 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6092 LastPICArg->getOption().matches(options::OPT_fpic) ||
6093 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6094 LastPICArg->getOption().matches(options::OPT_fpie))) {
6095 CmdArgs.push_back("-KPIC");
6096 }
6097 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006098
6099 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6100 options::OPT_Xassembler);
6101
6102 CmdArgs.push_back("-o");
6103 CmdArgs.push_back(Output.getFilename());
6104
6105 for (InputInfoList::const_iterator
6106 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6107 const InputInfo &II = *it;
6108 CmdArgs.push_back(II.getFilename());
6109 }
6110
David Chisnallddbd68f2011-09-27 22:03:18 +00006111 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006112 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6113}
6114
6115void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6116 const InputInfo &Output,
6117 const InputInfoList &Inputs,
6118 const ArgList &Args,
6119 const char *LinkingOutput) const {
6120 const Driver &D = getToolChain().getDriver();
6121 ArgStringList CmdArgs;
6122
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006123 if (!D.SysRoot.empty())
6124 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6125
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006126 if (Args.hasArg(options::OPT_static)) {
6127 CmdArgs.push_back("-Bstatic");
6128 } else {
6129 if (Args.hasArg(options::OPT_rdynamic))
6130 CmdArgs.push_back("-export-dynamic");
6131 CmdArgs.push_back("--eh-frame-hdr");
6132 if (Args.hasArg(options::OPT_shared)) {
6133 CmdArgs.push_back("-Bshareable");
6134 } else {
6135 CmdArgs.push_back("-dynamic-linker");
6136 CmdArgs.push_back("/libexec/ld.elf_so");
6137 }
6138 }
6139
6140 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6141 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006142 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006143 CmdArgs.push_back("-m");
6144 CmdArgs.push_back("elf_i386");
6145 }
6146
6147 if (Output.isFilename()) {
6148 CmdArgs.push_back("-o");
6149 CmdArgs.push_back(Output.getFilename());
6150 } else {
6151 assert(Output.isNothing() && "Invalid output.");
6152 }
6153
6154 if (!Args.hasArg(options::OPT_nostdlib) &&
6155 !Args.hasArg(options::OPT_nostartfiles)) {
6156 if (!Args.hasArg(options::OPT_shared)) {
6157 CmdArgs.push_back(Args.MakeArgString(
6158 getToolChain().GetFilePath("crt0.o")));
6159 CmdArgs.push_back(Args.MakeArgString(
6160 getToolChain().GetFilePath("crti.o")));
6161 CmdArgs.push_back(Args.MakeArgString(
6162 getToolChain().GetFilePath("crtbegin.o")));
6163 } else {
6164 CmdArgs.push_back(Args.MakeArgString(
6165 getToolChain().GetFilePath("crti.o")));
6166 CmdArgs.push_back(Args.MakeArgString(
6167 getToolChain().GetFilePath("crtbeginS.o")));
6168 }
6169 }
6170
6171 Args.AddAllArgs(CmdArgs, options::OPT_L);
6172 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6173 Args.AddAllArgs(CmdArgs, options::OPT_e);
6174 Args.AddAllArgs(CmdArgs, options::OPT_s);
6175 Args.AddAllArgs(CmdArgs, options::OPT_t);
6176 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6177 Args.AddAllArgs(CmdArgs, options::OPT_r);
6178
6179 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6180
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006181 unsigned Major, Minor, Micro;
6182 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6183 bool useLibgcc = true;
6184 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
6185 if (getToolChain().getArch() == llvm::Triple::x86 ||
6186 getToolChain().getArch() == llvm::Triple::x86_64)
6187 useLibgcc = false;
6188 }
6189
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006190 if (!Args.hasArg(options::OPT_nostdlib) &&
6191 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006192 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006193 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6194 CmdArgs.push_back("-lm");
6195 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006196 if (Args.hasArg(options::OPT_pthread))
6197 CmdArgs.push_back("-lpthread");
6198 CmdArgs.push_back("-lc");
6199
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006200 if (useLibgcc) {
6201 if (Args.hasArg(options::OPT_static)) {
6202 // libgcc_eh depends on libc, so resolve as much as possible,
6203 // pull in any new requirements from libc and then get the rest
6204 // of libgcc.
6205 CmdArgs.push_back("-lgcc_eh");
6206 CmdArgs.push_back("-lc");
6207 CmdArgs.push_back("-lgcc");
6208 } else {
6209 CmdArgs.push_back("-lgcc");
6210 CmdArgs.push_back("--as-needed");
6211 CmdArgs.push_back("-lgcc_s");
6212 CmdArgs.push_back("--no-as-needed");
6213 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006214 }
6215 }
6216
6217 if (!Args.hasArg(options::OPT_nostdlib) &&
6218 !Args.hasArg(options::OPT_nostartfiles)) {
6219 if (!Args.hasArg(options::OPT_shared))
6220 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6221 "crtend.o")));
6222 else
6223 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6224 "crtendS.o")));
6225 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6226 "crtn.o")));
6227 }
6228
Bill Wendling08760582011-06-27 19:15:03 +00006229 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006230
Rafael Espindola236db462013-11-09 20:07:19 +00006231 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006232 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6233}
6234
Thomas Schwinge4e555262013-03-28 19:04:25 +00006235void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6236 const InputInfo &Output,
6237 const InputInfoList &Inputs,
6238 const ArgList &Args,
6239 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006240 ArgStringList CmdArgs;
6241
6242 // Add --32/--64 to make sure we get the format we want.
6243 // This is incomplete
6244 if (getToolChain().getArch() == llvm::Triple::x86) {
6245 CmdArgs.push_back("--32");
6246 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6247 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006248 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6249 CmdArgs.push_back("-a32");
6250 CmdArgs.push_back("-mppc");
6251 CmdArgs.push_back("-many");
6252 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6253 CmdArgs.push_back("-a64");
6254 CmdArgs.push_back("-mppc64");
6255 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006256 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6257 CmdArgs.push_back("-a64");
6258 CmdArgs.push_back("-mppc64le");
6259 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00006260 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006261 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006262 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6263 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006264 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6265 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006266
Tim Northover9c7e0352013-12-12 11:55:52 +00006267 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6268 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006269 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006270
6271 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006272
6273 // FIXME: remove krait check when GNU tools support krait cpu
6274 // for now replace it with -march=armv7-a to avoid a lower
6275 // march from being picked in the absence of a cpu flag.
6276 Arg *A;
6277 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6278 StringRef(A->getValue()) == "krait")
6279 CmdArgs.push_back("-march=armv7-a");
6280 else
6281 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006282 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006283 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6284 getToolChain().getArch() == llvm::Triple::mipsel ||
6285 getToolChain().getArch() == llvm::Triple::mips64 ||
6286 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006287 StringRef CPUName;
6288 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006289 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006290
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006291 CmdArgs.push_back("-march");
6292 CmdArgs.push_back(CPUName.data());
6293
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006294 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006295 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006296
6297 if (getToolChain().getArch() == llvm::Triple::mips ||
6298 getToolChain().getArch() == llvm::Triple::mips64)
6299 CmdArgs.push_back("-EB");
6300 else
6301 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006302
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006303 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6304 if (StringRef(A->getValue()) == "2008")
6305 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6306 }
6307
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006308 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006309 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6310 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6311 options::OPT_mno_micromips);
6312 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6313 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6314
Simon Atanasyanbd986632013-11-26 11:58:04 +00006315 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6316 // Do not use AddLastArg because not all versions of MIPS assembler
6317 // support -mmsa / -mno-msa options.
6318 if (A->getOption().matches(options::OPT_mmsa))
6319 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6320 }
6321
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006322 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6323 options::OPT_fpic, options::OPT_fno_pic,
6324 options::OPT_fPIE, options::OPT_fno_PIE,
6325 options::OPT_fpie, options::OPT_fno_pie);
6326 if (LastPICArg &&
6327 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6328 LastPICArg->getOption().matches(options::OPT_fpic) ||
6329 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6330 LastPICArg->getOption().matches(options::OPT_fpie))) {
6331 CmdArgs.push_back("-KPIC");
6332 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006333 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006334 // Always pass an -march option, since our default of z10 is later
6335 // than the GNU assembler's default.
6336 StringRef CPUName = getSystemZTargetCPU(Args);
6337 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006338 }
6339
6340 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6341 options::OPT_Xassembler);
6342
6343 CmdArgs.push_back("-o");
6344 CmdArgs.push_back(Output.getFilename());
6345
6346 for (InputInfoList::const_iterator
6347 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6348 const InputInfo &II = *it;
6349 CmdArgs.push_back(II.getFilename());
6350 }
6351
6352 const char *Exec =
6353 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6354 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006355
6356 // Handle the debug info splitting at object creation time if we're
6357 // creating an object.
6358 // TODO: Currently only works on linux with newer objcopy.
6359 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006360 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006361 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6362 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006363}
6364
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006365static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6366 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006367 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006368 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6369 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006370 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006371 CmdArgs.push_back("-lgcc");
6372
Logan Chien3d3373c2012-11-19 12:04:11 +00006373 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006374 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006375 CmdArgs.push_back("-lgcc");
6376 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006377 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006378 CmdArgs.push_back("--as-needed");
6379 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006380 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006381 CmdArgs.push_back("--no-as-needed");
6382 }
6383
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006384 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006385 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006386 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006387 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006388
6389 // According to Android ABI, we have to link with libdl if we are
6390 // linking with non-static libgcc.
6391 //
6392 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6393 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6394 if (isAndroid && !StaticLibgcc)
6395 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006396}
6397
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006398static bool hasMipsN32ABIArg(const ArgList &Args) {
6399 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006400 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006401}
6402
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006403static StringRef getLinuxDynamicLinker(const ArgList &Args,
6404 const toolchains::Linux &ToolChain) {
6405 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6406 return "/system/bin/linker";
6407 else if (ToolChain.getArch() == llvm::Triple::x86)
6408 return "/lib/ld-linux.so.2";
6409 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6410 return "/lib/ld-linux-aarch64.so.1";
6411 else if (ToolChain.getArch() == llvm::Triple::arm ||
6412 ToolChain.getArch() == llvm::Triple::thumb) {
6413 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6414 return "/lib/ld-linux-armhf.so.3";
6415 else
6416 return "/lib/ld-linux.so.3";
6417 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6418 ToolChain.getArch() == llvm::Triple::mipsel)
6419 return "/lib/ld.so.1";
6420 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6421 ToolChain.getArch() == llvm::Triple::mips64el) {
6422 if (hasMipsN32ABIArg(Args))
6423 return "/lib32/ld.so.1";
6424 else
6425 return "/lib64/ld.so.1";
6426 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6427 return "/lib/ld.so.1";
6428 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006429 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006430 ToolChain.getArch() == llvm::Triple::systemz)
6431 return "/lib64/ld64.so.1";
6432 else
6433 return "/lib64/ld-linux-x86-64.so.2";
6434}
6435
Thomas Schwinge4e555262013-03-28 19:04:25 +00006436void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6437 const InputInfo &Output,
6438 const InputInfoList &Inputs,
6439 const ArgList &Args,
6440 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006441 const toolchains::Linux& ToolChain =
6442 static_cast<const toolchains::Linux&>(getToolChain());
6443 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006444 const bool isAndroid =
6445 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006446 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006447 const bool IsPIE =
6448 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006449 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006450
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006451 ArgStringList CmdArgs;
6452
Rafael Espindolad1002f62010-11-15 18:28:16 +00006453 // Silence warning for "clang -g foo.o -o foo"
6454 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006455 // and "clang -emit-llvm foo.o -o foo"
6456 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006457 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006458 // handled somewhere else.
6459 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006460
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006461 if (!D.SysRoot.empty())
6462 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006463
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006464 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006465 CmdArgs.push_back("-pie");
6466
Rafael Espindola1c76c592010-11-07 22:57:16 +00006467 if (Args.hasArg(options::OPT_rdynamic))
6468 CmdArgs.push_back("-export-dynamic");
6469
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006470 if (Args.hasArg(options::OPT_s))
6471 CmdArgs.push_back("-s");
6472
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006473 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6474 e = ToolChain.ExtraOpts.end();
6475 i != e; ++i)
6476 CmdArgs.push_back(i->c_str());
6477
6478 if (!Args.hasArg(options::OPT_static)) {
6479 CmdArgs.push_back("--eh-frame-hdr");
6480 }
6481
6482 CmdArgs.push_back("-m");
6483 if (ToolChain.getArch() == llvm::Triple::x86)
6484 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006485 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6486 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006487 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006488 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006489 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006490 else if (ToolChain.getArch() == llvm::Triple::ppc)
6491 CmdArgs.push_back("elf32ppclinux");
6492 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6493 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006494 else if (ToolChain.getArch() == llvm::Triple::mips)
6495 CmdArgs.push_back("elf32btsmip");
6496 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6497 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006498 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6499 if (hasMipsN32ABIArg(Args))
6500 CmdArgs.push_back("elf32btsmipn32");
6501 else
6502 CmdArgs.push_back("elf64btsmip");
6503 }
6504 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6505 if (hasMipsN32ABIArg(Args))
6506 CmdArgs.push_back("elf32ltsmipn32");
6507 else
6508 CmdArgs.push_back("elf64ltsmip");
6509 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006510 else if (ToolChain.getArch() == llvm::Triple::systemz)
6511 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006512 else
6513 CmdArgs.push_back("elf_x86_64");
6514
6515 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006516 if (ToolChain.getArch() == llvm::Triple::arm
6517 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006518 CmdArgs.push_back("-Bstatic");
6519 else
6520 CmdArgs.push_back("-static");
6521 } else if (Args.hasArg(options::OPT_shared)) {
6522 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006523 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006524 CmdArgs.push_back("-Bsymbolic");
6525 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006526 }
6527
6528 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006529 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006530 (!Args.hasArg(options::OPT_static) &&
6531 !Args.hasArg(options::OPT_shared))) {
6532 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006533 CmdArgs.push_back(Args.MakeArgString(
6534 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006535 }
6536
6537 CmdArgs.push_back("-o");
6538 CmdArgs.push_back(Output.getFilename());
6539
Rafael Espindola81937ec2010-12-01 01:52:43 +00006540 if (!Args.hasArg(options::OPT_nostdlib) &&
6541 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006542 if (!isAndroid) {
6543 const char *crt1 = NULL;
6544 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006545 if (Args.hasArg(options::OPT_pg))
6546 crt1 = "gcrt1.o";
6547 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006548 crt1 = "Scrt1.o";
6549 else
6550 crt1 = "crt1.o";
6551 }
6552 if (crt1)
6553 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006554
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006555 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6556 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006557
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006558 const char *crtbegin;
6559 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006560 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006561 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006562 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006563 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006564 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006565 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006566 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006567 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006568
6569 // Add crtfastmath.o if available and fast math is enabled.
6570 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006571 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006572
6573 Args.AddAllArgs(CmdArgs, options::OPT_L);
6574
6575 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6576
Roman Divackyee8188a2011-03-01 17:53:14 +00006577 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6578 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006579 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006580
Alp Tokerce365ca2013-12-02 12:43:03 +00006581 if (D.IsUsingLTO(Args))
6582 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006583
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006584 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6585 CmdArgs.push_back("--no-demangle");
6586
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006587 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6588
Eric Christopher04997782012-11-29 18:51:05 +00006589 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006590 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006591 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006592 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006593 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006594 if (Sanitize.needsAsanRt())
6595 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6596 if (Sanitize.needsTsanRt())
6597 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006598 if (Sanitize.needsMsanRt())
6599 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006600 if (Sanitize.needsLsanRt())
6601 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006602 if (Sanitize.needsDfsanRt())
6603 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006604
Chandler Carruthe4458b32013-06-24 09:38:45 +00006605 // The profile runtime also needs access to system libraries.
6606 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6607
Hans Wennborg70850d82013-07-18 20:29:38 +00006608 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006609 !Args.hasArg(options::OPT_nostdlib) &&
6610 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006611 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6612 !Args.hasArg(options::OPT_static);
6613 if (OnlyLibstdcxxStatic)
6614 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006615 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006616 if (OnlyLibstdcxxStatic)
6617 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006618 CmdArgs.push_back("-lm");
6619 }
6620
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006621 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006622 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6623 if (Args.hasArg(options::OPT_static))
6624 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006625
Chandler Carruth01538002013-01-17 13:19:29 +00006626 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6627 if (OpenMP) {
6628 CmdArgs.push_back("-lgomp");
6629
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006630 // FIXME: Exclude this for platforms with libgomp that don't require
6631 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006632 CmdArgs.push_back("-lrt");
6633 }
6634
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006635 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006636
Chandler Carruth94a32012012-05-14 18:31:18 +00006637 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006638 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006639 CmdArgs.push_back("-lpthread");
6640
6641 CmdArgs.push_back("-lc");
6642
6643 if (Args.hasArg(options::OPT_static))
6644 CmdArgs.push_back("--end-group");
6645 else
6646 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6647 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006648
Rafael Espindola81937ec2010-12-01 01:52:43 +00006649 if (!Args.hasArg(options::OPT_nostartfiles)) {
6650 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006651 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006652 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006653 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006654 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006655 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006656 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006657
Rafael Espindola81937ec2010-12-01 01:52:43 +00006658 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006659 if (!isAndroid)
6660 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006661 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006662 }
6663
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006664 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6665}
Rafael Espindola92b00932010-08-10 00:25:48 +00006666
Chris Lattner3e2ee142010-07-07 16:01:42 +00006667void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006668 const InputInfo &Output,
6669 const InputInfoList &Inputs,
6670 const ArgList &Args,
6671 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006672 ArgStringList CmdArgs;
6673
6674 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6675 options::OPT_Xassembler);
6676
6677 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006678 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006679
6680 for (InputInfoList::const_iterator
6681 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6682 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006683 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006684 }
6685
6686 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006687 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006688 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006689}
6690
6691void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006692 const InputInfo &Output,
6693 const InputInfoList &Inputs,
6694 const ArgList &Args,
6695 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006696 const Driver &D = getToolChain().getDriver();
6697 ArgStringList CmdArgs;
6698
Daniel Dunbarb440f562010-08-02 02:38:21 +00006699 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006700 CmdArgs.push_back("-o");
6701 CmdArgs.push_back(Output.getFilename());
6702 } else {
6703 assert(Output.isNothing() && "Invalid output.");
6704 }
6705
6706 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006707 !Args.hasArg(options::OPT_nostartfiles)) {
6708 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6709 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6710 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6711 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6712 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006713
6714 Args.AddAllArgs(CmdArgs, options::OPT_L);
6715 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6716 Args.AddAllArgs(CmdArgs, options::OPT_e);
6717
Daniel Dunbar54423b22010-09-17 00:24:54 +00006718 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006719
Eli Friedman83de5132011-12-08 23:54:21 +00006720 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6721
Chris Lattner3e2ee142010-07-07 16:01:42 +00006722 if (!Args.hasArg(options::OPT_nostdlib) &&
6723 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006724 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006725 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006726 CmdArgs.push_back("-lm");
6727 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006728 }
6729
6730 if (!Args.hasArg(options::OPT_nostdlib) &&
6731 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006732 if (Args.hasArg(options::OPT_pthread))
6733 CmdArgs.push_back("-lpthread");
6734 CmdArgs.push_back("-lc");
6735 CmdArgs.push_back("-lCompilerRT-Generic");
6736 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6737 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006738 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006739 }
6740
Rafael Espindola236db462013-11-09 20:07:19 +00006741 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006742 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006743}
6744
Daniel Dunbarcc912342009-05-02 18:28:39 +00006745/// DragonFly Tools
6746
6747// For now, DragonFly Assemble does just about the same as for
6748// FreeBSD, but this may change soon.
6749void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006750 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006751 const InputInfoList &Inputs,
6752 const ArgList &Args,
6753 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006754 ArgStringList CmdArgs;
6755
6756 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6757 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006758 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006759 CmdArgs.push_back("--32");
6760
6761 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6762 options::OPT_Xassembler);
6763
6764 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006765 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006766
6767 for (InputInfoList::const_iterator
6768 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6769 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006770 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006771 }
6772
6773 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006774 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006775 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006776}
6777
6778void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006779 const InputInfo &Output,
6780 const InputInfoList &Inputs,
6781 const ArgList &Args,
6782 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006783 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006784 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006785 ArgStringList CmdArgs;
6786
John McCall65b8da02013-04-11 22:55:55 +00006787 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6788 UseGCC47 = false;
6789
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006790 if (!D.SysRoot.empty())
6791 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6792
John McCall65b8da02013-04-11 22:55:55 +00006793 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006794 if (Args.hasArg(options::OPT_static)) {
6795 CmdArgs.push_back("-Bstatic");
6796 } else {
John McCall65b8da02013-04-11 22:55:55 +00006797 if (Args.hasArg(options::OPT_rdynamic))
6798 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006799 if (Args.hasArg(options::OPT_shared))
6800 CmdArgs.push_back("-Bshareable");
6801 else {
6802 CmdArgs.push_back("-dynamic-linker");
6803 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6804 }
John McCall65b8da02013-04-11 22:55:55 +00006805 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006806 }
6807
6808 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6809 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006810 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006811 CmdArgs.push_back("-m");
6812 CmdArgs.push_back("elf_i386");
6813 }
6814
Daniel Dunbarb440f562010-08-02 02:38:21 +00006815 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006816 CmdArgs.push_back("-o");
6817 CmdArgs.push_back(Output.getFilename());
6818 } else {
6819 assert(Output.isNothing() && "Invalid output.");
6820 }
6821
6822 if (!Args.hasArg(options::OPT_nostdlib) &&
6823 !Args.hasArg(options::OPT_nostartfiles)) {
6824 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006825 if (Args.hasArg(options::OPT_pg))
6826 CmdArgs.push_back(Args.MakeArgString(
6827 getToolChain().GetFilePath("gcrt1.o")));
6828 else {
6829 if (Args.hasArg(options::OPT_pie))
6830 CmdArgs.push_back(Args.MakeArgString(
6831 getToolChain().GetFilePath("Scrt1.o")));
6832 else
6833 CmdArgs.push_back(Args.MakeArgString(
6834 getToolChain().GetFilePath("crt1.o")));
6835 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006836 }
John McCall65b8da02013-04-11 22:55:55 +00006837 CmdArgs.push_back(Args.MakeArgString(
6838 getToolChain().GetFilePath("crti.o")));
6839 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6840 CmdArgs.push_back(Args.MakeArgString(
6841 getToolChain().GetFilePath("crtbeginS.o")));
6842 else
6843 CmdArgs.push_back(Args.MakeArgString(
6844 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006845 }
6846
6847 Args.AddAllArgs(CmdArgs, options::OPT_L);
6848 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6849 Args.AddAllArgs(CmdArgs, options::OPT_e);
6850
Daniel Dunbar54423b22010-09-17 00:24:54 +00006851 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006852
6853 if (!Args.hasArg(options::OPT_nostdlib) &&
6854 !Args.hasArg(options::OPT_nodefaultlibs)) {
6855 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6856 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006857 if (UseGCC47)
6858 CmdArgs.push_back("-L/usr/lib/gcc47");
6859 else
6860 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006861
6862 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006863 if (UseGCC47) {
6864 CmdArgs.push_back("-rpath");
6865 CmdArgs.push_back("/usr/lib/gcc47");
6866 } else {
6867 CmdArgs.push_back("-rpath");
6868 CmdArgs.push_back("/usr/lib/gcc44");
6869 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006870 }
6871
Hans Wennborg70850d82013-07-18 20:29:38 +00006872 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006873 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006874 CmdArgs.push_back("-lm");
6875 }
6876
Daniel Dunbarcc912342009-05-02 18:28:39 +00006877 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006878 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006879
6880 if (!Args.hasArg(options::OPT_nolibc)) {
6881 CmdArgs.push_back("-lc");
6882 }
6883
John McCall65b8da02013-04-11 22:55:55 +00006884 if (UseGCC47) {
6885 if (Args.hasArg(options::OPT_static) ||
6886 Args.hasArg(options::OPT_static_libgcc)) {
6887 CmdArgs.push_back("-lgcc");
6888 CmdArgs.push_back("-lgcc_eh");
6889 } else {
6890 if (Args.hasArg(options::OPT_shared_libgcc)) {
6891 CmdArgs.push_back("-lgcc_pic");
6892 if (!Args.hasArg(options::OPT_shared))
6893 CmdArgs.push_back("-lgcc");
6894 } else {
6895 CmdArgs.push_back("-lgcc");
6896 CmdArgs.push_back("--as-needed");
6897 CmdArgs.push_back("-lgcc_pic");
6898 CmdArgs.push_back("--no-as-needed");
6899 }
6900 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006901 } else {
John McCall65b8da02013-04-11 22:55:55 +00006902 if (Args.hasArg(options::OPT_shared)) {
6903 CmdArgs.push_back("-lgcc_pic");
6904 } else {
6905 CmdArgs.push_back("-lgcc");
6906 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006907 }
6908 }
6909
6910 if (!Args.hasArg(options::OPT_nostdlib) &&
6911 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006912 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006913 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006914 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006915 else
6916 CmdArgs.push_back(Args.MakeArgString(
6917 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006918 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006919 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006920 }
6921
Bill Wendling08760582011-06-27 19:15:03 +00006922 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006923
Daniel Dunbarcc912342009-05-02 18:28:39 +00006924 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006925 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006926 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006927}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006928
6929void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6930 const InputInfo &Output,
6931 const InputInfoList &Inputs,
6932 const ArgList &Args,
6933 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006934 ArgStringList CmdArgs;
6935
6936 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006937 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6938 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006939 } else {
6940 assert(Output.isNothing() && "Invalid output.");
6941 }
6942
6943 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006944 !Args.hasArg(options::OPT_nostartfiles) &&
6945 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006946 CmdArgs.push_back("-defaultlib:libcmt");
6947 }
6948
6949 CmdArgs.push_back("-nologo");
6950
Hans Wennborgf1a74252013-09-10 20:18:04 +00006951 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6952
6953 if (DLL) {
6954 CmdArgs.push_back(Args.MakeArgString("-dll"));
6955
6956 SmallString<128> ImplibName(Output.getFilename());
6957 llvm::sys::path::replace_extension(ImplibName, "lib");
6958 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6959 ImplibName.str()));
6960 }
6961
Peter Collingbourne32701642013-11-01 18:16:25 +00006962 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006963 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006964 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006965 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006966 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6967 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006968 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006969 } else {
6970 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6971 }
6972 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006973 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6974 }
6975
Michael J. Spencere2f49362012-06-18 16:56:04 +00006976 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006977 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006978
6979 // Add filenames immediately.
6980 for (InputInfoList::const_iterator
6981 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6982 if (it->isFilename())
6983 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006984 else
6985 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006986 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006987
6988 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006989 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006990 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6991}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006992
6993void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6994 const InputInfo &Output,
6995 const InputInfoList &Inputs,
6996 const ArgList &Args,
6997 const char *LinkingOutput) const {
6998 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6999}
7000
Hans Wennborg188382e2013-09-20 18:16:35 +00007001// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7002// If one cannot be found, return FallbackName.
7003// We do this special search to prevent clang-cl from falling back onto itself
7004// if it's available as cl.exe on the path.
7005static std::string FindFallback(const char *FallbackName,
7006 const char *ClangProgramPath) {
7007 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7008 if (!OptPath.hasValue())
7009 return FallbackName;
7010
7011#ifdef LLVM_ON_WIN32
7012 const StringRef PathSeparators = ";";
7013#else
7014 const StringRef PathSeparators = ":";
7015#endif
7016
7017 SmallVector<StringRef, 8> PathSegments;
7018 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7019
7020 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7021 const StringRef &PathSegment = PathSegments[i];
7022 if (PathSegment.empty())
7023 continue;
7024
7025 SmallString<128> FilePath(PathSegment);
7026 llvm::sys::path::append(FilePath, FallbackName);
7027 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7028 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7029 return FilePath.str();
7030 }
7031
7032 return FallbackName;
7033}
7034
Hans Wennborg87cfa712013-09-19 20:32:16 +00007035Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7036 const InputInfo &Output,
7037 const InputInfoList &Inputs,
7038 const ArgList &Args,
7039 const char *LinkingOutput) const {
7040 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007041 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007042 CmdArgs.push_back("/c"); // Compile only.
7043 CmdArgs.push_back("/W0"); // No warnings.
7044
7045 // The goal is to be able to invoke this tool correctly based on
7046 // any flag accepted by clang-cl.
7047
7048 // These are spelled the same way in clang and cl.exe,.
7049 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7050 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007051
7052 // Optimization level.
7053 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7054 if (A->getOption().getID() == options::OPT_O0) {
7055 CmdArgs.push_back("/Od");
7056 } else {
7057 StringRef OptLevel = A->getValue();
7058 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7059 A->render(Args, CmdArgs);
7060 else if (OptLevel == "3")
7061 CmdArgs.push_back("/Ox");
7062 }
7063 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007064
7065 // Flags for which clang-cl have an alias.
7066 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7067
7068 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7069 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7070 : "/GR-");
7071 if (Args.hasArg(options::OPT_fsyntax_only))
7072 CmdArgs.push_back("/Zs");
7073
Hans Wennborg260ff402013-09-27 17:54:18 +00007074 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7075 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7076 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7077
Hans Wennborg87cfa712013-09-19 20:32:16 +00007078 // Flags that can simply be passed through.
7079 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7080 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7081
7082 // The order of these flags is relevant, so pick the last one.
7083 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7084 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7085 A->render(Args, CmdArgs);
7086
7087
7088 // Input filename.
7089 assert(Inputs.size() == 1);
7090 const InputInfo &II = Inputs[0];
7091 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7092 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7093 if (II.isFilename())
7094 CmdArgs.push_back(II.getFilename());
7095 else
7096 II.getInputArg().renderAsInput(Args, CmdArgs);
7097
7098 // Output filename.
7099 assert(Output.getType() == types::TY_Object);
7100 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7101 Output.getFilename());
7102 CmdArgs.push_back(Fo);
7103
Hans Wennborg188382e2013-09-20 18:16:35 +00007104 const Driver &D = getToolChain().getDriver();
7105 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007106
Hans Wennborg188382e2013-09-20 18:16:35 +00007107 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007108}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007109
7110
7111/// XCore Tools
7112// We pass assemble and link construction to the xcc tool.
7113
7114void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7115 const InputInfo &Output,
7116 const InputInfoList &Inputs,
7117 const ArgList &Args,
7118 const char *LinkingOutput) const {
7119 ArgStringList CmdArgs;
7120
7121 CmdArgs.push_back("-o");
7122 CmdArgs.push_back(Output.getFilename());
7123
7124 CmdArgs.push_back("-c");
7125
7126 if (Args.hasArg(options::OPT_g_Group)) {
7127 CmdArgs.push_back("-g");
7128 }
7129
7130 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7131 options::OPT_Xassembler);
7132
7133 for (InputInfoList::const_iterator
7134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7135 const InputInfo &II = *it;
7136 CmdArgs.push_back(II.getFilename());
7137 }
7138
7139 const char *Exec =
7140 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7141 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7142}
7143
7144void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7145 const InputInfo &Output,
7146 const InputInfoList &Inputs,
7147 const ArgList &Args,
7148 const char *LinkingOutput) const {
7149 ArgStringList CmdArgs;
7150
7151 if (Output.isFilename()) {
7152 CmdArgs.push_back("-o");
7153 CmdArgs.push_back(Output.getFilename());
7154 } else {
7155 assert(Output.isNothing() && "Invalid output.");
7156 }
7157
7158 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7159
7160 const char *Exec =
7161 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7162 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7163}