blob: 3053d9bde7da29c64434370f6ec79042a7c09d5e [file] [log] [blame]
Nick Lewyckye3365aa2010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar47ac7d22009-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 Carruth55fc8732012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000012#include "ToolChains.h"
Stephen Hines0e2c34f2015-03-23 12:09:02 -070013#include "clang/Basic/CharInfo.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070014#include "clang/Basic/LangOptions.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderby02341792013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Stephen Hines0e2c34f2015-03-23 12:09:02 -070017#include "clang/Config/config.h"
Daniel Dunbar1d460332009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar88137642009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregor55d3f7a2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar5b750fe2009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070035#include "llvm/Support/Compression.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000036#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000037#include "llvm/Support/FileSystem.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000038#include "llvm/Support/Host.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000039#include "llvm/Support/Path.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000040#include "llvm/Support/Process.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070041#include "llvm/Support/Program.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000042#include "llvm/Support/raw_ostream.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000043
Stephen Hines0e2c34f2015-03-23 12:09:02 -070044#ifdef LLVM_ON_UNIX
45#include <unistd.h> // For getuid().
46#endif
47
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000048using namespace clang::driver;
49using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000050using namespace clang;
Reid Klecknerb1e25a12013-06-14 17:17:23 +000051using namespace llvm::opt;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000052
Stephen Hines651f13c2014-04-23 16:59:28 -070053static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
54 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
55 options::OPT_fpic, options::OPT_fno_pic,
56 options::OPT_fPIE, options::OPT_fno_PIE,
57 options::OPT_fpie, options::OPT_fno_pie);
58 if (!LastPICArg)
59 return;
60 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
61 LastPICArg->getOption().matches(options::OPT_fpic) ||
62 LastPICArg->getOption().matches(options::OPT_fPIE) ||
63 LastPICArg->getOption().matches(options::OPT_fpie)) {
64 CmdArgs.push_back("-KPIC");
65 }
66}
67
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000068/// CheckPreprocessingOptions - Perform some validation of preprocessing
69/// arguments that is shared with gcc.
70static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Stephen Hinesef822542014-07-21 00:47:37 -070071 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
72 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
73 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +000074 D.Diag(diag::err_drv_argument_only_allowed_with)
Stephen Hinesef822542014-07-21 00:47:37 -070075 << A->getBaseArg().getAsString(Args)
76 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
77 }
78 }
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000079}
80
Daniel Dunbare2fd6642009-09-10 01:21:12 +000081/// CheckCodeGenerationOptions - Perform some validation of code generation
82/// arguments that is shared with gcc.
83static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
84 // In gcc, only ARM checks this, but it seems reasonable to check universally.
85 if (Args.hasArg(options::OPT_static))
86 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
87 options::OPT_mdynamic_no_pic))
Chris Lattner5f9e2722011-07-23 10:55:15 +000088 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbare2fd6642009-09-10 01:21:12 +000089 << A->getAsString(Args) << "-static";
90}
91
Stephen Hines176edba2014-12-01 14:53:08 -080092// Add backslashes to escape spaces and other backslashes.
93// This is used for the space-separated argument list specified with
94// the -dwarf-debug-flags option.
95static void EscapeSpacesAndBackslashes(const char *Arg,
96 SmallVectorImpl<char> &Res) {
97 for ( ; *Arg; ++Arg) {
98 switch (*Arg) {
99 default: break;
100 case ' ':
101 case '\\':
102 Res.push_back('\\');
103 break;
104 }
105 Res.push_back(*Arg);
106 }
107}
108
Chris Lattner3edbeb72010-03-29 17:55:58 +0000109// Quote target names for inclusion in GNU Make dependency files.
110// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000111static void QuoteTarget(StringRef Target,
112 SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000113 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
114 switch (Target[i]) {
115 case ' ':
116 case '\t':
117 // Escape the preceding backslashes
118 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
119 Res.push_back('\\');
120
121 // Escape the space/tab
122 Res.push_back('\\');
123 break;
124 case '$':
125 Res.push_back('$');
126 break;
127 case '#':
128 Res.push_back('\\');
129 break;
130 default:
131 break;
132 }
133
134 Res.push_back(Target[i]);
135 }
136}
137
Bill Wendling3d717152012-03-12 22:10:06 +0000138static void addDirectoryList(const ArgList &Args,
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000139 ArgStringList &CmdArgs,
140 const char *ArgName,
Bill Wendling3d717152012-03-12 22:10:06 +0000141 const char *EnvVar) {
142 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000143 bool CombinedArg = false;
144
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000145 if (!DirList)
146 return; // Nothing to do.
147
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000148 StringRef Name(ArgName);
149 if (Name.equals("-I") || Name.equals("-L"))
150 CombinedArg = true;
151
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000152 StringRef Dirs(DirList);
153 if (Dirs.empty()) // Empty string should not add '.'.
154 return;
155
156 StringRef::size_type Delim;
Rafael Espindola8db7ec02013-06-25 14:29:51 +0000157 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000158 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000159 if (CombinedArg) {
160 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
161 } else {
162 CmdArgs.push_back(ArgName);
163 CmdArgs.push_back(".");
164 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000165 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000166 if (CombinedArg) {
167 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000172 }
Nico Weber09c5c392012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000190 }
191}
192
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000193static void AddLinkerInputs(const ToolChain &TC,
194 const InputInfoList &Inputs, const ArgList &Args,
195 ArgStringList &CmdArgs) {
196 const Driver &D = TC.getDriver();
197
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000198 // Add extra linker input arguments which are not treated as inputs
199 // (constructed via -Xarch_).
200 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
201
Stephen Hinesef822542014-07-21 00:47:37 -0700202 for (const auto &II : Inputs) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000203 if (!TC.HasNativeLLVMSupport()) {
204 // Don't try to pass LLVM inputs unless we have native support.
205 if (II.getType() == types::TY_LLVM_IR ||
206 II.getType() == types::TY_LTO_IR ||
207 II.getType() == types::TY_LLVM_BC ||
208 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000209 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000210 << TC.getTripleString();
211 }
212
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000213 // Add filenames immediately.
214 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000215 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000216 continue;
217 }
218
219 // Otherwise, this is a linker input argument.
220 const Arg &A = II.getInputArg();
221
222 // Handle reserved library options.
Stephen Hinesef822542014-07-21 00:47:37 -0700223 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000224 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Stephen Hinesef822542014-07-21 00:47:37 -0700225 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Sen7433fed2010-09-17 18:39:08 +0000226 TC.AddCCKextLibArgs(Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -0800227 else if (A.getOption().matches(options::OPT_z)) {
228 // Pass -z prefix for gcc linker compatibility.
229 A.claim();
230 A.render(Args, CmdArgs);
231 } else {
232 A.renderAsInput(Args, CmdArgs);
233 }
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000234 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000235
236 // LIBRARY_PATH - included following the user specified library paths.
Stephen Hines651f13c2014-04-23 16:59:28 -0700237 // and only supported on native toolchains.
238 if (!TC.isCrossCompiling())
239 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000240}
241
John McCallf85e1932011-06-15 23:02:42 +0000242/// \brief Determine whether Objective-C automated reference counting is
243/// enabled.
244static bool isObjCAutoRefCount(const ArgList &Args) {
245 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
246}
247
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000248/// \brief Determine whether we are linking the ObjC runtime.
249static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000250 if (isObjCAutoRefCount(Args)) {
251 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000252 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000253 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000254 return Args.hasArg(options::OPT_fobjc_link_runtime);
255}
256
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000257static bool forwardToGCC(const Option &O) {
Reid Kleckner4cd90df2013-06-19 15:09:06 +0000258 // Don't forward inputs from the original command line. They are added from
259 // InputInfoList.
Richard Smithe40bc4b2013-06-20 01:33:59 +0000260 return O.getKind() != Option::InputClass &&
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000261 !O.hasFlag(options::DriverOption) &&
262 !O.hasFlag(options::LinkerInput);
263}
264
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000265void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier9d718632013-01-24 19:14:47 +0000266 const JobAction &JA,
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000267 const Driver &D,
Douglas Gregordf91ef32009-04-18 00:34:01 +0000268 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000269 ArgStringList &CmdArgs,
270 const InputInfo &Output,
271 const InputInfoList &Inputs) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000272 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000273
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000274 CheckPreprocessingOptions(D, Args);
275
276 Args.AddLastArg(CmdArgs, options::OPT_C);
277 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000278
279 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000280 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000281 (A = Args.getLastArg(options::OPT_MD)) ||
282 (A = Args.getLastArg(options::OPT_MMD))) {
283 // Determine the output location.
284 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000285 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000286 DepFile = MF->getValue();
Chad Rosier9d718632013-01-24 19:14:47 +0000287 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000288 } else if (Output.getType() == types::TY_Dependencies) {
289 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000290 } else if (A->getOption().matches(options::OPT_M) ||
291 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000292 DepFile = "-";
293 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +0000294 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000295 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000296 }
297 CmdArgs.push_back("-dependency-file");
298 CmdArgs.push_back(DepFile);
299
Chris Lattner3edbeb72010-03-29 17:55:58 +0000300 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000301 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
302 const char *DepTarget;
303
304 // If user provided -o, that is the dependency target, except
305 // when we are only generating a dependency file.
306 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
307 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000308 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000309 } else {
310 // Otherwise derive from the base input.
311 //
312 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000313 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000314 llvm::sys::path::replace_extension(P, "o");
315 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000316 }
317
318 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000320 QuoteTarget(DepTarget, Quoted);
321 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000322 }
323
Daniel Dunbarb827a052009-11-19 03:26:40 +0000324 if (A->getOption().matches(options::OPT_M) ||
325 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000326 CmdArgs.push_back("-sys-header-deps");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700327 if ((isa<PrecompileJobAction>(JA) &&
328 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
329 Args.hasArg(options::OPT_fmodule_file_deps))
Stephen Hines651f13c2014-04-23 16:59:28 -0700330 CmdArgs.push_back("-module-file-deps");
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000331 }
332
Peter Collingbournebb527862011-07-12 19:35:15 +0000333 if (Args.hasArg(options::OPT_MG)) {
334 if (!A || A->getOption().matches(options::OPT_MD) ||
335 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000336 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000337 CmdArgs.push_back("-MG");
338 }
339
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000340 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000341
342 // Convert all -MQ <target> args to -MT <quoted target>
343 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
344 options::OPT_MQ),
345 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000346 const Arg *A = *it;
347 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000348
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000349 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000350 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000351 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000352 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000353 CmdArgs.push_back(Args.MakeArgString(Quoted));
354
355 // -MT flag - no change
356 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000357 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000358 }
359 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000360
Douglas Gregordf91ef32009-04-18 00:34:01 +0000361 // Add -i* options, and automatically translate to
362 // -include-pch/-include-pth for transparent PCH support. It's
363 // wonky, but we include looking for .gch so we can support seamless
364 // replacement into a build system already set up to be generating
365 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000366 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000367 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
368 ie = Args.filtered_end(); it != ie; ++it) {
369 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000370
371 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000372 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
373 RenderedImplicitInclude = true;
374
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000375 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000376 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000377
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000378 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000379 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000380 SmallString<128> P(A->getValue());
381 // We want the files to have a name like foo.h.pch. Add a dummy extension
382 // so that replace_extension does the right thing.
383 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000384 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000385 llvm::sys::path::replace_extension(P, "pch");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700386 if (llvm::sys::fs::exists(P))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000387 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000388 }
389
Douglas Gregordf91ef32009-04-18 00:34:01 +0000390 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000391 llvm::sys::path::replace_extension(P, "pth");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700392 if (llvm::sys::fs::exists(P))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000393 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000394 }
395
Douglas Gregordf91ef32009-04-18 00:34:01 +0000396 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000397 llvm::sys::path::replace_extension(P, "gch");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700398 if (llvm::sys::fs::exists(P)) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000399 FoundPCH = UsePCH;
400 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000401 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000402 }
403
404 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000405 if (IsFirstImplicitInclude) {
406 A->claim();
407 if (UsePCH)
408 CmdArgs.push_back("-include-pch");
409 else
410 CmdArgs.push_back("-include-pth");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700411 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000412 continue;
413 } else {
414 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000415 D.Diag(diag::warn_drv_pch_not_first_include)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700416 << P << A->getAsString(Args);
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000417 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000418 }
419 }
420
421 // Not translated, render as usual.
422 A->claim();
423 A->render(Args, CmdArgs);
424 }
425
426 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000427 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
428 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000429
430 // Add -Wp, and -Xassembler if using the preprocessor.
431
432 // FIXME: There is a very unfortunate problem here, some troubled
433 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
434 // really support that we would have to parse and then translate
435 // those options. :(
436 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
437 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000438
439 // -I- is a deprecated GCC feature, reject it.
440 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000441 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000442
443 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
444 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000445 StringRef sysroot = C.getSysRoot();
446 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000447 if (!Args.hasArg(options::OPT_isysroot)) {
448 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000449 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000450 }
451 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000452
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000453 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000454 // FIXME: We should probably sink the logic for handling these from the
455 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000456 // CPATH - included following the user specified includes (but prior to
457 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000458 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000459 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000461 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000463 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000465 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000467
Chandler Carruth88491fc2011-11-04 07:12:53 +0000468 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000469 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000470 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000471
472 // Add system include arguments.
473 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000474}
475
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000476// FIXME: Move to target hook.
477static bool isSignedCharDefault(const llvm::Triple &Triple) {
478 switch (Triple.getArch()) {
479 default:
480 return true;
481
Tim Northoverc264e162013-01-31 12:13:10 +0000482 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -0700483 case llvm::Triple::aarch64_be:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000484 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -0700485 case llvm::Triple::armeb:
Stephen Hines176edba2014-12-01 14:53:08 -0800486 case llvm::Triple::thumb:
487 case llvm::Triple::thumbeb:
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700488 if (Triple.isOSDarwin() || Triple.isOSWindows())
489 return true;
490 return false;
491
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000492 case llvm::Triple::ppc:
493 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000494 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000495 return true;
496 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000497
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000498 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000499 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000500 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000501 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000502 }
503}
504
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000505static bool isNoCommonDefault(const llvm::Triple &Triple) {
506 switch (Triple.getArch()) {
507 default:
508 return false;
509
510 case llvm::Triple::xcore:
511 return true;
512 }
513}
514
Silviu Baranga1db2e272013-10-21 10:54:53 +0000515// Handle -mhwdiv=.
516static void getARMHWDivFeatures(const Driver &D, const Arg *A,
517 const ArgList &Args,
518 std::vector<const char *> &Features) {
519 StringRef HWDiv = A->getValue();
520 if (HWDiv == "arm") {
521 Features.push_back("+hwdiv-arm");
522 Features.push_back("-hwdiv");
523 } else if (HWDiv == "thumb") {
524 Features.push_back("-hwdiv-arm");
525 Features.push_back("+hwdiv");
526 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
527 Features.push_back("+hwdiv-arm");
528 Features.push_back("+hwdiv");
529 } else if (HWDiv == "none") {
530 Features.push_back("-hwdiv-arm");
531 Features.push_back("-hwdiv");
532 } else
533 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
534}
Stephen Hines176edba2014-12-01 14:53:08 -0800535
Amara Emersonfe7ed042013-10-01 10:20:54 +0000536// Handle -mfpu=.
537//
538// FIXME: Centralize feature selection, defaulting shouldn't be also in the
539// frontend target.
540static void getARMFPUFeatures(const Driver &D, const Arg *A,
541 const ArgList &Args,
542 std::vector<const char *> &Features) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000543 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000544
545 // Set the target features based on the FPU.
546 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
547 // Disable any default FPU support.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000548 Features.push_back("-vfp2");
549 Features.push_back("-vfp3");
550 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700551 } else if (FPU == "vfp") {
552 Features.push_back("+vfp2");
553 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000554 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000555 Features.push_back("+vfp3");
556 Features.push_back("+d16");
557 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000558 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000559 Features.push_back("+vfp3");
560 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700561 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
562 Features.push_back("+vfp4");
563 Features.push_back("+d16");
564 Features.push_back("-neon");
565 } else if (FPU == "vfp4" || FPU == "vfpv4") {
566 Features.push_back("+vfp4");
567 Features.push_back("-neon");
568 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
569 Features.push_back("+vfp4");
570 Features.push_back("+d16");
571 Features.push_back("+fp-only-sp");
572 Features.push_back("-neon");
Stephen Hines176edba2014-12-01 14:53:08 -0800573 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
574 Features.push_back("+fp-armv8");
575 Features.push_back("+fp-only-sp");
576 Features.push_back("+d16");
577 Features.push_back("-neon");
578 Features.push_back("-crypto");
579 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
580 FPU == "fp5-d16" || FPU == "fpv5-d16") {
581 Features.push_back("+fp-armv8");
582 Features.push_back("+d16");
583 Features.push_back("-neon");
584 Features.push_back("-crypto");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000585 } else if (FPU == "fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000586 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000587 Features.push_back("-neon");
588 Features.push_back("-crypto");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000589 } else if (FPU == "neon-fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000590 Features.push_back("+fp-armv8");
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000591 Features.push_back("+neon");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000592 Features.push_back("-crypto");
Amara Emersoncdc532c2013-09-19 13:54:03 +0000593 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersoncdc532c2013-09-19 13:54:03 +0000594 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000595 Features.push_back("+neon");
596 Features.push_back("+crypto");
Chad Rosier99317272012-04-04 20:51:35 +0000597 } else if (FPU == "neon") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000598 Features.push_back("+neon");
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700599 } else if (FPU == "neon-vfpv3") {
600 Features.push_back("+vfp3");
601 Features.push_back("+neon");
602 } else if (FPU == "neon-vfpv4") {
603 Features.push_back("+neon");
604 Features.push_back("+vfp4");
Amara Emersonfe7ed042013-10-01 10:20:54 +0000605 } else if (FPU == "none") {
606 Features.push_back("-vfp2");
607 Features.push_back("-vfp3");
608 Features.push_back("-vfp4");
609 Features.push_back("-fp-armv8");
610 Features.push_back("-crypto");
611 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000612 } else
613 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
614}
615
Anton Korobeynikove2571792012-04-09 13:38:30 +0000616// Select the float ABI as determined by -msoft-float, -mhard-float, and
617// -mfloat-abi=.
Stephen Hines651f13c2014-04-23 16:59:28 -0700618StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
619 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000620 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000621 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
622 options::OPT_mhard_float,
623 options::OPT_mfloat_abi_EQ)) {
624 if (A->getOption().matches(options::OPT_msoft_float))
625 FloatABI = "soft";
626 else if (A->getOption().matches(options::OPT_mhard_float))
627 FloatABI = "hard";
628 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000629 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000630 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000631 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000632 << A->getAsString(Args);
633 FloatABI = "soft";
634 }
635 }
636 }
637
638 // If unspecified, choose the default based on the platform.
639 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000640 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000641 case llvm::Triple::Darwin:
642 case llvm::Triple::MacOSX:
643 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000644 // Darwin defaults to "softfp" for v6 and v7.
645 //
646 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000647 std::string ArchName =
Stephen Hines651f13c2014-04-23 16:59:28 -0700648 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000649 if (StringRef(ArchName).startswith("v6") ||
650 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
656
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700657 // FIXME: this is invalid for WindowsCE
658 case llvm::Triple::Win32:
659 FloatABI = "hard";
660 break;
661
Rafael Espindola27fa2362012-12-13 04:17:14 +0000662 case llvm::Triple::FreeBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -0700663 switch(Triple.getEnvironment()) {
664 case llvm::Triple::GNUEABIHF:
665 FloatABI = "hard";
666 break;
667 default:
668 // FreeBSD defaults to soft float
669 FloatABI = "soft";
670 break;
671 }
Rafael Espindola27fa2362012-12-13 04:17:14 +0000672 break;
673
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000674 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000675 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000676 case llvm::Triple::GNUEABIHF:
677 FloatABI = "hard";
678 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000679 case llvm::Triple::GNUEABI:
680 FloatABI = "softfp";
681 break;
Stephen Hines651f13c2014-04-23 16:59:28 -0700682 case llvm::Triple::EABIHF:
683 FloatABI = "hard";
684 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000685 case llvm::Triple::EABI:
686 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
687 FloatABI = "softfp";
688 break;
Logan Chien94a71422012-09-02 09:30:11 +0000689 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000690 std::string ArchName =
Stephen Hines651f13c2014-04-23 16:59:28 -0700691 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000692 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000693 FloatABI = "softfp";
694 else
695 FloatABI = "soft";
696 break;
697 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000698 default:
699 // Assume "soft", but warn the user we are guessing.
700 FloatABI = "soft";
Stephen Hines651f13c2014-04-23 16:59:28 -0700701 if (Triple.getOS() != llvm::Triple::UnknownOS ||
702 !Triple.isOSBinFormatMachO())
703 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000704 break;
705 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000706 }
707 }
708
Anton Korobeynikove2571792012-04-09 13:38:30 +0000709 return FloatABI;
710}
711
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000712static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
713 const ArgList &Args,
Stephen Hines651f13c2014-04-23 16:59:28 -0700714 std::vector<const char *> &Features,
715 bool ForAS) {
716 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
717 if (!ForAS) {
718 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
719 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
720 // stripped out by the ARM target. We should probably pass this a new
721 // -target-option, which is handled by the -cc1/-cc1as invocation.
722 //
723 // FIXME2: For consistency, it would be ideal if we set up the target
724 // machine state the same when using the frontend or the assembler. We don't
725 // currently do that for the assembler, we pass the options directly to the
726 // backend and never even instantiate the frontend TargetInfo. If we did,
727 // and used its handleTargetFeatures hook, then we could ensure the
728 // assembler and the frontend behave the same.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000729
Stephen Hines651f13c2014-04-23 16:59:28 -0700730 // Use software floating point operations?
731 if (FloatABI == "soft")
732 Features.push_back("+soft-float");
733
734 // Use software floating point argument passing?
735 if (FloatABI != "hard")
736 Features.push_back("+soft-float-abi");
737 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000738
739 // Honor -mfpu=.
740 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +0000741 getARMFPUFeatures(D, A, Args, Features);
Silviu Baranga1db2e272013-10-21 10:54:53 +0000742 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
743 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000744
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000745 // Setting -msoft-float effectively disables NEON because of the GCC
746 // implementation, although the same isn't true of VFP or VFP3.
Stephen Hines651f13c2014-04-23 16:59:28 -0700747 if (FloatABI == "soft") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000748 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700749 // Also need to explicitly disable features which imply NEON.
750 Features.push_back("-crypto");
751 }
Bernard Ogden909f35a2013-10-29 09:47:51 +0000752
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700753 // En/disable crc code generation.
754 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden909f35a2013-10-29 09:47:51 +0000755 if (A->getOption().matches(options::OPT_mcrc))
756 Features.push_back("+crc");
757 else
758 Features.push_back("-crc");
759 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000760}
Anton Korobeynikove2571792012-04-09 13:38:30 +0000761
762void Clang::AddARMTargetArgs(const ArgList &Args,
763 ArgStringList &CmdArgs,
764 bool KernelOrKext) const {
765 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000766 // Get the effective triple, which takes into account the deployment target.
767 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
768 llvm::Triple Triple(TripleStr);
Stephen Hines651f13c2014-04-23 16:59:28 -0700769 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000770
771 // Select the ABI to use.
772 //
773 // FIXME: Support -meabi.
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700774 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700775 const char *ABIName = nullptr;
Anton Korobeynikove2571792012-04-09 13:38:30 +0000776 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000777 ABIName = A->getValue();
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700778 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000779 // The backend is hardwired to assume AAPCS for M-class processors, ensure
780 // the frontend matches that.
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000781 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700782 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000783 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000784 ABIName = "aapcs";
785 } else {
786 ABIName = "apcs-gnu";
787 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700788 } else if (Triple.isOSWindows()) {
789 // FIXME: this is invalid for WindowsCE
790 ABIName = "aapcs";
Anton Korobeynikove2571792012-04-09 13:38:30 +0000791 } else {
792 // Select the default based on the platform.
793 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000794 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000795 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000796 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000797 ABIName = "aapcs-linux";
798 break;
Stephen Hines651f13c2014-04-23 16:59:28 -0700799 case llvm::Triple::EABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000800 case llvm::Triple::EABI:
801 ABIName = "aapcs";
802 break;
803 default:
Stephen Hines176edba2014-12-01 14:53:08 -0800804 if (Triple.getOS() == llvm::Triple::NetBSD)
805 ABIName = "apcs-gnu";
806 else
807 ABIName = "aapcs";
808 break;
Anton Korobeynikove2571792012-04-09 13:38:30 +0000809 }
810 }
811 CmdArgs.push_back("-target-abi");
812 CmdArgs.push_back(ABIName);
813
Anton Korobeynikove2571792012-04-09 13:38:30 +0000814 // Determine floating point ABI from the options & target defaults.
Stephen Hines651f13c2014-04-23 16:59:28 -0700815 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000816 if (FloatABI == "soft") {
817 // Floating point operations and argument passing are soft.
818 //
819 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000820 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000821 CmdArgs.push_back("-mfloat-abi");
822 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000823 } else if (FloatABI == "softfp") {
824 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000825 CmdArgs.push_back("-mfloat-abi");
826 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000827 } else {
828 // Floating point operations and argument passing are hard.
829 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000830 CmdArgs.push_back("-mfloat-abi");
831 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000832 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000833
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000834 // Kernel code has more strict alignment requirements.
835 if (KernelOrKext) {
Cameron Esfahani57b1da12013-09-14 01:09:11 +0000836 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000837 CmdArgs.push_back("-backend-option");
838 CmdArgs.push_back("-arm-long-calls");
839 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000840
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000841 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000842 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000843
844 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000845 CmdArgs.push_back("-backend-option");
Renato Golinebc313d2013-08-15 20:54:45 +0000846 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000847 }
Chad Rosier1b906052011-08-26 00:26:29 +0000848
Stephen Hines176edba2014-12-01 14:53:08 -0800849 // -mkernel implies -mstrict-align; don't add the redundant option.
850 if (!KernelOrKext) {
851 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
852 options::OPT_munaligned_access)) {
853 CmdArgs.push_back("-backend-option");
854 if (A->getOption().matches(options::OPT_mno_unaligned_access))
855 CmdArgs.push_back("-arm-strict-align");
856 else {
857 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
858 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
859 CmdArgs.push_back("-arm-no-strict-align");
860 }
861 }
862 }
863
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700864 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosier1b906052011-08-26 00:26:29 +0000865 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
866 options::OPT_mno_global_merge)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700867 CmdArgs.push_back("-backend-option");
Chad Rosier1b906052011-08-26 00:26:29 +0000868 if (A->getOption().matches(options::OPT_mno_global_merge))
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700869 CmdArgs.push_back("-arm-global-merge=false");
870 else
871 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosier1b906052011-08-26 00:26:29 +0000872 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000873
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000874 if (!Args.hasFlag(options::OPT_mimplicit_float,
875 options::OPT_mno_implicit_float,
876 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000877 CmdArgs.push_back("-no-implicit-float");
Renato Golin45bd2942013-08-24 14:44:35 +0000878
Stephen Hines651f13c2014-04-23 16:59:28 -0700879 // llvm does not support reserving registers in general. There is support
880 // for reserving r9 on ARM though (defined as a platform-specific register
881 // in ARM EABI).
882 if (Args.hasArg(options::OPT_ffixed_r9)) {
883 CmdArgs.push_back("-backend-option");
884 CmdArgs.push_back("-arm-reserve-r9");
885 }
886}
887
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700888/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
889/// targeting.
890static std::string getAArch64TargetCPU(const ArgList &Args) {
Stephen Hines176edba2014-12-01 14:53:08 -0800891 Arg *A;
892 std::string CPU;
893 // If we have -mtune or -mcpu, use that.
894 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
895 CPU = A->getValue();
896 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
897 StringRef Mcpu = A->getValue();
898 CPU = Mcpu.split("+").first;
Stephen Hines651f13c2014-04-23 16:59:28 -0700899 }
900
Stephen Hines176edba2014-12-01 14:53:08 -0800901 // Handle CPU name is 'native'.
902 if (CPU == "native")
903 return llvm::sys::getHostCPUName();
904 else if (CPU.size())
905 return CPU;
Stephen Hines651f13c2014-04-23 16:59:28 -0700906
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700907 // Make sure we pick "cyclone" if -arch is used.
908 // FIXME: Should this be picked by checking the target triple instead?
909 if (Args.getLastArg(options::OPT_arch))
910 return "cyclone";
911
912 return "generic";
Stephen Hines651f13c2014-04-23 16:59:28 -0700913}
914
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700915void Clang::AddAArch64TargetArgs(const ArgList &Args,
916 ArgStringList &CmdArgs) const {
Stephen Hines651f13c2014-04-23 16:59:28 -0700917 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
918 llvm::Triple Triple(TripleStr);
919
920 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
921 Args.hasArg(options::OPT_mkernel) ||
922 Args.hasArg(options::OPT_fapple_kext))
923 CmdArgs.push_back("-disable-red-zone");
924
925 if (!Args.hasFlag(options::OPT_mimplicit_float,
926 options::OPT_mno_implicit_float, true))
927 CmdArgs.push_back("-no-implicit-float");
928
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700929 const char *ABIName = nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -0700930 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
931 ABIName = A->getValue();
932 else if (Triple.isOSDarwin())
933 ABIName = "darwinpcs";
934 else
935 ABIName = "aapcs";
936
937 CmdArgs.push_back("-target-abi");
938 CmdArgs.push_back(ABIName);
939
Stephen Hines176edba2014-12-01 14:53:08 -0800940 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
941 options::OPT_munaligned_access)) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700942 CmdArgs.push_back("-backend-option");
Stephen Hines176edba2014-12-01 14:53:08 -0800943 if (A->getOption().matches(options::OPT_mno_unaligned_access))
944 CmdArgs.push_back("-aarch64-strict-align");
945 else
946 CmdArgs.push_back("-aarch64-no-strict-align");
Stephen Hines651f13c2014-04-23 16:59:28 -0700947 }
Stephen Hinesef822542014-07-21 00:47:37 -0700948
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700949 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
950 options::OPT_mno_fix_cortex_a53_835769)) {
951 CmdArgs.push_back("-backend-option");
952 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
953 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
954 else
955 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
956 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
957 // Enabled A53 errata (835769) workaround by default on android
958 CmdArgs.push_back("-backend-option");
959 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
960 }
961
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700962 // Forward the -mglobal-merge option for explicit control over the pass.
Stephen Hinesef822542014-07-21 00:47:37 -0700963 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
964 options::OPT_mno_global_merge)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700965 CmdArgs.push_back("-backend-option");
Stephen Hinesef822542014-07-21 00:47:37 -0700966 if (A->getOption().matches(options::OPT_mno_global_merge))
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700967 CmdArgs.push_back("-aarch64-global-merge=false");
968 else
969 CmdArgs.push_back("-aarch64-global-merge=true");
Stephen Hinesef822542014-07-21 00:47:37 -0700970 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700971
972 if (Args.hasArg(options::OPT_ffixed_x18)) {
973 CmdArgs.push_back("-backend-option");
974 CmdArgs.push_back("-aarch64-reserve-x18");
975 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000976}
977
Simon Atanasyana2768be2012-04-07 22:09:23 +0000978// Get CPU and ABI names. They are not independent
979// so we have to calculate them together.
Stephen Hines176edba2014-12-01 14:53:08 -0800980void mips::getMipsCPUAndABI(const ArgList &Args,
981 const llvm::Triple &Triple,
982 StringRef &CPUName,
983 StringRef &ABIName) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700984 const char *DefMips32CPU = "mips32r2";
985 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000986
Stephen Hinesef822542014-07-21 00:47:37 -0700987 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
988 // default for mips64(el)?-img-linux-gnu.
989 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
990 Triple.getEnvironment() == llvm::Triple::GNU) {
991 DefMips32CPU = "mips32r6";
992 DefMips64CPU = "mips64r6";
993 }
994
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700995 // MIPS3 is the default for mips64*-unknown-openbsd.
996 if (Triple.getOS() == llvm::Triple::OpenBSD)
997 DefMips64CPU = "mips3";
998
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000999 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan66751bc2013-10-09 12:12:24 +00001000 options::OPT_mcpu_EQ))
1001 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001002
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001003 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001004 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001005 // Convert a GNU style Mips ABI name to the name
1006 // accepted by LLVM Mips backend.
1007 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1008 .Case("32", "o32")
1009 .Case("64", "n64")
1010 .Default(ABIName);
1011 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001012
1013 // Setup default CPU and ABI names.
1014 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +00001015 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001016 default:
1017 llvm_unreachable("Unexpected triple arch name");
1018 case llvm::Triple::mips:
1019 case llvm::Triple::mipsel:
1020 CPUName = DefMips32CPU;
1021 break;
1022 case llvm::Triple::mips64:
1023 case llvm::Triple::mips64el:
1024 CPUName = DefMips64CPU;
1025 break;
1026 }
1027 }
1028
Stephen Hinesef822542014-07-21 00:47:37 -07001029 if (ABIName.empty()) {
1030 // Deduce ABI name from the target triple.
1031 if (Triple.getArch() == llvm::Triple::mips ||
1032 Triple.getArch() == llvm::Triple::mipsel)
1033 ABIName = "o32";
1034 else
1035 ABIName = "n64";
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001036 }
1037
Stephen Hinesef822542014-07-21 00:47:37 -07001038 if (CPUName.empty()) {
1039 // Deduce CPU name from ABI name.
1040 CPUName = llvm::StringSwitch<const char *>(ABIName)
1041 .Cases("o32", "eabi", DefMips32CPU)
1042 .Cases("n32", "n64", DefMips64CPU)
1043 .Default("");
1044 }
Stephen Hines176edba2014-12-01 14:53:08 -08001045
1046 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyana2768be2012-04-07 22:09:23 +00001047}
1048
Simon Atanasyane9616a42013-02-27 14:55:49 +00001049// Convert ABI name to the GNU tools acceptable variant.
1050static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1051 return llvm::StringSwitch<llvm::StringRef>(ABI)
1052 .Case("o32", "32")
1053 .Case("n64", "64")
1054 .Default(ABI);
1055}
1056
Simon Atanasyan5e627792012-06-02 15:06:29 +00001057// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1058// and -mfloat-abi=.
1059static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001060 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +00001061 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001062 options::OPT_mhard_float,
1063 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +00001064 if (A->getOption().matches(options::OPT_msoft_float))
1065 FloatABI = "soft";
1066 else if (A->getOption().matches(options::OPT_mhard_float))
1067 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001068 else {
Richard Smith1d489cf2012-11-01 04:30:05 +00001069 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +00001070 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001071 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001072 FloatABI = "hard";
1073 }
1074 }
Eric Christophered734732010-03-02 02:41:08 +00001075 }
1076
1077 // If unspecified, choose the default based on the platform.
1078 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001079 // Assume "hard", because it's a default value used by gcc.
1080 // When we start to recognize specific target MIPS processors,
1081 // we will be able to select the default more correctly.
1082 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +00001083 }
1084
Simon Atanasyan5e627792012-06-02 15:06:29 +00001085 return FloatABI;
1086}
1087
Simon Atanasyandc536f52012-07-05 18:51:43 +00001088static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001089 std::vector<const char *> &Features,
1090 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +00001091 StringRef FeatureName) {
1092 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +00001093 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001094 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001095 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001096 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001097 }
1098}
1099
Stephen Hines176edba2014-12-01 14:53:08 -08001100static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1101 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001102 std::vector<const char *> &Features) {
Stephen Hines176edba2014-12-01 14:53:08 -08001103 StringRef CPUName;
1104 StringRef ABIName;
1105 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1106 ABIName = getGnuCompatibleMipsABIName(ABIName);
1107
Stephen Hines176edba2014-12-01 14:53:08 -08001108 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1109 options::OPT_mabicalls, "noabicalls");
1110
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001111 StringRef FloatABI = getMipsFloatABI(D, Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07001112 if (FloatABI == "soft") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001113 // FIXME: Note, this is a hack. We need to pass the selected float
1114 // mode to the MipsTargetInfoBase to define appropriate macros there.
1115 // Now it is the only method.
1116 Features.push_back("+soft-float");
1117 }
1118
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001119 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001120 StringRef Val = StringRef(A->getValue());
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001121 if (Val == "2008") {
1122 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1123 Features.push_back("+nan2008");
1124 else {
1125 Features.push_back("-nan2008");
1126 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1127 }
1128 } else if (Val == "legacy") {
1129 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1130 Features.push_back("-nan2008");
1131 else {
1132 Features.push_back("+nan2008");
1133 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1134 }
1135 } else
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001136 D.Diag(diag::err_drv_unsupported_option_argument)
1137 << A->getOption().getName() << Val;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001138 }
1139
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001140 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1141 options::OPT_mdouble_float, "single-float");
1142 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1143 "mips16");
1144 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1145 options::OPT_mno_micromips, "micromips");
1146 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1147 "dsp");
1148 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1149 "dspr2");
1150 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1151 "msa");
Stephen Hines176edba2014-12-01 14:53:08 -08001152
1153 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1154 // pass -mfpxx
1155 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1156 options::OPT_mfp64)) {
1157 if (A->getOption().matches(options::OPT_mfp32))
1158 Features.push_back(Args.MakeArgString("-fp64"));
1159 else if (A->getOption().matches(options::OPT_mfpxx)) {
1160 Features.push_back(Args.MakeArgString("+fpxx"));
1161 Features.push_back(Args.MakeArgString("+nooddspreg"));
1162 } else
1163 Features.push_back(Args.MakeArgString("+fp64"));
1164 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
1165 Features.push_back(Args.MakeArgString("+fpxx"));
1166 Features.push_back(Args.MakeArgString("+nooddspreg"));
1167 }
1168
Stephen Hinesef822542014-07-21 00:47:37 -07001169 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1170 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001171}
1172
Simon Atanasyan5e627792012-06-02 15:06:29 +00001173void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001174 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001175 const Driver &D = getToolChain().getDriver();
1176 StringRef CPUName;
1177 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001178 const llvm::Triple &Triple = getToolChain().getTriple();
Stephen Hines176edba2014-12-01 14:53:08 -08001179 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001180
1181 CmdArgs.push_back("-target-abi");
1182 CmdArgs.push_back(ABIName.data());
1183
1184 StringRef FloatABI = getMipsFloatABI(D, Args);
1185
Stephen Hines651f13c2014-04-23 16:59:28 -07001186 if (FloatABI == "soft") {
Eric Christophered734732010-03-02 02:41:08 +00001187 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001188 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001189 CmdArgs.push_back("-mfloat-abi");
1190 CmdArgs.push_back("soft");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001191 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001192 else {
1193 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +00001194 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001195 CmdArgs.push_back("-mfloat-abi");
1196 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001197 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001198
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001199 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1200 if (A->getOption().matches(options::OPT_mxgot)) {
1201 CmdArgs.push_back("-mllvm");
1202 CmdArgs.push_back("-mxgot");
1203 }
1204 }
1205
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001206 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1207 options::OPT_mno_ldc1_sdc1)) {
1208 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1209 CmdArgs.push_back("-mllvm");
1210 CmdArgs.push_back("-mno-ldc1-sdc1");
1211 }
1212 }
1213
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001214 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1215 options::OPT_mno_check_zero_division)) {
1216 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1217 CmdArgs.push_back("-mllvm");
1218 CmdArgs.push_back("-mno-check-zero-division");
1219 }
1220 }
1221
Simon Atanasyan9804b762012-08-27 20:55:56 +00001222 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001223 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001224 CmdArgs.push_back("-mllvm");
1225 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1226 A->claim();
1227 }
Eric Christophered734732010-03-02 02:41:08 +00001228}
1229
Hal Finkel02a84272012-06-11 22:35:19 +00001230/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1231static std::string getPPCTargetCPU(const ArgList &Args) {
1232 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001233 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001234
1235 if (CPUName == "native") {
1236 std::string CPU = llvm::sys::getHostCPUName();
1237 if (!CPU.empty() && CPU != "generic")
1238 return CPU;
1239 else
1240 return "";
1241 }
1242
1243 return llvm::StringSwitch<const char *>(CPUName)
1244 .Case("common", "generic")
1245 .Case("440", "440")
1246 .Case("440fp", "440")
1247 .Case("450", "450")
1248 .Case("601", "601")
1249 .Case("602", "602")
1250 .Case("603", "603")
1251 .Case("603e", "603e")
1252 .Case("603ev", "603ev")
1253 .Case("604", "604")
1254 .Case("604e", "604e")
1255 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001256 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001257 .Case("G3", "g3")
1258 .Case("7400", "7400")
1259 .Case("G4", "g4")
1260 .Case("7450", "7450")
1261 .Case("G4+", "g4+")
1262 .Case("750", "750")
1263 .Case("970", "970")
1264 .Case("G5", "g5")
1265 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001266 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001267 .Case("e500mc", "e500mc")
1268 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001269 .Case("power3", "pwr3")
1270 .Case("power4", "pwr4")
1271 .Case("power5", "pwr5")
1272 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001273 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001274 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001275 .Case("power7", "pwr7")
Stephen Hinesef822542014-07-21 00:47:37 -07001276 .Case("power8", "pwr8")
Bill Schmidt2821e182013-02-01 20:23:10 +00001277 .Case("pwr3", "pwr3")
1278 .Case("pwr4", "pwr4")
1279 .Case("pwr5", "pwr5")
1280 .Case("pwr5x", "pwr5x")
1281 .Case("pwr6", "pwr6")
1282 .Case("pwr6x", "pwr6x")
1283 .Case("pwr7", "pwr7")
Stephen Hinesef822542014-07-21 00:47:37 -07001284 .Case("pwr8", "pwr8")
Hal Finkel02a84272012-06-11 22:35:19 +00001285 .Case("powerpc", "ppc")
1286 .Case("powerpc64", "ppc64")
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001287 .Case("powerpc64le", "ppc64le")
Hal Finkel02a84272012-06-11 22:35:19 +00001288 .Default("");
1289 }
1290
1291 return "";
1292}
1293
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001294static void getPPCTargetFeatures(const ArgList &Args,
1295 std::vector<const char *> &Features) {
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001296 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1297 ie = Args.filtered_end();
1298 it != ie; ++it) {
1299 StringRef Name = (*it)->getOption().getName();
1300 (*it)->claim();
1301
1302 // Skip over "-m".
1303 assert(Name.startswith("m") && "Invalid feature name.");
1304 Name = Name.substr(1);
1305
1306 bool IsNegative = Name.startswith("no-");
1307 if (IsNegative)
1308 Name = Name.substr(3);
1309
1310 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1311 // pass the correct option to the backend while calling the frontend
1312 // option the same.
1313 // TODO: Change the LLVM backend option maybe?
1314 if (Name == "mfcrf")
1315 Name = "mfocrf";
1316
1317 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1318 }
1319
1320 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001321 AddTargetFeature(Args, Features, options::OPT_faltivec,
1322 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001323}
1324
Stephen Hines176edba2014-12-01 14:53:08 -08001325void Clang::AddPPCTargetArgs(const ArgList &Args,
1326 ArgStringList &CmdArgs) const {
1327 // Select the ABI to use.
1328 const char *ABIName = nullptr;
1329 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1330 ABIName = A->getValue();
1331 } else if (getToolChain().getTriple().isOSLinux())
1332 switch(getToolChain().getArch()) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001333 case llvm::Triple::ppc64: {
1334 // When targeting a processor that supports QPX, or if QPX is
1335 // specifically enabled, default to using the ABI that supports QPX (so
1336 // long as it is not specifically disabled).
1337 bool HasQPX = false;
1338 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1339 HasQPX = A->getValue() == StringRef("a2q");
1340 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1341 if (HasQPX) {
1342 ABIName = "elfv1-qpx";
1343 break;
1344 }
1345
Stephen Hines176edba2014-12-01 14:53:08 -08001346 ABIName = "elfv1";
1347 break;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001348 }
Stephen Hines176edba2014-12-01 14:53:08 -08001349 case llvm::Triple::ppc64le:
1350 ABIName = "elfv2";
1351 break;
1352 default:
1353 break;
1354 }
1355
1356 if (ABIName) {
1357 CmdArgs.push_back("-target-abi");
1358 CmdArgs.push_back(ABIName);
1359 }
1360}
1361
1362bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1363 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1364 return A && (A->getValue() == StringRef(Value));
1365}
1366
Tom Stellarde25d2f62013-04-01 20:56:53 +00001367/// Get the (LLVM) name of the R600 gpu we are targeting.
1368static std::string getR600TargetGPU(const ArgList &Args) {
1369 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001370 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001371 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001372 .Cases("rv630", "rv635", "r600")
1373 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001374 .Case("rv740", "rv770")
1375 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001376 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001377 .Case("hemlock", "cypress")
1378 .Case("aruba", "cayman")
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001379 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001380 }
1381 return "";
1382}
1383
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001384static void getSparcTargetFeatures(const ArgList &Args,
Stephen Hines176edba2014-12-01 14:53:08 -08001385 std::vector<const char *> &Features) {
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001386 bool SoftFloatABI = true;
1387 if (Arg *A =
1388 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1389 if (A->getOption().matches(options::OPT_mhard_float))
1390 SoftFloatABI = false;
1391 }
1392 if (SoftFloatABI)
1393 Features.push_back("+soft-float");
1394}
1395
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001396void Clang::AddSparcTargetArgs(const ArgList &Args,
1397 ArgStringList &CmdArgs) const {
1398 const Driver &D = getToolChain().getDriver();
1399
Stephen Hines176edba2014-12-01 14:53:08 -08001400 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner5f9e2722011-07-23 10:55:15 +00001401 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001402 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1403 options::OPT_mhard_float)) {
1404 if (A->getOption().matches(options::OPT_msoft_float))
1405 FloatABI = "soft";
1406 else if (A->getOption().matches(options::OPT_mhard_float))
1407 FloatABI = "hard";
1408 }
1409
1410 // If unspecified, choose the default based on the platform.
1411 if (FloatABI.empty()) {
Aaron Ballmand58915e2013-07-15 13:41:33 +00001412 // Assume "soft", but warn the user we are guessing.
1413 FloatABI = "soft";
1414 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001415 }
1416
1417 if (FloatABI == "soft") {
1418 // Floating point operations and argument passing are soft.
1419 //
1420 // FIXME: This changes CPP defines, we need -target-soft-float.
1421 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001422 } else {
1423 assert(FloatABI == "hard" && "Invalid float abi!");
1424 CmdArgs.push_back("-mhard-float");
1425 }
1426}
1427
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001428static const char *getSystemZTargetCPU(const ArgList &Args) {
1429 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1430 return A->getValue();
1431 return "z10";
1432}
1433
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001434static void getSystemZTargetFeatures(const ArgList &Args,
1435 std::vector<const char *> &Features) {
1436 // -m(no-)htm overrides use of the transactional-execution facility.
1437 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1438 options::OPT_mno_htm)) {
1439 if (A->getOption().matches(options::OPT_mhtm))
1440 Features.push_back("+transactional-execution");
1441 else
1442 Features.push_back("-transactional-execution");
1443 }
1444}
1445
Chandler Carruth700d4e42013-01-13 11:46:33 +00001446static const char *getX86TargetCPU(const ArgList &Args,
1447 const llvm::Triple &Triple) {
1448 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001449 if (StringRef(A->getValue()) != "native") {
1450 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1451 return "core-avx2";
1452
Chandler Carruth700d4e42013-01-13 11:46:33 +00001453 return A->getValue();
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001454 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001455
1456 // FIXME: Reject attempts to use -march=native unless the target matches
1457 // the host.
1458 //
1459 // FIXME: We should also incorporate the detected target features for use
1460 // with -native.
1461 std::string CPU = llvm::sys::getHostCPUName();
1462 if (!CPU.empty() && CPU != "generic")
1463 return Args.MakeArgString(CPU);
1464 }
1465
1466 // Select the default CPU if none was given (or detection failed).
1467
1468 if (Triple.getArch() != llvm::Triple::x86_64 &&
1469 Triple.getArch() != llvm::Triple::x86)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001470 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth700d4e42013-01-13 11:46:33 +00001471
1472 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1473
1474 // FIXME: Need target hooks.
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001475 if (Triple.isOSDarwin()) {
1476 if (Triple.getArchName() == "x86_64h")
1477 return "core-avx2";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001478 return Is64Bit ? "core2" : "yonah";
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001479 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001480
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001481 // Set up default CPU name for PS4 compilers.
1482 if (Triple.isPS4CPU())
1483 return "btver2";
1484
Stephen Hines651f13c2014-04-23 16:59:28 -07001485 // On Android use targets compatible with gcc
Chandler Carruth700d4e42013-01-13 11:46:33 +00001486 if (Triple.getEnvironment() == llvm::Triple::Android)
Stephen Hines651f13c2014-04-23 16:59:28 -07001487 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001488
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001489 // Everything else goes to x86-64 in 64-bit mode.
1490 if (Is64Bit)
1491 return "x86-64";
1492
1493 switch (Triple.getOS()) {
1494 case llvm::Triple::FreeBSD:
1495 case llvm::Triple::NetBSD:
1496 case llvm::Triple::OpenBSD:
1497 return "i486";
1498 case llvm::Triple::Haiku:
1499 return "i586";
1500 case llvm::Triple::Bitrig:
1501 return "i686";
1502 default:
1503 // Fallback to p4.
1504 return "pentium4";
1505 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001506}
1507
Rafael Espindolab330e402013-08-20 22:12:08 +00001508static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1509 switch(T.getArch()) {
1510 default:
1511 return "";
1512
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001513 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07001514 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001515 return getAArch64TargetCPU(Args);
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001516
Rafael Espindolab330e402013-08-20 22:12:08 +00001517 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07001518 case llvm::Triple::armeb:
Rafael Espindolab330e402013-08-20 22:12:08 +00001519 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07001520 case llvm::Triple::thumbeb:
1521 return arm::getARMTargetCPU(Args, T);
Rafael Espindolab330e402013-08-20 22:12:08 +00001522
1523 case llvm::Triple::mips:
1524 case llvm::Triple::mipsel:
1525 case llvm::Triple::mips64:
1526 case llvm::Triple::mips64el: {
1527 StringRef CPUName;
1528 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08001529 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindolab330e402013-08-20 22:12:08 +00001530 return CPUName;
1531 }
1532
1533 case llvm::Triple::ppc:
1534 case llvm::Triple::ppc64:
1535 case llvm::Triple::ppc64le: {
1536 std::string TargetCPUName = getPPCTargetCPU(Args);
1537 // LLVM may default to generating code for the native CPU,
1538 // but, like gcc, we default to a more generic option for
1539 // each architecture. (except on Darwin)
1540 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1541 if (T.getArch() == llvm::Triple::ppc64)
1542 TargetCPUName = "ppc64";
1543 else if (T.getArch() == llvm::Triple::ppc64le)
1544 TargetCPUName = "ppc64le";
1545 else
1546 TargetCPUName = "ppc";
1547 }
1548 return TargetCPUName;
1549 }
1550
1551 case llvm::Triple::sparc:
Stephen Hines651f13c2014-04-23 16:59:28 -07001552 case llvm::Triple::sparcv9:
1553 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindolab330e402013-08-20 22:12:08 +00001554 return A->getValue();
1555 return "";
1556
1557 case llvm::Triple::x86:
1558 case llvm::Triple::x86_64:
1559 return getX86TargetCPU(Args, T);
1560
1561 case llvm::Triple::hexagon:
1562 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1563
1564 case llvm::Triple::systemz:
1565 return getSystemZTargetCPU(Args);
1566
1567 case llvm::Triple::r600:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001568 case llvm::Triple::amdgcn:
Rafael Espindolab330e402013-08-20 22:12:08 +00001569 return getR600TargetGPU(Args);
1570 }
1571}
1572
Stephen Hines651f13c2014-04-23 16:59:28 -07001573static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1574 ArgStringList &CmdArgs) {
1575 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1576 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1577 // forward.
1578 CmdArgs.push_back("-plugin");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001579 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Stephen Hines651f13c2014-04-23 16:59:28 -07001580 CmdArgs.push_back(Args.MakeArgString(Plugin));
1581
1582 // Try to pass driver level flags relevant to LTO code generation down to
1583 // the plugin.
1584
1585 // Handle flags for selecting CPU variants.
1586 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1587 if (!CPU.empty())
1588 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1589}
1590
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001591static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001592 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001593 std::vector<const char *> &Features) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001594 // If -march=native, autodetect the feature list.
1595 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1596 if (StringRef(A->getValue()) == "native") {
1597 llvm::StringMap<bool> HostFeatures;
1598 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1599 for (auto &F : HostFeatures)
1600 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1601 F.first()));
1602 }
1603 }
1604
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001605 if (Triple.getArchName() == "x86_64h") {
1606 // x86_64h implies quite a few of the more modern subtarget features
1607 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1608 Features.push_back("-rdrnd");
1609 Features.push_back("-aes");
1610 Features.push_back("-pclmul");
1611 Features.push_back("-rtm");
1612 Features.push_back("-hle");
1613 Features.push_back("-fsgsbase");
1614 }
1615
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001616 // Add features to be compatible with gcc for Android.
Stephen Hines651f13c2014-04-23 16:59:28 -07001617 if (Triple.getEnvironment() == llvm::Triple::Android) {
Stephen Hinesef822542014-07-21 00:47:37 -07001618 if (Triple.getArch() == llvm::Triple::x86_64) {
1619 Features.push_back("+sse4.2");
1620 Features.push_back("+popcnt");
1621 } else
1622 Features.push_back("+ssse3");
Stephen Hines651f13c2014-04-23 16:59:28 -07001623 }
1624
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001625 // Set features according to the -arch flag on MSVC.
Stephen Hines176edba2014-12-01 14:53:08 -08001626 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1627 StringRef Arch = A->getValue();
1628 bool ArchUsed = false;
1629 // First, look for flags that are shared in x86 and x86-64.
1630 if (Triple.getArch() == llvm::Triple::x86_64 ||
1631 Triple.getArch() == llvm::Triple::x86) {
1632 if (Arch == "AVX" || Arch == "AVX2") {
1633 ArchUsed = true;
1634 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1635 }
1636 }
1637 // Then, look for x86-specific flags.
1638 if (Triple.getArch() == llvm::Triple::x86) {
1639 if (Arch == "IA32") {
1640 ArchUsed = true;
1641 } else if (Arch == "SSE" || Arch == "SSE2") {
1642 ArchUsed = true;
1643 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1644 }
1645 }
1646 if (!ArchUsed)
1647 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1648 }
1649
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001650 // Now add any that the user explicitly requested on the command line,
1651 // which may override the defaults.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001652 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1653 ie = Args.filtered_end();
1654 it != ie; ++it) {
1655 StringRef Name = (*it)->getOption().getName();
1656 (*it)->claim();
1657
1658 // Skip over "-m".
1659 assert(Name.startswith("m") && "Invalid feature name.");
1660 Name = Name.substr(1);
1661
1662 bool IsNegative = Name.startswith("no-");
1663 if (IsNegative)
1664 Name = Name.substr(3);
1665
1666 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1667 }
1668}
1669
Daniel Dunbar6acda162009-09-09 22:33:08 +00001670void Clang::AddX86TargetArgs(const ArgList &Args,
1671 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001672 if (!Args.hasFlag(options::OPT_mred_zone,
1673 options::OPT_mno_red_zone,
1674 true) ||
1675 Args.hasArg(options::OPT_mkernel) ||
1676 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001677 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001678
Bob Wilsonf0c54562013-02-10 16:01:41 +00001679 // Default to avoid implicit floating-point for kernel/kext code, but allow
1680 // that to be overridden with -mno-soft-float.
1681 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1682 Args.hasArg(options::OPT_fapple_kext));
1683 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1684 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001685 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001686 options::OPT_mno_implicit_float)) {
1687 const Option &O = A->getOption();
1688 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1689 O.matches(options::OPT_msoft_float));
1690 }
1691 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001692 CmdArgs.push_back("-no-implicit-float");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001693
1694 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1695 StringRef Value = A->getValue();
1696 if (Value == "intel" || Value == "att") {
1697 CmdArgs.push_back("-mllvm");
1698 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1699 } else {
1700 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1701 << A->getOption().getName() << Value;
1702 }
1703 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001704}
1705
Matthew Curtis33c95f12012-12-06 17:49:03 +00001706static inline bool HasPICArg(const ArgList &Args) {
1707 return Args.hasArg(options::OPT_fPIC)
1708 || Args.hasArg(options::OPT_fpic);
1709}
1710
1711static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1712 return Args.getLastArg(options::OPT_G,
1713 options::OPT_G_EQ,
1714 options::OPT_msmall_data_threshold_EQ);
1715}
1716
1717static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1718 std::string value;
1719 if (HasPICArg(Args))
1720 value = "0";
1721 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1722 value = A->getValue();
1723 A->claim();
1724 }
1725 return value;
1726}
1727
Tony Linthicum96319392011-12-12 21:14:55 +00001728void Clang::AddHexagonTargetArgs(const ArgList &Args,
1729 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00001730 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001731 CmdArgs.push_back("-mqdsp6-compat");
1732 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001733
Matthew Curtis33c95f12012-12-06 17:49:03 +00001734 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1735 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001736 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001737 CmdArgs.push_back(Args.MakeArgString(
1738 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001739 }
1740
Sirish Pande5f9688b2012-05-10 20:19:54 +00001741 if (!Args.hasArg(options::OPT_fno_short_enums))
1742 CmdArgs.push_back("-fshort-enums");
1743 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1744 CmdArgs.push_back ("-mllvm");
1745 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1746 }
Tony Linthicum96319392011-12-12 21:14:55 +00001747 CmdArgs.push_back ("-mllvm");
1748 CmdArgs.push_back ("-machine-sink-split=0");
1749}
1750
Stephen Hines176edba2014-12-01 14:53:08 -08001751// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
1752static bool DecodeAArch64Features(const Driver &D, StringRef text,
1753 std::vector<const char *> &Features) {
1754 SmallVector<StringRef, 8> Split;
1755 text.split(Split, StringRef("+"), -1, false);
1756
1757 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1758 const char *result = llvm::StringSwitch<const char *>(Split[I])
1759 .Case("fp", "+fp-armv8")
1760 .Case("simd", "+neon")
1761 .Case("crc", "+crc")
1762 .Case("crypto", "+crypto")
1763 .Case("nofp", "-fp-armv8")
1764 .Case("nosimd", "-neon")
1765 .Case("nocrc", "-crc")
1766 .Case("nocrypto", "-crypto")
1767 .Default(nullptr);
1768 if (result)
1769 Features.push_back(result);
1770 else if (Split[I] == "neon" || Split[I] == "noneon")
1771 D.Diag(diag::err_drv_no_neon_modifier);
1772 else
1773 return false;
1774 }
1775 return true;
1776}
1777
1778// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1779// decode CPU and feature.
1780static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1781 std::vector<const char *> &Features) {
1782 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1783 CPU = Split.first;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001784 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Stephen Hines176edba2014-12-01 14:53:08 -08001785 Features.push_back("+neon");
1786 Features.push_back("+crc");
1787 Features.push_back("+crypto");
1788 } else if (CPU == "generic") {
1789 Features.push_back("+neon");
1790 } else {
1791 return false;
1792 }
1793
1794 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1795 return false;
1796
1797 return true;
1798}
1799
1800static bool
1801getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1802 const ArgList &Args,
1803 std::vector<const char *> &Features) {
1804 std::pair<StringRef, StringRef> Split = March.split("+");
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001805
1806 if (Split.first == "armv8-a" ||
1807 Split.first == "armv8a") {
1808 // ok, no additional features.
1809 } else if (
1810 Split.first == "armv8.1-a" ||
1811 Split.first == "armv8.1a" ) {
1812 Features.push_back("+v8.1a");
1813 } else {
Stephen Hines176edba2014-12-01 14:53:08 -08001814 return false;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001815 }
Stephen Hines176edba2014-12-01 14:53:08 -08001816
1817 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1818 return false;
1819
1820 return true;
1821}
1822
1823static bool
1824getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1825 const ArgList &Args,
1826 std::vector<const char *> &Features) {
1827 StringRef CPU;
1828 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1829 return false;
1830
1831 return true;
1832}
1833
1834static bool
1835getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1836 const ArgList &Args,
1837 std::vector<const char *> &Features) {
1838 // Handle CPU name is 'native'.
1839 if (Mtune == "native")
1840 Mtune = llvm::sys::getHostCPUName();
1841 if (Mtune == "cyclone") {
1842 Features.push_back("+zcm");
1843 Features.push_back("+zcz");
1844 }
1845 return true;
1846}
1847
1848static bool
1849getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1850 const ArgList &Args,
1851 std::vector<const char *> &Features) {
1852 StringRef CPU;
1853 std::vector<const char *> DecodedFeature;
1854 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1855 return false;
1856
1857 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1858}
1859
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001860static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1861 std::vector<const char *> &Features) {
Stephen Hines176edba2014-12-01 14:53:08 -08001862 Arg *A;
1863 bool success = true;
1864 // Enable NEON by default.
1865 Features.push_back("+neon");
1866 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1867 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1868 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1869 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1870 else if (Args.hasArg(options::OPT_arch))
1871 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1872 Features);
1873
1874 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1875 success =
1876 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1877 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1878 success =
1879 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1880 else if (Args.hasArg(options::OPT_arch))
1881 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1882 Args, Features);
1883
1884 if (!success)
1885 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07001886
1887 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1888 Features.push_back("-fp-armv8");
1889 Features.push_back("-crypto");
1890 Features.push_back("-neon");
1891 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001892
1893 // En/disable crc
1894 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1895 options::OPT_mnocrc)) {
1896 if (A->getOption().matches(options::OPT_mcrc))
1897 Features.push_back("+crc");
1898 else
1899 Features.push_back("-crc");
1900 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001901}
1902
1903static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Stephen Hines651f13c2014-04-23 16:59:28 -07001904 const ArgList &Args, ArgStringList &CmdArgs,
1905 bool ForAS) {
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001906 std::vector<const char *> Features;
1907 switch (Triple.getArch()) {
1908 default:
1909 break;
1910 case llvm::Triple::mips:
1911 case llvm::Triple::mipsel:
1912 case llvm::Triple::mips64:
1913 case llvm::Triple::mips64el:
Stephen Hines176edba2014-12-01 14:53:08 -08001914 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001915 break;
1916
1917 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07001918 case llvm::Triple::armeb:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001919 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07001920 case llvm::Triple::thumbeb:
1921 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001922 break;
1923
1924 case llvm::Triple::ppc:
1925 case llvm::Triple::ppc64:
1926 case llvm::Triple::ppc64le:
1927 getPPCTargetFeatures(Args, Features);
1928 break;
1929 case llvm::Triple::sparc:
Stephen Hines176edba2014-12-01 14:53:08 -08001930 case llvm::Triple::sparcv9:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001931 getSparcTargetFeatures(Args, Features);
1932 break;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001933 case llvm::Triple::systemz:
1934 getSystemZTargetFeatures(Args, Features);
1935 break;
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001936 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07001937 case llvm::Triple::aarch64_be:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001938 getAArch64TargetFeatures(D, Args, Features);
1939 break;
1940 case llvm::Triple::x86:
1941 case llvm::Triple::x86_64:
Stephen Hines176edba2014-12-01 14:53:08 -08001942 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001943 break;
1944 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001945
1946 // Find the last of each feature.
1947 llvm::StringMap<unsigned> LastOpt;
1948 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1949 const char *Name = Features[I];
1950 assert(Name[0] == '-' || Name[0] == '+');
1951 LastOpt[Name + 1] = I;
1952 }
1953
1954 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1955 // If this feature was overridden, ignore it.
1956 const char *Name = Features[I];
1957 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1958 assert(LastI != LastOpt.end());
1959 unsigned Last = LastI->second;
1960 if (Last != I)
1961 continue;
1962
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001963 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001964 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001965 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00001966}
1967
Eric Christopher88b7cf02011-08-19 00:30:14 +00001968static bool
John McCall260611a2012-06-20 06:18:46 +00001969shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001970 const llvm::Triple &Triple) {
1971 // We use the zero-cost exception tables for Objective-C if the non-fragile
1972 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1973 // later.
John McCall260611a2012-06-20 06:18:46 +00001974 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001975 return true;
1976
Stephen Hines651f13c2014-04-23 16:59:28 -07001977 if (!Triple.isMacOSX())
Anders Carlsson525544d2011-02-28 00:44:51 +00001978 return false;
1979
Eric Christopheraa7333c2011-07-02 00:20:22 +00001980 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001981 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001982 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001983}
1984
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001985// exceptionSettings() exists to share the logic between -cc1 and linker
1986// invocations.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001987static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001988 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001989 options::OPT_fno_exceptions))
Stephen Hines651f13c2014-04-23 16:59:28 -07001990 if (A->getOption().matches(options::OPT_fexceptions))
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001991 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07001992
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001993 return false;
Stephen Hines651f13c2014-04-23 16:59:28 -07001994}
1995
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001996/// Adds exception related arguments to the driver command arguments. There's a
1997/// master flag, -fexceptions and also language specific flags to enable/disable
1998/// C++ and Objective-C exceptions. This makes it possible to for example
1999/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlsson15348ae2011-02-28 02:27:16 +00002000static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002001 const ToolChain &TC, bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00002002 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00002003 ArgStringList &CmdArgs) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002004 const Driver &D = TC.getDriver();
2005 const llvm::Triple &Triple = TC.getTriple();
2006
Chad Rosierafc4baa2012-03-26 22:04:46 +00002007 if (KernelOrKext) {
2008 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2009 // arguments now to avoid warnings about unused arguments.
2010 Args.ClaimAllArgs(options::OPT_fexceptions);
2011 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2012 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2013 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2014 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2015 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002016 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00002017 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00002018
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002019 // Gather the exception settings from the command line arguments.
2020 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00002021
Daniel Dunbard47ea692011-03-17 23:28:31 +00002022 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2023 // is not necessarily sensible, but follows GCC.
2024 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00002025 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00002026 options::OPT_fno_objc_exceptions,
2027 true)) {
2028 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00002029
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002030 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002031 }
2032
2033 if (types::isCXX(InputType)) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002034 bool CXXExceptionsEnabled =
2035 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
2036 Arg *ExceptionArg = Args.getLastArg(
2037 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2038 options::OPT_fexceptions, options::OPT_fno_exceptions);
2039 if (ExceptionArg)
2040 CXXExceptionsEnabled =
2041 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2042 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002043
2044 if (CXXExceptionsEnabled) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002045 if (Triple.isPS4CPU()) {
2046 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2047 assert(ExceptionArg &&
2048 "On the PS4 exceptions should only be enabled if passing "
2049 "an argument");
2050 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2051 const Arg *RTTIArg = TC.getRTTIArg();
2052 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2053 D.Diag(diag::err_drv_argument_not_allowed_with)
2054 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2055 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2056 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2057 } else
2058 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2059
Anders Carlsson15348ae2011-02-28 02:27:16 +00002060 CmdArgs.push_back("-fcxx-exceptions");
2061
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002062 EH = true;
Anders Carlsson15348ae2011-02-28 02:27:16 +00002063 }
2064 }
2065
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002066 if (EH)
Anders Carlsson15348ae2011-02-28 02:27:16 +00002067 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00002068}
2069
Daniel Dunbarf4910132013-04-16 18:21:19 +00002070static bool ShouldDisableAutolink(const ArgList &Args,
2071 const ToolChain &TC) {
2072 bool Default = true;
2073 if (TC.getTriple().isOSDarwin()) {
2074 // The native darwin assembler doesn't support the linker_option directives,
2075 // so we disable them if we think the .s file will be passed to it.
2076 Default = TC.useIntegratedAs();
2077 }
2078 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2079 Default);
2080}
2081
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00002082static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2083 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00002084 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2085 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00002086 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00002087 return !UseDwarfDirectory;
2088}
2089
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002090/// \brief Check whether the given input tree contains any compilation actions.
2091static bool ContainsCompileAction(const Action *A) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002092 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002093 return true;
2094
Stephen Hinesef822542014-07-21 00:47:37 -07002095 for (const auto &Act : *A)
2096 if (ContainsCompileAction(Act))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002097 return true;
2098
2099 return false;
2100}
2101
2102/// \brief Check if -relax-all should be passed to the internal assembler.
2103/// This is done by default when compiling non-assembler source with -O0.
2104static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2105 bool RelaxDefault = true;
2106
2107 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2108 RelaxDefault = A->getOption().matches(options::OPT_O0);
2109
2110 if (RelaxDefault) {
2111 RelaxDefault = false;
Stephen Hinesef822542014-07-21 00:47:37 -07002112 for (const auto &Act : C.getActions()) {
2113 if (ContainsCompileAction(Act)) {
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002114 RelaxDefault = true;
2115 break;
2116 }
2117 }
2118 }
2119
2120 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2121 RelaxDefault);
2122}
2123
David Blaikie73168db2013-07-25 21:19:01 +00002124static void CollectArgsForIntegratedAssembler(Compilation &C,
2125 const ArgList &Args,
2126 ArgStringList &CmdArgs,
2127 const Driver &D) {
2128 if (UseRelaxAll(C, Args))
2129 CmdArgs.push_back("-mrelax-all");
2130
David Peixotto4ca9eae2013-11-14 22:52:58 +00002131 // When passing -I arguments to the assembler we sometimes need to
David Peixotto2317f7b2013-11-14 22:58:17 +00002132 // unconditionally take the next argument. For example, when parsing
David Peixotto4ca9eae2013-11-14 22:52:58 +00002133 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2134 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2135 // arg after parsing the '-I' arg.
2136 bool TakeNextArg = false;
2137
David Blaikie73168db2013-07-25 21:19:01 +00002138 // When using an integrated assembler, translate -Wa, and -Xassembler
2139 // options.
Stephen Hines651f13c2014-04-23 16:59:28 -07002140 bool CompressDebugSections = false;
David Blaikie73168db2013-07-25 21:19:01 +00002141 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2142 options::OPT_Xassembler),
2143 ie = Args.filtered_end(); it != ie; ++it) {
2144 const Arg *A = *it;
2145 A->claim();
2146
2147 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2148 StringRef Value = A->getValue(i);
David Peixotto4ca9eae2013-11-14 22:52:58 +00002149 if (TakeNextArg) {
2150 CmdArgs.push_back(Value.data());
2151 TakeNextArg = false;
2152 continue;
2153 }
David Blaikie73168db2013-07-25 21:19:01 +00002154
2155 if (Value == "-force_cpusubtype_ALL") {
2156 // Do nothing, this is the default and we don't support anything else.
2157 } else if (Value == "-L") {
2158 CmdArgs.push_back("-msave-temp-labels");
2159 } else if (Value == "--fatal-warnings") {
Stephen Hines176edba2014-12-01 14:53:08 -08002160 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie73168db2013-07-25 21:19:01 +00002161 } else if (Value == "--noexecstack") {
2162 CmdArgs.push_back("-mnoexecstack");
Stephen Hines651f13c2014-04-23 16:59:28 -07002163 } else if (Value == "-compress-debug-sections" ||
2164 Value == "--compress-debug-sections") {
2165 CompressDebugSections = true;
2166 } else if (Value == "-nocompress-debug-sections" ||
2167 Value == "--nocompress-debug-sections") {
2168 CompressDebugSections = false;
David Peixotto4ca9eae2013-11-14 22:52:58 +00002169 } else if (Value.startswith("-I")) {
2170 CmdArgs.push_back(Value.data());
2171 // We need to consume the next argument if the current arg is a plain
2172 // -I. The next arg will be the include directory.
2173 if (Value == "-I")
2174 TakeNextArg = true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002175 } else if (Value.startswith("-gdwarf-")) {
2176 CmdArgs.push_back(Value.data());
David Blaikie73168db2013-07-25 21:19:01 +00002177 } else {
2178 D.Diag(diag::err_drv_unsupported_option_argument)
2179 << A->getOption().getName() << Value;
2180 }
2181 }
2182 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002183 if (CompressDebugSections) {
2184 if (llvm::zlib::isAvailable())
2185 CmdArgs.push_back("-compress-debug-sections");
2186 else
2187 D.Diag(diag::warn_debug_compression_unavailable);
2188 }
David Blaikie73168db2013-07-25 21:19:01 +00002189}
2190
Stephen Hines651f13c2014-04-23 16:59:28 -07002191// Until ARM libraries are build separately, we have them all in one library
2192static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002193 // FIXME: handle 64-bit
2194 if (TC.getTriple().isOSWindows() &&
2195 !TC.getTriple().isWindowsItaniumEnvironment())
2196 return "i386";
2197 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Stephen Hines651f13c2014-04-23 16:59:28 -07002198 return "arm";
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002199 return TC.getArchName();
Stephen Hines651f13c2014-04-23 16:59:28 -07002200}
2201
2202static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2203 // The runtimes are located in the OS-specific resource directory.
2204 SmallString<128> Res(TC.getDriver().ResourceDir);
2205 const llvm::Triple &Triple = TC.getTriple();
2206 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002207 StringRef OSLibName =
2208 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Stephen Hines651f13c2014-04-23 16:59:28 -07002209 llvm::sys::path::append(Res, "lib", OSLibName);
2210 return Res;
2211}
2212
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002213static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
2214 bool Shared = false) {
2215 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2216 ? "-android"
2217 : "";
2218
2219 bool IsOSWindows = TC.getTriple().isOSWindows();
2220 StringRef Arch = getArchNameForCompilerRTLib(TC);
2221 const char *Prefix = IsOSWindows ? "" : "lib";
2222 const char *Suffix =
2223 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2224
2225 SmallString<128> Path = getCompilerRTLibDir(TC);
2226 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2227 Arch + Env + Suffix);
2228
2229 return Path;
2230}
2231
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002232// This adds the static libclang_rt.builtins-arch.a directly to the command line
Stephen Hines651f13c2014-04-23 16:59:28 -07002233// FIXME: Make sure we can also emit shared objects if they're requested
2234// and available, check for possible errors, etc.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002235static void addClangRT(const ToolChain &TC, const ArgList &Args,
2236 ArgStringList &CmdArgs) {
2237 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Stephen Hines651f13c2014-04-23 16:59:28 -07002238
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002239 if (!TC.getTriple().isOSWindows()) {
2240 // FIXME: why do we link against gcc when we are using compiler-rt?
2241 CmdArgs.push_back("-lgcc_s");
2242 if (TC.getDriver().CCCIsCXX())
2243 CmdArgs.push_back("-lgcc_eh");
2244 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002245}
2246
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002247static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2248 ArgStringList &CmdArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08002249 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2250 false) ||
Chandler Carruth9db37cd2013-06-23 11:28:48 +00002251 Args.hasArg(options::OPT_fprofile_generate) ||
Stephen Hines651f13c2014-04-23 16:59:28 -07002252 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth9db37cd2013-06-23 11:28:48 +00002253 Args.hasArg(options::OPT_fcreate_profile) ||
2254 Args.hasArg(options::OPT_coverage)))
2255 return;
2256
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002257 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Stephen Hines651f13c2014-04-23 16:59:28 -07002258}
2259
Stephen Hines176edba2014-12-01 14:53:08 -08002260static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2261 ArgStringList &CmdArgs, StringRef Sanitizer,
2262 bool IsShared) {
Stephen Hines176edba2014-12-01 14:53:08 -08002263 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournebf548552013-10-20 21:29:13 +00002264 // whole-archive.
Stephen Hines176edba2014-12-01 14:53:08 -08002265 if (!IsShared)
2266 CmdArgs.push_back("-whole-archive");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002267 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Stephen Hines176edba2014-12-01 14:53:08 -08002268 if (!IsShared)
2269 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonov86143042013-02-27 11:14:55 +00002270}
2271
Stephen Hines176edba2014-12-01 14:53:08 -08002272// Tries to use a file with the list of dynamic symbols that need to be exported
2273// from the runtime library. Returns true if the file was found.
2274static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2275 ArgStringList &CmdArgs,
2276 StringRef Sanitizer) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002277 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2278 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2279 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Stephen Hines176edba2014-12-01 14:53:08 -08002280 return true;
2281 }
2282 return false;
2283}
2284
2285static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2286 ArgStringList &CmdArgs) {
2287 // Force linking against the system libraries sanitizers depends on
2288 // (see PR15823 why this is necessary).
2289 CmdArgs.push_back("--no-as-needed");
2290 CmdArgs.push_back("-lpthread");
2291 CmdArgs.push_back("-lrt");
2292 CmdArgs.push_back("-lm");
2293 // There's no libdl on FreeBSD.
2294 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2295 CmdArgs.push_back("-ldl");
2296}
2297
2298static void
2299collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2300 SmallVectorImpl<StringRef> &SharedRuntimes,
2301 SmallVectorImpl<StringRef> &StaticRuntimes,
2302 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2303 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2304 // Collect shared runtimes.
2305 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2306 SharedRuntimes.push_back("asan");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00002307 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002308
Stephen Hines176edba2014-12-01 14:53:08 -08002309 // Collect static runtimes.
Stephen Hines651f13c2014-04-23 16:59:28 -07002310 if (Args.hasArg(options::OPT_shared) ||
Stephen Hines176edba2014-12-01 14:53:08 -08002311 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2312 // Don't link static runtimes into DSOs or if compiling for Android.
Stephen Hines651f13c2014-04-23 16:59:28 -07002313 return;
Stephen Hines176edba2014-12-01 14:53:08 -08002314 }
2315 if (SanArgs.needsAsanRt()) {
2316 if (SanArgs.needsSharedAsanRt()) {
2317 HelperStaticRuntimes.push_back("asan-preinit");
2318 } else {
2319 StaticRuntimes.push_back("asan");
2320 if (SanArgs.linkCXXRuntimes())
2321 StaticRuntimes.push_back("asan_cxx");
2322 }
2323 }
2324 if (SanArgs.needsDfsanRt())
2325 StaticRuntimes.push_back("dfsan");
2326 if (SanArgs.needsLsanRt())
2327 StaticRuntimes.push_back("lsan");
2328 if (SanArgs.needsMsanRt())
2329 StaticRuntimes.push_back("msan");
2330 if (SanArgs.needsTsanRt())
2331 StaticRuntimes.push_back("tsan");
Stephen Hines176edba2014-12-01 14:53:08 -08002332 if (SanArgs.needsUbsanRt()) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002333 StaticRuntimes.push_back("ubsan_standalone");
2334 if (SanArgs.linkCXXRuntimes())
2335 StaticRuntimes.push_back("ubsan_standalone_cxx");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002336 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00002337}
2338
Stephen Hines176edba2014-12-01 14:53:08 -08002339// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2340// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2341static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Stephen Hines651f13c2014-04-23 16:59:28 -07002342 ArgStringList &CmdArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08002343 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2344 HelperStaticRuntimes;
2345 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2346 HelperStaticRuntimes);
2347 for (auto RT : SharedRuntimes)
2348 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2349 for (auto RT : HelperStaticRuntimes)
2350 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2351 bool AddExportDynamic = false;
2352 for (auto RT : StaticRuntimes) {
2353 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2354 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2355 }
2356 // If there is a static runtime with no dynamic list, force all the symbols
2357 // to be dynamic to be sure we export sanitizer interface functions.
2358 if (AddExportDynamic)
2359 CmdArgs.push_back("-export-dynamic");
2360 return !StaticRuntimes.empty();
Peter Collingbourne2eeed712013-08-07 22:47:34 +00002361}
2362
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002363static bool areOptimizationsEnabled(const ArgList &Args) {
2364 // Find the last -O arg and see if it is non-zero.
2365 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2366 return !A->getOption().matches(options::OPT_O0);
2367 // Defaults to -O0.
2368 return false;
2369}
2370
Benjamin Kramer5322a552013-10-16 17:42:39 +00002371static bool shouldUseFramePointerForTarget(const ArgList &Args,
2372 const llvm::Triple &Triple) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002373 // XCore never wants frame pointers, regardless of OS.
2374 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer5322a552013-10-16 17:42:39 +00002375 return false;
Benjamin Kramer5322a552013-10-16 17:42:39 +00002376 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002377
2378 if (Triple.isOSLinux()) {
2379 switch (Triple.getArch()) {
2380 // Don't use a frame pointer on linux if optimizing for certain targets.
2381 case llvm::Triple::mips64:
2382 case llvm::Triple::mips64el:
2383 case llvm::Triple::mips:
2384 case llvm::Triple::mipsel:
2385 case llvm::Triple::systemz:
2386 case llvm::Triple::x86:
2387 case llvm::Triple::x86_64:
2388 return !areOptimizationsEnabled(Args);
2389 default:
2390 return true;
2391 }
2392 }
2393
2394 if (Triple.isOSWindows()) {
2395 switch (Triple.getArch()) {
2396 case llvm::Triple::x86:
2397 return !areOptimizationsEnabled(Args);
2398 default:
2399 // All other supported Windows ISAs use xdata unwind information, so frame
2400 // pointers are not generally useful.
2401 return false;
2402 }
2403 }
2404
2405 return true;
Benjamin Kramer5322a552013-10-16 17:42:39 +00002406}
2407
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002408static bool shouldUseFramePointer(const ArgList &Args,
2409 const llvm::Triple &Triple) {
2410 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2411 options::OPT_fomit_frame_pointer))
2412 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2413
Benjamin Kramer5322a552013-10-16 17:42:39 +00002414 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002415}
2416
Eric Christopherd3e22df2013-04-03 01:58:53 +00002417static bool shouldUseLeafFramePointer(const ArgList &Args,
2418 const llvm::Triple &Triple) {
2419 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2420 options::OPT_momit_leaf_frame_pointer))
2421 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2422
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002423 if (Triple.isPS4CPU())
2424 return false;
2425
Benjamin Kramer5322a552013-10-16 17:42:39 +00002426 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00002427}
2428
Rafael Espindolaa2148242013-08-10 01:40:10 +00002429/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00002430static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00002431 SmallString<128> cwd;
2432 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00002433 CmdArgs.push_back("-fdebug-compilation-dir");
2434 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00002435 }
2436}
2437
Eric Christopher80190392013-02-22 20:12:52 +00002438static const char *SplitDebugName(const ArgList &Args,
2439 const InputInfoList &Inputs) {
2440 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2441 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2442 SmallString<128> T(FinalOutput->getValue());
2443 llvm::sys::path::replace_extension(T, "dwo");
2444 return Args.MakeArgString(T);
2445 } else {
2446 // Use the compilation dir.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002447 SmallString<128> T(
2448 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopher80190392013-02-22 20:12:52 +00002449 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2450 llvm::sys::path::replace_extension(F, "dwo");
2451 T += F;
2452 return Args.MakeArgString(F);
2453 }
2454}
2455
2456static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2457 const Tool &T, const JobAction &JA,
2458 const ArgList &Args, const InputInfo &Output,
2459 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00002460 ArgStringList ExtractArgs;
2461 ExtractArgs.push_back("--extract-dwo");
2462
2463 ArgStringList StripArgs;
2464 StripArgs.push_back("--strip-dwo");
2465
2466 // Grabbing the output of the earlier compile step.
2467 StripArgs.push_back(Output.getFilename());
2468 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00002469 ExtractArgs.push_back(OutFile);
2470
2471 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00002472 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00002473
2474 // First extract the dwo sections.
Stephen Hines176edba2014-12-01 14:53:08 -08002475 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00002476
2477 // Then remove them from the original .o file.
Stephen Hines176edba2014-12-01 14:53:08 -08002478 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00002479}
2480
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002481/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002482/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2483static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002484 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00002485 if (A->getOption().matches(options::OPT_O4) ||
2486 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002487 return true;
2488
2489 if (A->getOption().matches(options::OPT_O0))
2490 return false;
2491
2492 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2493
Rafael Espindola168de192013-08-26 14:05:41 +00002494 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002495 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00002496 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002497 return true;
2498
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002499 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002500 if (S == "z")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002501 return isSlpVec;
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002502
2503 unsigned OptLevel = 0;
2504 if (S.getAsInteger(10, OptLevel))
2505 return false;
2506
2507 return OptLevel > 1;
2508 }
2509
2510 return false;
2511}
2512
Stephen Hines651f13c2014-04-23 16:59:28 -07002513/// Add -x lang to \p CmdArgs for \p Input.
2514static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2515 ArgStringList &CmdArgs) {
2516 // When using -verify-pch, we don't want to provide the type
2517 // 'precompiled-header' if it was inferred from the file extension
2518 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2519 return;
2520
2521 CmdArgs.push_back("-x");
2522 if (Args.hasArg(options::OPT_rewrite_objc))
2523 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2524 else
2525 CmdArgs.push_back(types::getTypeName(Input.getType()));
2526}
2527
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002528static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Stephen Hines176edba2014-12-01 14:53:08 -08002529 if (Version < 100)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002530 return VersionTuple(Version);
Stephen Hines176edba2014-12-01 14:53:08 -08002531
2532 if (Version < 10000)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002533 return VersionTuple(Version / 100, Version % 100);
Stephen Hines176edba2014-12-01 14:53:08 -08002534
2535 unsigned Build = 0, Factor = 1;
2536 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2537 Build = Build + (Version % 10) * Factor;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002538 return VersionTuple(Version / 100, Version % 100, Build);
Stephen Hines176edba2014-12-01 14:53:08 -08002539}
2540
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002541// Claim options we don't want to warn if they are unused. We do this for
2542// options that build systems might add but are unused when assembling or only
2543// running the preprocessor for example.
2544static void claimNoWarnArgs(const ArgList &Args) {
2545 // Don't warn about unused -f(no-)?lto. This can happen when we're
2546 // preprocessing, precompiling or assembling.
2547 Args.ClaimAllArgs(options::OPT_flto);
2548 Args.ClaimAllArgs(options::OPT_fno_lto);
2549}
2550
2551static void appendUserToPath(SmallVectorImpl<char> &Result) {
2552#ifdef LLVM_ON_UNIX
2553 const char *Username = getenv("LOGNAME");
2554#else
2555 const char *Username = getenv("USERNAME");
2556#endif
2557 if (Username) {
2558 // Validate that LoginName can be used in a path, and get its length.
2559 size_t Len = 0;
2560 for (const char *P = Username; *P; ++P, ++Len) {
2561 if (!isAlphanumeric(*P) && *P != '_') {
2562 Username = nullptr;
2563 break;
2564 }
2565 }
2566
2567 if (Username && Len > 0) {
2568 Result.append(Username, Username + Len);
2569 return;
2570 }
2571 }
2572
2573 // Fallback to user id.
2574#ifdef LLVM_ON_UNIX
2575 std::string UID = llvm::utostr(getuid());
2576#else
2577 // FIXME: Windows seems to have an 'SID' that might work.
2578 std::string UID = "9999";
2579#endif
2580 Result.append(UID.begin(), UID.end());
2581}
2582
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002583void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00002584 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00002585 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00002586 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002587 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002588 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2589 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00002590 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002591 ArgStringList CmdArgs;
2592
Stephen Hines651f13c2014-04-23 16:59:28 -07002593 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002594 bool IsWindowsCygnus =
2595 getToolChain().getTriple().isWindowsCygwinEnvironment();
Stephen Hines651f13c2014-04-23 16:59:28 -07002596 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2597
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00002598 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2599
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002600 // Invoke ourselves in -cc1 mode.
2601 //
2602 // FIXME: Implement custom jobs for internal actions.
2603 CmdArgs.push_back("-cc1");
2604
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002605 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00002606 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00002607 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002608 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00002609
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002610 const llvm::Triple TT(TripleStr);
2611 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2612 TT.getArch() == llvm::Triple::thumb)) {
2613 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2614 unsigned Version;
2615 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2616 if (Version < 7)
2617 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2618 << TripleStr;
2619 }
2620
Stephen Hines651f13c2014-04-23 16:59:28 -07002621 // Push all default warning arguments that are specific to
2622 // the given target. These come before user provided warning options
2623 // are provided.
2624 getToolChain().addClangWarningOptions(CmdArgs);
2625
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002626 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00002627 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00002628
Daniel Dunbar1d460332009-03-18 10:01:51 +00002629 if (isa<AnalyzeJobAction>(JA)) {
2630 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2631 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00002632 } else if (isa<MigrateJobAction>(JA)) {
2633 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002634 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002635 if (Output.getType() == types::TY_Dependencies)
2636 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002637 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002638 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002639 if (Args.hasArg(options::OPT_rewrite_objc) &&
2640 !Args.hasArg(options::OPT_g_Group))
2641 CmdArgs.push_back("-P");
2642 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00002643 } else if (isa<AssembleJobAction>(JA)) {
2644 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00002645
David Blaikie73168db2013-07-25 21:19:01 +00002646 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00002647
2648 // Also ignore explicit -force_cpusubtype_ALL option.
2649 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002650 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00002651 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002652 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002653
Aaron Ballman761322b2012-07-31 01:21:00 +00002654 if (JA.getType() == types::TY_Nothing)
2655 CmdArgs.push_back("-fsyntax-only");
2656 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00002657 CmdArgs.push_back("-emit-pch");
2658 else
2659 CmdArgs.push_back("-emit-pth");
Stephen Hines651f13c2014-04-23 16:59:28 -07002660 } else if (isa<VerifyPCHJobAction>(JA)) {
2661 CmdArgs.push_back("-verify-pch");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002662 } else {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002663 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2664 "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002665
Daniel Dunbar1d460332009-03-18 10:01:51 +00002666 if (JA.getType() == types::TY_Nothing) {
2667 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002668 } else if (JA.getType() == types::TY_LLVM_IR ||
2669 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002670 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002671 } else if (JA.getType() == types::TY_LLVM_BC ||
2672 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002673 CmdArgs.push_back("-emit-llvm-bc");
2674 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00002675 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002676 } else if (JA.getType() == types::TY_AST) {
2677 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002678 } else if (JA.getType() == types::TY_ModuleFile) {
2679 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002680 } else if (JA.getType() == types::TY_RewrittenObjC) {
2681 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002682 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002683 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2684 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002685 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002686 } else {
2687 assert(JA.getType() == types::TY_PP_Asm &&
2688 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002689 }
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002690
2691 // Preserve use-list order by default when emitting bitcode, so that
2692 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2693 // same result as running passes here. For LTO, we don't need to preserve
2694 // the use-list order, since serialization to bitcode is part of the flow.
2695 if (JA.getType() == types::TY_LLVM_BC)
2696 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002697 }
2698
Stephen Hinesef822542014-07-21 00:47:37 -07002699 // We normally speed up the clang process a bit by skipping destructors at
2700 // exit, but when we're generating diagnostics we can rely on some of the
2701 // cleanup.
2702 if (!C.isForDiagnostics())
2703 CmdArgs.push_back("-disable-free");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002704
John McCallb689afb2010-02-13 03:50:24 +00002705 // Disable the verification pass in -asserts builds.
2706#ifdef NDEBUG
2707 CmdArgs.push_back("-disable-llvm-verifier");
2708#endif
2709
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002710 // Set the main file name, so that debug info works even with
2711 // -save-temps.
2712 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002713 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002714
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002715 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002716 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002717 if (Args.hasArg(options::OPT_static))
2718 CmdArgs.push_back("-static-define");
2719
Daniel Dunbar1d460332009-03-18 10:01:51 +00002720 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002721 // Enable region store model by default.
2722 CmdArgs.push_back("-analyzer-store=region");
2723
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002724 // Treat blocks as analysis entry points.
2725 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2726
Ted Kremenek51885072011-03-24 00:28:47 +00002727 CmdArgs.push_back("-analyzer-eagerly-assume");
2728
Daniel Dunbar1d460332009-03-18 10:01:51 +00002729 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002730 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002731 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002732
Stephen Hines651f13c2014-04-23 16:59:28 -07002733 if (!IsWindowsMSVC)
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002734 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002735
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002736 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002737 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002738
2739 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002740
Jordan Rosee449edc2013-04-05 17:55:07 +00002741 if (types::isCXX(Inputs[0].getType()))
2742 CmdArgs.push_back("-analyzer-checker=cplusplus");
2743
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002744 // Enable the following experimental checkers for testing.
2745 CmdArgs.push_back(
2746 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002747 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2748 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2749 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2750 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2751 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002752 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002753
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002754 // Set the output format. The default is plist, for (lame) historical
2755 // reasons.
2756 CmdArgs.push_back("-analyzer-output");
2757 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002758 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002759 else
2760 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002761
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002762 // Disable the presentation of standard compiler warnings when
2763 // using --analyze. We only want to show static analyzer diagnostics
2764 // or frontend errors.
2765 CmdArgs.push_back("-w");
2766
Daniel Dunbar1d460332009-03-18 10:01:51 +00002767 // Add -Xanalyzer arguments when running as analyzer.
2768 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002769 }
2770
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002771 CheckCodeGenerationOptions(D, Args);
2772
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002773 bool PIE = getToolChain().isPIEDefault();
2774 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002775 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002776
Stephen Hines651f13c2014-04-23 16:59:28 -07002777 // Android-specific defaults for PIC/PIE
2778 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2779 switch (getToolChain().getTriple().getArch()) {
2780 case llvm::Triple::arm:
2781 case llvm::Triple::armeb:
2782 case llvm::Triple::thumb:
2783 case llvm::Triple::thumbeb:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002784 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07002785 case llvm::Triple::mips:
2786 case llvm::Triple::mipsel:
2787 case llvm::Triple::mips64:
2788 case llvm::Triple::mips64el:
2789 PIC = true; // "-fpic"
2790 break;
2791
2792 case llvm::Triple::x86:
2793 case llvm::Triple::x86_64:
2794 PIC = true; // "-fPIC"
2795 IsPICLevelTwo = true;
2796 break;
2797
2798 default:
2799 break;
2800 }
2801 }
2802
Stephen Hinesef822542014-07-21 00:47:37 -07002803 // OpenBSD-specific defaults for PIE
2804 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2805 switch (getToolChain().getTriple().getArch()) {
2806 case llvm::Triple::mips64:
2807 case llvm::Triple::mips64el:
2808 case llvm::Triple::sparc:
2809 case llvm::Triple::x86:
2810 case llvm::Triple::x86_64:
2811 IsPICLevelTwo = false; // "-fpie"
2812 break;
2813
2814 case llvm::Triple::ppc:
2815 case llvm::Triple::sparcv9:
2816 IsPICLevelTwo = true; // "-fPIE"
2817 break;
2818
2819 default:
2820 break;
2821 }
2822 }
2823
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002824 // For the PIC and PIE flag options, this logic is different from the
2825 // legacy logic in very old versions of GCC, as that logic was just
2826 // a bug no one had ever fixed. This logic is both more rational and
2827 // consistent with GCC's new logic now that the bugs are fixed. The last
2828 // argument relating to either PIC or PIE wins, and no other argument is
2829 // used. If the last argument is any flavor of the '-fno-...' arguments,
2830 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2831 // at the same level.
2832 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2833 options::OPT_fpic, options::OPT_fno_pic,
2834 options::OPT_fPIE, options::OPT_fno_PIE,
2835 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002836 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2837 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002838 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002839 if (LastPICArg) {
2840 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002841 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2842 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2843 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2844 PIC = PIE || O.matches(options::OPT_fPIC) ||
2845 O.matches(options::OPT_fpic);
2846 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2847 O.matches(options::OPT_fPIC);
2848 } else {
2849 PIE = PIC = false;
2850 }
2851 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002852 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002853
Nick Lewyckyd4705682013-10-11 03:33:53 +00002854 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002855 // specified while enabling PIC enabled level 1 PIC, just force it back to
2856 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2857 // informal testing).
2858 if (PIC && getToolChain().getTriple().isOSDarwin())
2859 IsPICLevelTwo |= getToolChain().isPICDefault();
2860
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002861 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2862 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002863 llvm::Triple Triple(TripleStr);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002864 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002865 PIC = PIE = false;
Simon Atanasyanc0e83642013-10-04 11:46:54 +00002866 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002867 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002868
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002869 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2870 // This is a very special mode. It trumps the other modes, almost no one
2871 // uses it, and it isn't even valid on any OS but Darwin.
2872 if (!getToolChain().getTriple().isOSDarwin())
2873 D.Diag(diag::err_drv_unsupported_opt_for_target)
2874 << A->getSpelling() << getToolChain().getTriple().str();
2875
2876 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2877
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002878 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002879 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002880
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002881 // Only a forced PIC mode can cause the actual compile to have PIC defines
2882 // etc., no flags are sufficient. This behavior was selected to closely
2883 // match that of llvm-gcc and Apple GCC before that.
2884 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2885 CmdArgs.push_back("-pic-level");
2886 CmdArgs.push_back("2");
2887 }
2888 } else {
2889 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2890 // handled in Clang's IRGen by the -pie-level flag.
2891 CmdArgs.push_back("-mrelocation-model");
2892 CmdArgs.push_back(PIC ? "pic" : "static");
2893
2894 if (PIC) {
2895 CmdArgs.push_back("-pic-level");
2896 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2897 if (PIE) {
2898 CmdArgs.push_back("-pie-level");
2899 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2900 }
2901 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002902 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002903
Stephen Hines176edba2014-12-01 14:53:08 -08002904 CmdArgs.push_back("-mthread-model");
2905 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2906 CmdArgs.push_back(A->getValue());
2907 else
2908 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2909
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002910 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2911
Tanya Lattner59876c22009-11-04 01:18:09 +00002912 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2913 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002914 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002915
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002916 // LLVM Code Generator Options.
2917
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002918 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2919 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2920 for (arg_iterator
2921 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2922 options::OPT_frewrite_map_file_EQ),
2923 MFE = Args.filtered_end();
2924 MFI != MFE; ++MFI) {
2925 CmdArgs.push_back("-frewrite-map-file");
2926 CmdArgs.push_back((*MFI)->getValue());
2927 (*MFI)->claim();
2928 }
2929 }
2930
Stephen Hinesef822542014-07-21 00:47:37 -07002931 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2932 StringRef v = A->getValue();
2933 CmdArgs.push_back("-mllvm");
2934 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2935 A->claim();
2936 }
2937
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002938 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2939 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002940 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002941 }
2942
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002943 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2944 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002945 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002946 D.Diag(diag::err_drv_unsupported_opt_for_target)
2947 << A->getSpelling() << getToolChain().getTriple().str();
2948 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2949 CmdArgs.push_back("-fpcc-struct-return");
2950 } else {
2951 assert(A->getOption().matches(options::OPT_freg_struct_return));
2952 CmdArgs.push_back("-freg-struct-return");
2953 }
2954 }
2955
Roman Divackycfe9af22011-03-01 17:40:53 +00002956 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2957 CmdArgs.push_back("-mrtd");
2958
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002959 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002960 CmdArgs.push_back("-mdisable-fp-elim");
2961 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2962 options::OPT_fno_zero_initialized_in_bss))
2963 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002964
2965 bool OFastEnabled = isOptimizationLevelFast(Args);
2966 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2967 // enabled. This alias option is being used to simplify the hasFlag logic.
2968 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2969 options::OPT_fstrict_aliasing;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002970 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2971 // doesn't do any TBAA.
2972 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb82e1172013-04-24 18:09:54 +00002973 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002974 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002975 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00002976 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2977 options::OPT_fno_struct_path_tbaa))
2978 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002979 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2980 false))
2981 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002982 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2983 options::OPT_fno_optimize_sibling_calls))
2984 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002985
Eric Christopher31056272013-04-04 06:29:47 +00002986 // Handle segmented stacks.
2987 if (Args.hasArg(options::OPT_fsplit_stack))
2988 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002989
2990 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2991 // This alias option is being used to simplify the getLastArg logic.
2992 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2993 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002994
Chandler Carruthabf07a72012-01-02 14:19:45 +00002995 // Handle various floating point optimization flags, mapping them to the
2996 // appropriate LLVM code generation flags. The pattern for all of these is to
2997 // default off the codegen optimizations, and if any flag enables them and no
2998 // flag disables them after the flag enabling them, enable the codegen
2999 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00003000 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003001 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00003002 options::OPT_ffinite_math_only,
3003 options::OPT_fno_finite_math_only,
3004 options::OPT_fhonor_infinities,
3005 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003006 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3007 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003008 A->getOption().getID() != options::OPT_fhonor_infinities)
3009 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00003010 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003011 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00003012 options::OPT_ffinite_math_only,
3013 options::OPT_fno_finite_math_only,
3014 options::OPT_fhonor_nans,
3015 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003016 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3017 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003018 A->getOption().getID() != options::OPT_fhonor_nans)
3019 CmdArgs.push_back("-menable-no-nans");
3020
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00003021 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3022 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00003023 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003024 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00003025 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00003026 options::OPT_fno_math_errno)) {
3027 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3028 // However, turning *off* -ffast_math merely restores the toolchain default
3029 // (which may be false).
3030 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3031 A->getOption().getID() == options::OPT_ffast_math ||
3032 A->getOption().getID() == options::OPT_Ofast)
3033 MathErrno = false;
3034 else if (A->getOption().getID() == options::OPT_fmath_errno)
3035 MathErrno = true;
3036 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00003037 if (MathErrno)
3038 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00003039
3040 // There are several flags which require disabling very specific
3041 // optimizations. Any of these being disabled forces us to turn off the
3042 // entire set of LLVM optimizations, so collect them through all the flag
3043 // madness.
3044 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00003045 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003046 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00003047 options::OPT_funsafe_math_optimizations,
3048 options::OPT_fno_unsafe_math_optimizations,
3049 options::OPT_fassociative_math,
3050 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003051 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3052 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003053 A->getOption().getID() != options::OPT_fno_associative_math)
3054 AssociativeMath = true;
3055 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00003056 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003057 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00003058 options::OPT_funsafe_math_optimizations,
3059 options::OPT_fno_unsafe_math_optimizations,
3060 options::OPT_freciprocal_math,
3061 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003062 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3063 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003064 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3065 ReciprocalMath = true;
3066 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00003067 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003068 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00003069 options::OPT_funsafe_math_optimizations,
3070 options::OPT_fno_unsafe_math_optimizations,
3071 options::OPT_fsigned_zeros,
3072 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003073 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3074 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003075 A->getOption().getID() != options::OPT_fsigned_zeros)
3076 SignedZeros = false;
3077 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00003078 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003079 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00003080 options::OPT_funsafe_math_optimizations,
3081 options::OPT_fno_unsafe_math_optimizations,
3082 options::OPT_ftrapping_math,
3083 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003084 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3085 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003086 A->getOption().getID() != options::OPT_ftrapping_math)
3087 TrappingMath = false;
3088 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3089 !TrappingMath)
3090 CmdArgs.push_back("-menable-unsafe-fp-math");
3091
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003092 if (!SignedZeros)
3093 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesc9686712012-07-06 00:59:19 +00003094
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07003095 if (ReciprocalMath)
3096 CmdArgs.push_back("-freciprocal-math");
3097
Lang Hamesc9686712012-07-06 00:59:19 +00003098 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00003099 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003100 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00003101 options::OPT_ffp_contract)) {
3102 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003103 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00003104 if (Val == "fast" || Val == "on" || Val == "off") {
3105 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3106 } else {
3107 D.Diag(diag::err_drv_unsupported_option_argument)
3108 << A->getOption().getName() << Val;
3109 }
Chad Rosierb82e1172013-04-24 18:09:54 +00003110 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3111 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00003112 // If fast-math is set then set the fp-contract mode to fast.
3113 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3114 }
3115 }
3116
Bob Wilson455e72e2012-07-19 03:52:53 +00003117 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3118 // and if we find them, tell the frontend to provide the appropriate
3119 // preprocessor macros. This is distinct from enabling any optimizations as
3120 // these options induce language changes which must survive serialization
3121 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00003122 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3123 options::OPT_fno_fast_math))
3124 if (!A->getOption().matches(options::OPT_fno_fast_math))
3125 CmdArgs.push_back("-ffast-math");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003126 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3127 options::OPT_fno_fast_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003128 if (A->getOption().matches(options::OPT_ffinite_math_only))
3129 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00003130
Daniel Dunbar1b718482010-05-14 22:00:22 +00003131 // Decide whether to use verbose asm. Verbose assembly is the default on
3132 // toolchains which have the integrated assembler on by default.
Stephen Hines651f13c2014-04-23 16:59:28 -07003133 bool IsIntegratedAssemblerDefault =
3134 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar1b718482010-05-14 22:00:22 +00003135 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Stephen Hines651f13c2014-04-23 16:59:28 -07003136 IsIntegratedAssemblerDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00003137 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003138 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00003139
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07003140 bool UsingIntegratedAssembler =
3141 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3142 IsIntegratedAssemblerDefault);
3143 if (!UsingIntegratedAssembler)
Stephen Hines651f13c2014-04-23 16:59:28 -07003144 CmdArgs.push_back("-no-integrated-as");
3145
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003146 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3147 CmdArgs.push_back("-mdebug-pass");
3148 CmdArgs.push_back("Structure");
3149 }
3150 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3151 CmdArgs.push_back("-mdebug-pass");
3152 CmdArgs.push_back("Arguments");
3153 }
3154
John McCalld0c2ec42010-02-19 02:45:38 +00003155 // Enable -mconstructor-aliases except on darwin, where we have to
3156 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00003157 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00003158 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003159
John McCall32096692011-03-18 02:56:14 +00003160 // Darwin's kernel doesn't support guard variables; just die if we
3161 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00003162 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00003163 CmdArgs.push_back("-fforbid-guard-variables");
3164
Douglas Gregor6f755502011-02-01 15:15:22 +00003165 if (Args.hasArg(options::OPT_mms_bitfields)) {
3166 CmdArgs.push_back("-mms-bitfields");
3167 }
John McCalld0c2ec42010-02-19 02:45:38 +00003168
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00003169 // This is a coarse approximation of what llvm-gcc actually does, both
3170 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3171 // complicated ways.
3172 bool AsynchronousUnwindTables =
Stephen Hines651f13c2014-04-23 16:59:28 -07003173 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3174 options::OPT_fno_asynchronous_unwind_tables,
3175 (getToolChain().IsUnwindTablesDefault() ||
3176 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3177 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00003178 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3179 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003180 CmdArgs.push_back("-munwind-tables");
3181
Chandler Carrutha6b25812012-11-21 23:40:23 +00003182 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00003183
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003184 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3185 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00003186 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003187 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00003188
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00003189 // FIXME: Handle -mtune=.
3190 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00003191
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00003192 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003193 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00003194 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00003195 }
3196
Rafael Espindolab330e402013-08-20 22:12:08 +00003197 // Add the target cpu
3198 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3199 llvm::Triple ETriple(ETripleStr);
3200 std::string CPU = getCPUName(Args, ETriple);
3201 if (!CPU.empty()) {
3202 CmdArgs.push_back("-target-cpu");
3203 CmdArgs.push_back(Args.MakeArgString(CPU));
3204 }
3205
Rafael Espindola5389b842013-08-21 21:59:03 +00003206 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3207 CmdArgs.push_back("-mfpmath");
3208 CmdArgs.push_back(A->getValue());
3209 }
3210
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003211 // Add the target features
Stephen Hines651f13c2014-04-23 16:59:28 -07003212 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003213
Rafael Espindolab330e402013-08-20 22:12:08 +00003214 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003215 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00003216 default:
3217 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00003218
Daniel Dunbarb163ef72009-09-10 04:57:17 +00003219 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07003220 case llvm::Triple::armeb:
Daniel Dunbarb163ef72009-09-10 04:57:17 +00003221 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07003222 case llvm::Triple::thumbeb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00003223 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00003224 break;
3225
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003226 case llvm::Triple::aarch64:
3227 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003228 AddAArch64TargetArgs(Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07003229 break;
3230
Eric Christophered734732010-03-02 02:41:08 +00003231 case llvm::Triple::mips:
3232 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00003233 case llvm::Triple::mips64:
3234 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00003235 AddMIPSTargetArgs(Args, CmdArgs);
3236 break;
3237
Stephen Hines176edba2014-12-01 14:53:08 -08003238 case llvm::Triple::ppc:
3239 case llvm::Triple::ppc64:
3240 case llvm::Triple::ppc64le:
3241 AddPPCTargetArgs(Args, CmdArgs);
3242 break;
3243
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003244 case llvm::Triple::sparc:
Stephen Hines176edba2014-12-01 14:53:08 -08003245 case llvm::Triple::sparcv9:
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003246 AddSparcTargetArgs(Args, CmdArgs);
3247 break;
3248
Daniel Dunbar6acda162009-09-09 22:33:08 +00003249 case llvm::Triple::x86:
3250 case llvm::Triple::x86_64:
3251 AddX86TargetArgs(Args, CmdArgs);
3252 break;
Tony Linthicum96319392011-12-12 21:14:55 +00003253
3254 case llvm::Triple::hexagon:
3255 AddHexagonTargetArgs(Args, CmdArgs);
3256 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00003257 }
3258
Hans Wennborgb3574792013-08-08 00:17:41 +00003259 // Add clang-cl arguments.
3260 if (getToolChain().getDriver().IsCLMode())
3261 AddClangCLArgs(Args, CmdArgs);
3262
Daniel Dunbarc176bc62010-08-11 23:07:47 +00003263 // Pass the linker version in use.
3264 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3265 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00003266 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00003267 }
3268
Eric Christopherd3e22df2013-04-03 01:58:53 +00003269 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00003270 CmdArgs.push_back("-momit-leaf-frame-pointer");
3271
Daniel Dunbarb30575c2010-05-12 18:19:58 +00003272 // Explicitly error on some things we know we don't support and can't just
3273 // ignore.
3274 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00003275 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3276 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00003277 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00003278 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003279 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00003280 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3281 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003282 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00003283 << Unsupported->getOption().getName();
3284 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00003285 }
3286
Daniel Dunbar1d460332009-03-18 10:01:51 +00003287 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00003288 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00003289 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00003290 CmdArgs.push_back("-header-include-file");
3291 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3292 D.CCPrintHeadersFilename : "-");
3293 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003294 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00003295 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003296
Chad Rosier2b819102011-08-02 17:58:04 +00003297 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00003298 CmdArgs.push_back("-diagnostic-log-file");
3299 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3300 D.CCLogDiagnosticsFilename : "-");
3301 }
3302
Stephen Hines651f13c2014-04-23 16:59:28 -07003303 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3304 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00003305 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00003306 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Stephen Hines176edba2014-12-01 14:53:08 -08003307 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3308 A->getOption().matches(options::OPT_g1)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003309 // FIXME: we should support specifying dwarf version with
3310 // -gline-tables-only.
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00003311 CmdArgs.push_back("-gline-tables-only");
Stephen Hines176edba2014-12-01 14:53:08 -08003312 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Stephen Hinesef822542014-07-21 00:47:37 -07003313 const llvm::Triple &Triple = getToolChain().getTriple();
3314 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Stephen Hines176edba2014-12-01 14:53:08 -08003315 Triple.getOS() == llvm::Triple::FreeBSD ||
3316 Triple.getOS() == llvm::Triple::Solaris)
Stephen Hines651f13c2014-04-23 16:59:28 -07003317 CmdArgs.push_back("-gdwarf-2");
3318 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Renfc0f91c2013-06-19 01:46:49 +00003319 CmdArgs.push_back("-gdwarf-2");
3320 else if (A->getOption().matches(options::OPT_gdwarf_3))
3321 CmdArgs.push_back("-gdwarf-3");
3322 else if (A->getOption().matches(options::OPT_gdwarf_4))
3323 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00003324 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00003325 !A->getOption().matches(options::OPT_ggdb0)) {
Stephen Hines176edba2014-12-01 14:53:08 -08003326 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Stephen Hinesef822542014-07-21 00:47:37 -07003327 const llvm::Triple &Triple = getToolChain().getTriple();
3328 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Stephen Hines176edba2014-12-01 14:53:08 -08003329 Triple.getOS() == llvm::Triple::FreeBSD ||
3330 Triple.getOS() == llvm::Triple::Solaris)
Manman Ren8ed38d82013-07-02 23:15:25 +00003331 CmdArgs.push_back("-gdwarf-2");
3332 else
3333 CmdArgs.push_back("-g");
3334 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00003335 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003336
Alexey Samsonov7f326072012-06-21 08:22:39 +00003337 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3338 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Stephen Hines176edba2014-12-01 14:53:08 -08003339 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3340 /*Default*/ true))
Eric Christopherda3301e2012-10-18 21:52:18 +00003341 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00003342
Eric Christopher0f43a6d2013-09-13 22:37:55 +00003343 // FIXME: Move backend command line options to the module.
Eric Christopherc706c8e2013-02-05 07:29:57 +00003344 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3345 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00003346 // FIXME: Currently only works on Linux.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003347 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherf870e122013-02-21 22:35:05 +00003348 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00003349 CmdArgs.push_back("-g");
3350 CmdArgs.push_back("-backend-option");
3351 CmdArgs.push_back("-split-dwarf=Enable");
3352 }
3353
Eric Christopher0f43a6d2013-09-13 22:37:55 +00003354 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3355 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3356 CmdArgs.push_back("-backend-option");
3357 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3358 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00003359
Stephen Hines651f13c2014-04-23 16:59:28 -07003360 // -gdwarf-aranges turns on the emission of the aranges section in the
3361 // backend.
3362 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3363 CmdArgs.push_back("-backend-option");
3364 CmdArgs.push_back("-generate-arange-section");
3365 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00003366
Stephen Hines651f13c2014-04-23 16:59:28 -07003367 if (Args.hasFlag(options::OPT_fdebug_types_section,
3368 options::OPT_fno_debug_types_section, false)) {
3369 CmdArgs.push_back("-backend-option");
3370 CmdArgs.push_back("-generate-type-units");
3371 }
3372
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003373 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3374 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3375
Stephen Hines651f13c2014-04-23 16:59:28 -07003376 if (Args.hasFlag(options::OPT_ffunction_sections,
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003377 options::OPT_fno_function_sections, UseSeparateSections)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003378 CmdArgs.push_back("-ffunction-sections");
3379 }
3380
3381 if (Args.hasFlag(options::OPT_fdata_sections,
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003382 options::OPT_fno_data_sections, UseSeparateSections)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003383 CmdArgs.push_back("-fdata-sections");
3384 }
Rafael Espindola9cf933a2010-05-06 21:06:04 +00003385
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003386 if (!Args.hasFlag(options::OPT_funique_section_names,
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07003387 options::OPT_fno_unique_section_names,
3388 !UsingIntegratedAssembler))
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003389 CmdArgs.push_back("-fno-unique-section-names");
3390
Chris Lattner7255a2d2010-06-22 00:03:40 +00003391 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3392
Stephen Hines651f13c2014-04-23 16:59:28 -07003393 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3394 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3395 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3396 D.Diag(diag::err_drv_argument_not_allowed_with)
3397 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3398
3399 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3400
3401 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3402 A->render(Args, CmdArgs);
3403 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3404 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3405
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00003406 if (Args.hasArg(options::OPT_ftest_coverage) ||
3407 Args.hasArg(options::OPT_coverage))
3408 CmdArgs.push_back("-femit-coverage-notes");
Stephen Hines176edba2014-12-01 14:53:08 -08003409 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3410 false) ||
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00003411 Args.hasArg(options::OPT_coverage))
3412 CmdArgs.push_back("-femit-coverage-data");
3413
Stephen Hines176edba2014-12-01 14:53:08 -08003414 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3415 !Args.hasArg(options::OPT_fprofile_instr_generate))
3416 D.Diag(diag::err_drv_argument_only_allowed_with)
3417 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3418
3419 if (Args.hasArg(options::OPT_fcoverage_mapping))
3420 CmdArgs.push_back("-fcoverage-mapping");
3421
Nick Lewycky5ea4f442011-05-04 20:46:58 +00003422 if (C.getArgs().hasArg(options::OPT_c) ||
3423 C.getArgs().hasArg(options::OPT_S)) {
3424 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00003425 CmdArgs.push_back("-coverage-file");
Stephen Hines176edba2014-12-01 14:53:08 -08003426 SmallString<128> CoverageFilename;
3427 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3428 CoverageFilename = FinalOutput->getValue();
3429 } else {
3430 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3431 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003432 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00003433 SmallString<128> Pwd;
3434 if (!llvm::sys::fs::current_path(Pwd)) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003435 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolaa2148242013-08-10 01:40:10 +00003436 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00003437 }
3438 }
Eric Christopher025b3d42013-02-22 00:24:40 +00003439 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00003440 }
3441 }
3442
Daniel Dunbara268fc02011-10-11 18:20:10 +00003443 // Pass options for controlling the default header search paths.
3444 if (Args.hasArg(options::OPT_nostdinc)) {
3445 CmdArgs.push_back("-nostdsysteminc");
3446 CmdArgs.push_back("-nobuiltininc");
3447 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00003448 if (Args.hasArg(options::OPT_nostdlibinc))
3449 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00003450 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3451 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3452 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003453
Daniel Dunbar5f122322009-12-15 01:02:52 +00003454 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00003455 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00003456 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00003457
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00003458 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3459
Ted Kremenek30660a82012-03-06 20:06:33 +00003460 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00003461 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00003462 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00003463 options::OPT_ccc_arcmt_modify,
3464 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00003465 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00003466 switch (A->getOption().getID()) {
3467 default:
3468 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00003469 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00003470 CmdArgs.push_back("-arcmt-check");
3471 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00003472 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00003473 CmdArgs.push_back("-arcmt-modify");
3474 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00003475 case options::OPT_ccc_arcmt_migrate:
3476 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00003477 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00003478 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00003479
3480 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3481 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00003482 break;
John McCall8f0e8d22011-06-15 23:25:17 +00003483 }
3484 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00003485 } else {
3486 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3487 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3488 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00003489 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003490
Ted Kremenek30660a82012-03-06 20:06:33 +00003491 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3492 if (ARCMTEnabled) {
3493 D.Diag(diag::err_drv_argument_not_allowed_with)
3494 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3495 }
3496 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00003497 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00003498
3499 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00003500 options::OPT_objcmt_migrate_subscripting,
3501 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00003502 // None specified, means enable them all.
3503 CmdArgs.push_back("-objcmt-migrate-literals");
3504 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00003505 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00003506 } else {
3507 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3508 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00003509 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00003510 }
Argyrios Kyrtzidis17c384c2013-11-13 23:38:20 +00003511 } else {
3512 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3513 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3517 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003518 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis17c384c2013-11-13 23:38:20 +00003519 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3522 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3523 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3524 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Stephen Hines651f13c2014-04-23 16:59:28 -07003526 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
3527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenek30660a82012-03-06 20:06:33 +00003528 }
3529
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003530 // Add preprocessing options like -I, -D, etc. if we are using the
3531 // preprocessor.
3532 //
3533 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003534 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00003535 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003536
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00003537 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3538 // that "The compiler can only warn and ignore the option if not recognized".
3539 // When building with ccache, it will pass -D options to clang even on
3540 // preprocessed inputs and configure concludes that -fPIC is not supported.
3541 Args.ClaimAllArgs(options::OPT_D);
3542
Alp Tokere22017e2013-11-15 20:40:58 +00003543 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00003544 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3545 if (A->getOption().matches(options::OPT_O4)) {
3546 CmdArgs.push_back("-O3");
3547 D.Diag(diag::warn_O4_is_O3);
3548 } else {
3549 A->render(Args, CmdArgs);
3550 }
3551 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003552
Stephen Hines176edba2014-12-01 14:53:08 -08003553 // Warn about ignored options to clang.
3554 for (arg_iterator it = Args.filtered_begin(
3555 options::OPT_clang_ignored_gcc_optimization_f_Group),
3556 ie = Args.filtered_end(); it != ie; ++it) {
3557 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3558 }
3559
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003560 claimNoWarnArgs(Args);
Chad Rosierb2c08872012-12-12 20:06:31 +00003561
Stephen Hines176edba2014-12-01 14:53:08 -08003562 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00003563 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00003564 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3565 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00003566 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003567 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00003568
3569 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00003570 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00003571 //
3572 // If a std is supplied, only add -trigraphs if it follows the
3573 // option.
3574 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3575 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00003576 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00003577 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00003578 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00003579 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00003580 else
3581 Std->render(Args, CmdArgs);
3582
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003583 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar0e100312010-06-14 21:23:08 +00003584 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003585 options::OPT_ftrigraphs,
3586 options::OPT_fno_trigraphs))
Daniel Dunbar0e100312010-06-14 21:23:08 +00003587 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00003588 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003589 } else {
3590 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00003591 //
3592 // FIXME: Clang doesn't correctly handle -std= when the input language
3593 // doesn't match. For the time being just ignore this for C++ inputs;
3594 // eventually we want to do all the standard defaulting here instead of
3595 // splitting it between the driver and clang -cc1.
3596 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00003597 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3598 "-std=", /*Joined=*/true);
Stephen Hines651f13c2014-04-23 16:59:28 -07003599 else if (IsWindowsMSVC)
Nico Weber50f88b92012-08-30 02:08:31 +00003600 CmdArgs.push_back("-std=c++11");
3601
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003602 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3603 options::OPT_fno_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003604 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003605
Richard Smithe9813b32013-09-04 22:50:31 +00003606 // GCC's behavior for -Wwrite-strings is a bit strange:
3607 // * In C, this "warning flag" changes the types of string literals from
3608 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3609 // for the discarded qualifier.
3610 // * In C++, this is just a normal warning flag.
3611 //
3612 // Implementing this warning correctly in C is hard, so we follow GCC's
3613 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3614 // a non-const char* in C, rather than using this crude hack.
3615 if (!types::isCXX(InputType)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003616 // FIXME: This should behave just like a warning flag, and thus should also
3617 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3618 Arg *WriteStrings =
3619 Args.getLastArg(options::OPT_Wwrite_strings,
3620 options::OPT_Wno_write_strings, options::OPT_w);
3621 if (WriteStrings &&
3622 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smithe9813b32013-09-04 22:50:31 +00003623 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00003624 }
3625
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00003626 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00003627 // during C++ compilation, which it is by default. GCC keeps this define even
3628 // in the presence of '-w', match this behavior bug-for-bug.
3629 if (types::isCXX(InputType) &&
3630 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3631 true)) {
3632 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00003633 }
3634
Chandler Carruthc304ba32010-05-22 02:21:53 +00003635 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3636 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3637 if (Asm->getOption().matches(options::OPT_fasm))
3638 CmdArgs.push_back("-fgnu-keywords");
3639 else
3640 CmdArgs.push_back("-fno-gnu-keywords");
3641 }
3642
Nick Lewyckyea523d72011-10-17 23:05:52 +00003643 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3644 CmdArgs.push_back("-fno-dwarf-directory-asm");
3645
Daniel Dunbarf4910132013-04-16 18:21:19 +00003646 if (ShouldDisableAutolink(Args, getToolChain()))
3647 CmdArgs.push_back("-fno-autolink");
3648
Chandler Carruthd566df62012-12-17 21:40:04 +00003649 // Add in -fdebug-compilation-dir if necessary.
3650 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00003651
Richard Smithc18c4232011-11-21 19:36:32 +00003652 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3653 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00003654 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00003655 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003656 }
3657
Richard Smith195dd7c2013-11-06 19:31:51 +00003658 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3659 CmdArgs.push_back("-foperator-arrow-depth");
3660 CmdArgs.push_back(A->getValue());
3661 }
3662
Richard Smithc18c4232011-11-21 19:36:32 +00003663 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3664 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00003665 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00003666 }
3667
Richard Smithe7565632013-05-08 02:12:03 +00003668 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3669 CmdArgs.push_back("-fconstexpr-steps");
3670 CmdArgs.push_back(A->getValue());
3671 }
3672
Richard Smith9e738cc2013-02-22 01:59:51 +00003673 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3674 CmdArgs.push_back("-fbracket-depth");
3675 CmdArgs.push_back(A->getValue());
3676 }
3677
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00003678 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3679 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00003680 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003681 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00003682 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3683 } else
3684 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00003685 }
3686
Nuno Lopesb3198a82012-05-08 22:10:46 +00003687
Michael J. Spencerc6357102012-10-22 22:13:48 +00003688 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00003689 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00003690
Daniel Dunbar294691e2009-11-04 06:24:38 +00003691 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3692 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00003693 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00003694 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00003695
Chris Lattner124fca52010-01-09 21:54:33 +00003696 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3697 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00003698 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00003699 }
3700
Chris Lattner0f0c9632010-04-07 20:49:23 +00003701 CmdArgs.push_back("-ferror-limit");
3702 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00003703 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00003704 else
3705 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00003706
Chandler Carruthc40f73c2010-05-06 04:55:18 +00003707 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3708 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00003709 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00003710 }
3711
3712 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3713 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00003714 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00003715 }
3716
Richard Smith08d6e032011-12-16 19:06:07 +00003717 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3718 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00003719 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00003720 }
3721
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003722 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3723 CmdArgs.push_back("-fspell-checking-limit");
3724 CmdArgs.push_back(A->getValue());
3725 }
3726
Daniel Dunbar55efe142009-11-04 06:24:47 +00003727 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00003728 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00003729 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003730 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00003731 } else {
3732 // If -fmessage-length=N was not specified, determine whether this is a
3733 // terminal and, if so, implicitly define -fmessage-length appropriately.
3734 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00003735 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00003736 }
3737
John McCalla880b192013-02-19 01:57:35 +00003738 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3739 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3740 options::OPT_fvisibility_ms_compat)) {
3741 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3742 CmdArgs.push_back("-fvisibility");
3743 CmdArgs.push_back(A->getValue());
3744 } else {
3745 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3746 CmdArgs.push_back("-fvisibility");
3747 CmdArgs.push_back("hidden");
3748 CmdArgs.push_back("-ftype-visibility");
3749 CmdArgs.push_back("default");
3750 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00003751 }
3752
Douglas Gregor7cf84d62010-06-15 17:05:35 +00003753 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003754
Hans Wennborgde981f32012-06-28 08:01:44 +00003755 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3756
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00003757 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003758 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3759 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00003760 CmdArgs.push_back("-ffreestanding");
3761
Daniel Dunbarba8d8612009-12-03 18:42:11 +00003762 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003763 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003764 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Stephen Hines651f13c2014-04-23 16:59:28 -07003765 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3766 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christophere88c4512011-10-25 07:13:06 +00003767 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00003768 // AltiVec language extensions aren't relevant for assembling.
3769 if (!isa<PreprocessJobAction>(JA) ||
3770 Output.getType() != types::TY_PP_Asm)
3771 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00003772 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3773 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00003774
Peter Collingbournec6911a22013-11-01 18:16:25 +00003775 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3776 Sanitize.addArgs(Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00003777
Eric Christopher98654c92013-02-19 06:16:53 +00003778 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00003779 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003780 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003781 getToolChain().getArch() == llvm::Triple::ppc64 ||
3782 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00003783 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003784 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00003785
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00003786 if (getToolChain().SupportsProfiling())
3787 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00003788
3789 // -flax-vector-conversions is default.
3790 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3791 options::OPT_fno_lax_vector_conversions))
3792 CmdArgs.push_back("-fno-lax-vector-conversions");
3793
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003794 if (Args.getLastArg(options::OPT_fapple_kext))
3795 CmdArgs.push_back("-fapple-kext");
3796
Fariborz Jahanian34e65772009-05-22 20:17:16 +00003797 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00003798 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00003799 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003800 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3801 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00003802
3803 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3804 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00003805 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00003806 }
3807
Bob Wilson71fd6cc2012-02-03 06:27:22 +00003808 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00003809
Chandler Carruth5adb5a82011-03-27 00:04:55 +00003810 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3811 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3812 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3813 options::OPT_fno_wrapv)) {
3814 if (A->getOption().matches(options::OPT_fwrapv))
3815 CmdArgs.push_back("-fwrapv");
3816 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3817 options::OPT_fno_strict_overflow)) {
3818 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3819 CmdArgs.push_back("-fwrapv");
3820 }
Hal Finkelce5b5f12013-11-17 16:03:29 +00003821
3822 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3823 options::OPT_fno_reroll_loops))
3824 if (A->getOption().matches(options::OPT_freroll_loops))
3825 CmdArgs.push_back("-freroll-loops");
3826
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003827 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00003828 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3829 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003830
Daniel Dunbar5345c392009-09-03 04:54:28 +00003831 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3832
Mahesha Sf3b52312012-10-27 07:47:56 +00003833
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003834 // -stack-protector=0 is default.
3835 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00003836 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3837 options::OPT_fstack_protector_all,
Stephen Hines651f13c2014-04-23 16:59:28 -07003838 options::OPT_fstack_protector_strong,
Bill Wendling45483f72009-06-28 07:36:13 +00003839 options::OPT_fstack_protector)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003840 if (A->getOption().matches(options::OPT_fstack_protector)) {
3841 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3842 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3843 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Stephen Hines651f13c2014-04-23 16:59:28 -07003844 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003845 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Stephen Hines651f13c2014-04-23 16:59:28 -07003846 StackProtectorLevel = LangOptions::SSPReq;
Nico Weber2fef1112011-08-23 07:38:27 +00003847 } else {
3848 StackProtectorLevel =
3849 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3850 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003851 if (StackProtectorLevel) {
3852 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00003853 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003854 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00003855
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003856 // --param ssp-buffer-size=
3857 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3858 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003859 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003860 if (Str.startswith("ssp-buffer-size=")) {
3861 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00003862 CmdArgs.push_back("-stack-protector-buffer-size");
3863 // FIXME: Verify the argument is a valid integer.
3864 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00003865 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003866 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00003867 }
Bill Wendling45483f72009-06-28 07:36:13 +00003868 }
3869
Nick Lewycky4e785c92011-12-06 03:33:03 +00003870 // Translate -mstackrealign
3871 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3872 false)) {
3873 CmdArgs.push_back("-backend-option");
3874 CmdArgs.push_back("-force-align-stack");
3875 }
3876 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3877 false)) {
3878 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3879 }
3880
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00003881 if (Args.hasArg(options::OPT_mstack_alignment)) {
3882 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3883 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00003884 }
Stephen Hines176edba2014-12-01 14:53:08 -08003885
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003886 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3887 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3888
3889 if (!Size.empty())
3890 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3891 else
3892 CmdArgs.push_back("-mstack-probe-size=0");
3893 }
3894
Stephen Hines176edba2014-12-01 14:53:08 -08003895 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3896 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3897 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003898
Weiming Zhao7792fde2013-11-13 18:31:23 +00003899 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3900 options::OPT_mno_restrict_it)) {
3901 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3902 CmdArgs.push_back("-backend-option");
3903 CmdArgs.push_back("-arm-restrict-it");
3904 } else {
3905 CmdArgs.push_back("-backend-option");
3906 CmdArgs.push_back("-arm-no-restrict-it");
3907 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003908 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3909 TT.getArch() == llvm::Triple::thumb)) {
3910 // Windows on ARM expects restricted IT blocks
3911 CmdArgs.push_back("-backend-option");
3912 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao7792fde2013-11-13 18:31:23 +00003913 }
3914
Stephen Hinesef822542014-07-21 00:47:37 -07003915 if (TT.getArch() == llvm::Triple::arm ||
3916 TT.getArch() == llvm::Triple::thumb) {
3917 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3918 options::OPT_mno_long_calls)) {
3919 if (A->getOption().matches(options::OPT_mlong_calls)) {
3920 CmdArgs.push_back("-backend-option");
3921 CmdArgs.push_back("-arm-long-calls");
3922 }
3923 }
3924 }
3925
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003926 // Forward -f options with positive and negative forms; we translate
3927 // these by hand.
Diego Novillob85a9ec2013-11-13 12:22:39 +00003928 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3929 StringRef fname = A->getValue();
3930 if (!llvm::sys::fs::exists(fname))
3931 D.Diag(diag::err_drv_no_such_file) << fname;
3932 else
3933 A->render(Args, CmdArgs);
3934 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003935
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003936 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00003937 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003938 CmdArgs.push_back("-fapple-kext");
3939 if (!Args.hasArg(options::OPT_fbuiltin))
3940 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00003941 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003942 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003943 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003944 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00003945 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003946
Nuno Lopesfc284482009-12-16 16:59:22 +00003947 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3948 options::OPT_fno_assume_sane_operator_new))
3949 CmdArgs.push_back("-fno-assume-sane-operator-new");
3950
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003951 // -fblocks=0 is default.
3952 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00003953 getToolChain().IsBlocksDefault()) ||
3954 (Args.hasArg(options::OPT_fgnu_runtime) &&
3955 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3956 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003957 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00003958
3959 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3960 !getToolChain().hasBlocksRuntime())
3961 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00003962 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003963
Stephen Hines176edba2014-12-01 14:53:08 -08003964 // -fmodules enables modules (off by default).
3965 // Users can pass -fno-cxx-modules to turn off modules support for
3966 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003967 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003968 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3969 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3970 options::OPT_fno_cxx_modules,
Stephen Hines176edba2014-12-01 14:53:08 -08003971 true);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003972 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003973 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003974 HaveModules = true;
3975 }
3976 }
3977
Daniel Jasper056ec122013-08-05 20:26:17 +00003978 // -fmodule-maps enables module map processing (off by default) for header
3979 // checking. It is implied by -fmodules.
3980 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3981 false)) {
3982 CmdArgs.push_back("-fmodule-maps");
3983 }
3984
Daniel Jasper95411412013-10-21 06:34:34 +00003985 // -fmodules-decluse checks that modules used are declared so (off by
3986 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003987 if (Args.hasFlag(options::OPT_fmodules_decluse,
3988 options::OPT_fno_modules_decluse,
3989 false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00003990 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003991 }
3992
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003993 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3994 // all #included headers are part of modules.
3995 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3996 options::OPT_fno_modules_strict_decluse,
3997 false)) {
3998 CmdArgs.push_back("-fmodules-strict-decluse");
3999 }
4000
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004001 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4002 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4003 options::OPT_fno_implicit_modules)) {
4004 CmdArgs.push_back("-fno-implicit-modules");
4005 }
4006
Daniel Jasper95411412013-10-21 06:34:34 +00004007 // -fmodule-name specifies the module that is currently being built (or
4008 // used for header checking by -fmodule-maps).
Stephen Hines176edba2014-12-01 14:53:08 -08004009 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasper95411412013-10-21 06:34:34 +00004010
Stephen Hines176edba2014-12-01 14:53:08 -08004011 // -fmodule-map-file can be used to specify files containing module
Daniel Jasper95411412013-10-21 06:34:34 +00004012 // definitions.
Stephen Hines176edba2014-12-01 14:53:08 -08004013 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasper95411412013-10-21 06:34:34 +00004014
Stephen Hines176edba2014-12-01 14:53:08 -08004015 // -fmodule-file can be used to specify files containing precompiled modules.
4016 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4017
4018 // -fmodule-cache-path specifies where our implicitly-built module files
4019 // should be written.
Stephen Hinesef822542014-07-21 00:47:37 -07004020 SmallString<128> ModuleCachePath;
4021 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4022 ModuleCachePath = A->getValue();
4023 if (HaveModules) {
4024 if (C.isForDiagnostics()) {
4025 // When generating crash reports, we want to emit the modules along with
4026 // the reproduction sources, so we ignore any provided module path.
4027 ModuleCachePath = Output.getFilename();
4028 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4029 llvm::sys::path::append(ModuleCachePath, "modules");
4030 } else if (ModuleCachePath.empty()) {
4031 // No module path was provided: use the default.
4032 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4033 ModuleCachePath);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004034 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4035 appendUserToPath(ModuleCachePath);
Stephen Hinesef822542014-07-21 00:47:37 -07004036 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
Douglas Gregor953a61f2013-02-07 19:01:24 +00004037 }
Douglas Gregor250172a2013-02-07 22:59:12 +00004038 const char Arg[] = "-fmodules-cache-path=";
Stephen Hinesef822542014-07-21 00:47:37 -07004039 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4040 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
Douglas Gregor953a61f2013-02-07 19:01:24 +00004041 }
4042
Stephen Hinesef822542014-07-21 00:47:37 -07004043 // When building modules and generating crashdumps, we need to dump a module
4044 // dependency VFS alongside the output.
4045 if (HaveModules && C.isForDiagnostics()) {
4046 SmallString<128> VFSDir(Output.getFilename());
4047 llvm::sys::path::replace_extension(VFSDir, ".cache");
Stephen Hines176edba2014-12-01 14:53:08 -08004048 // Add the cache directory as a temp so the crash diagnostics pick it up.
4049 C.addTempFile(Args.MakeArgString(VFSDir));
4050
Stephen Hinesef822542014-07-21 00:47:37 -07004051 llvm::sys::path::append(VFSDir, "vfs");
4052 CmdArgs.push_back("-module-dependency-dir");
4053 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Stephen Hines651f13c2014-04-23 16:59:28 -07004054 }
4055
Stephen Hines176edba2014-12-01 14:53:08 -08004056 if (HaveModules)
4057 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Stephen Hinesef822542014-07-21 00:47:37 -07004058
Douglas Gregor953a61f2013-02-07 19:01:24 +00004059 // Pass through all -fmodules-ignore-macro arguments.
4060 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00004061 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4062 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00004063
Stephen Hines651f13c2014-04-23 16:59:28 -07004064 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4065
Stephen Hines176edba2014-12-01 14:53:08 -08004066 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4067 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4068 D.Diag(diag::err_drv_argument_not_allowed_with)
4069 << A->getAsString(Args) << "-fbuild-session-timestamp";
4070
4071 llvm::sys::fs::file_status Status;
4072 if (llvm::sys::fs::status(A->getValue(), Status))
4073 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004074 CmdArgs.push_back(Args.MakeArgString(
4075 "-fbuild-session-timestamp=" +
4076 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Stephen Hines176edba2014-12-01 14:53:08 -08004077 }
4078
Stephen Hines651f13c2014-04-23 16:59:28 -07004079 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Stephen Hines176edba2014-12-01 14:53:08 -08004080 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4081 options::OPT_fbuild_session_file))
Stephen Hines651f13c2014-04-23 16:59:28 -07004082 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4083
4084 Args.AddLastArg(CmdArgs,
4085 options::OPT_fmodules_validate_once_per_build_session);
4086 }
4087
4088 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4089
John McCall32579cf2010-04-09 19:12:06 +00004090 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00004091 if (Args.hasFlag(options::OPT_fno_access_control,
4092 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00004093 false))
John McCall7002f4c2010-04-09 19:03:51 +00004094 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00004095
Anders Carlssona4c24752010-11-21 00:09:52 +00004096 // -felide-constructors is the default.
4097 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4098 options::OPT_felide_constructors,
4099 false))
4100 CmdArgs.push_back("-fno-elide-constructors");
4101
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004102 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Mike Stump738f8c22009-07-31 23:15:31 +00004103
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004104 if (KernelOrKext || (types::isCXX(InputType) &&
4105 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4106 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004107 CmdArgs.push_back("-fno-rtti");
Richard Smithc4dabad2012-11-05 22:04:41 +00004108
Tony Linthicum96319392011-12-12 21:14:55 +00004109 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00004110 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00004111 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004112 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00004113 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00004114 CmdArgs.push_back("-fshort-enums");
4115
Daniel Dunbar1f95e652009-11-17 06:37:03 +00004116 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00004117 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00004118 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00004119 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00004120
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00004121 // -fuse-cxa-atexit is default.
Stephen Hines651f13c2014-04-23 16:59:28 -07004122 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4123 options::OPT_fno_use_cxa_atexit,
4124 !IsWindowsCygnus && !IsWindowsGNU &&
4125 getToolChain().getArch() != llvm::Triple::hexagon &&
4126 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00004127 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00004128 CmdArgs.push_back("-fno-use-cxa-atexit");
4129
Daniel Dunbar0be42c42009-11-17 07:06:20 +00004130 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00004131 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Stephen Hines651f13c2014-04-23 16:59:28 -07004132 IsWindowsMSVC))
Daniel Dunbar0be42c42009-11-17 07:06:20 +00004133 CmdArgs.push_back("-fms-extensions");
4134
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004135 // -fno-use-line-directives is default.
4136 if (Args.hasFlag(options::OPT_fuse_line_directives,
4137 options::OPT_fno_use_line_directives, false))
4138 CmdArgs.push_back("-fuse-line-directives");
4139
Francois Pichetae556082011-09-17 04:32:15 +00004140 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00004141 if (Args.hasFlag(options::OPT_fms_compatibility,
4142 options::OPT_fno_ms_compatibility,
Stephen Hines651f13c2014-04-23 16:59:28 -07004143 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4144 options::OPT_fno_ms_extensions,
4145 true))))
Francois Pichetae556082011-09-17 04:32:15 +00004146 CmdArgs.push_back("-fms-compatibility");
4147
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004148 // -fms-compatibility-version=18.00 is default.
4149 VersionTuple MSVT;
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00004150 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004151 IsWindowsMSVC) ||
4152 Args.hasArg(options::OPT_fmsc_version) ||
Stephen Hines176edba2014-12-01 14:53:08 -08004153 Args.hasArg(options::OPT_fms_compatibility_version)) {
4154 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4155 const Arg *MSCompatibilityVersion =
4156 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00004157
Stephen Hines176edba2014-12-01 14:53:08 -08004158 if (MSCVersion && MSCompatibilityVersion)
4159 D.Diag(diag::err_drv_argument_not_allowed_with)
4160 << MSCVersion->getAsString(Args)
4161 << MSCompatibilityVersion->getAsString(Args);
4162
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004163 if (MSCompatibilityVersion) {
4164 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4165 D.Diag(diag::err_drv_invalid_value)
4166 << MSCompatibilityVersion->getAsString(Args)
4167 << MSCompatibilityVersion->getValue();
4168 } else if (MSCVersion) {
4169 unsigned Version = 0;
4170 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4171 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4172 << MSCVersion->getValue();
4173 MSVT = getMSCompatibilityVersion(Version);
4174 } else {
4175 MSVT = VersionTuple(18);
4176 }
Stephen Hines176edba2014-12-01 14:53:08 -08004177
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004178 CmdArgs.push_back(
4179 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Stephen Hines176edba2014-12-01 14:53:08 -08004180 }
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00004181
Eric Christophercfc01e42013-02-18 00:38:31 +00004182 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00004183 if (Args.hasFlag(options::OPT_fborland_extensions,
4184 options::OPT_fno_borland_extensions, false))
4185 CmdArgs.push_back("-fborland-extensions");
4186
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004187 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4188 // than 19.
4189 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4190 options::OPT_fno_threadsafe_statics,
4191 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4192 CmdArgs.push_back("-fno-threadsafe-statics");
4193
Francois Pichet8efcc012011-09-01 16:38:08 +00004194 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4195 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00004196 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Stephen Hines651f13c2014-04-23 16:59:28 -07004197 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet805bc1f2011-08-26 00:22:34 +00004198 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00004199
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00004200 // -fgnu-keywords default varies depending on language; only pass if
4201 // specified.
4202 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00004203 options::OPT_fno_gnu_keywords))
4204 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00004205
Rafael Espindola01ba8542011-06-02 17:30:53 +00004206 if (Args.hasFlag(options::OPT_fgnu89_inline,
4207 options::OPT_fno_gnu89_inline,
4208 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00004209 CmdArgs.push_back("-fgnu89-inline");
4210
Chad Rosierfc055f92012-03-15 22:31:42 +00004211 if (Args.hasArg(options::OPT_fno_inline))
4212 CmdArgs.push_back("-fno-inline");
4213
Chad Rosier634a4b12012-03-06 21:17:19 +00004214 if (Args.hasArg(options::OPT_fno_inline_functions))
4215 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00004216
John McCall260611a2012-06-20 06:18:46 +00004217 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00004218
John McCall260611a2012-06-20 06:18:46 +00004219 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Stephen Hines651f13c2014-04-23 16:59:28 -07004220 // legacy is the default. Except for deployment taget of 10.5,
4221 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4222 // gets ignored silently.
4223 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00004224 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4225 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00004226 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004227 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00004228 if (getToolChain().UseObjCMixedDispatch())
4229 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4230 else
4231 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4232 }
4233 }
Rafael Espindola669496b2013-11-12 04:33:56 +00004234
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00004235 // When ObjectiveC legacy runtime is in effect on MacOSX,
4236 // turn on the option to do Array/Dictionary subscripting
4237 // by default.
Fariborz Jahanian08d86e92013-11-12 20:50:26 +00004238 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4239 getToolChain().getTriple().isMacOSX() &&
4240 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4241 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00004242 objcRuntime.isNeXTFamily())
4243 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4244
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00004245 // -fencode-extended-block-signature=1 is default.
4246 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4247 CmdArgs.push_back("-fencode-extended-block-signature");
4248 }
4249
John McCall9f084a32011-07-06 00:26:06 +00004250 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4251 // NOTE: This logic is duplicated in ToolChains.cpp.
4252 bool ARC = isObjCAutoRefCount(Args);
4253 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00004254 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00004255
John McCall9f084a32011-07-06 00:26:06 +00004256 CmdArgs.push_back("-fobjc-arc");
4257
Chandler Carruth7ffa0322011-11-04 07:34:47 +00004258 // FIXME: It seems like this entire block, and several around it should be
4259 // wrapped in isObjC, but for now we just use it here as this is where it
4260 // was being used previously.
4261 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4262 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4263 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4264 else
4265 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4266 }
4267
John McCall9f084a32011-07-06 00:26:06 +00004268 // Allow the user to enable full exceptions code emission.
4269 // We define off for Objective-CC, on for Objective-C++.
4270 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4271 options::OPT_fno_objc_arc_exceptions,
4272 /*default*/ types::isCXX(InputType)))
4273 CmdArgs.push_back("-fobjc-arc-exceptions");
4274 }
4275
4276 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4277 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00004278 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00004279 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00004280
John McCall9f084a32011-07-06 00:26:06 +00004281 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4282 // takes precedence.
4283 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4284 if (!GCArg)
4285 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4286 if (GCArg) {
4287 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004288 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00004289 << GCArg->getAsString(Args);
4290 } else if (getToolChain().SupportsObjCGC()) {
4291 GCArg->render(Args, CmdArgs);
4292 } else {
4293 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00004294 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00004295 << GCArg->getAsString(Args);
4296 }
4297 }
4298
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004299 if (Args.hasFlag(options::OPT_fapplication_extension,
4300 options::OPT_fno_application_extension, false))
4301 CmdArgs.push_back("-fapplication-extension");
4302
Stephen Hinesef822542014-07-21 00:47:37 -07004303 // Handle GCC-style exception args.
4304 if (!C.getDriver().IsCLMode())
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004305 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Stephen Hinesef822542014-07-21 00:47:37 -07004306 objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00004307
4308 if (getToolChain().UseSjLjExceptions())
4309 CmdArgs.push_back("-fsjlj-exceptions");
4310
4311 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00004312 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4313 options::OPT_fno_assume_sane_operator_new))
4314 CmdArgs.push_back("-fno-assume-sane-operator-new");
4315
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004316 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4317 // most platforms.
4318 if (Args.hasFlag(options::OPT_fsized_deallocation,
4319 options::OPT_fno_sized_deallocation, false))
4320 CmdArgs.push_back("-fsized-deallocation");
4321
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00004322 // -fconstant-cfstrings is default, and may be subject to argument translation
4323 // on Darwin.
4324 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4325 options::OPT_fno_constant_cfstrings) ||
4326 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4327 options::OPT_mno_constant_cfstrings))
4328 CmdArgs.push_back("-fno-constant-cfstrings");
4329
John Thompsona6fda122009-11-05 20:14:16 +00004330 // -fshort-wchar default varies depending on platform; only
4331 // pass if specified.
Stephen Hines651f13c2014-04-23 16:59:28 -07004332 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4333 options::OPT_fno_short_wchar))
Daniel Dunbar1744a352010-04-27 15:35:03 +00004334 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00004335
Hans Wennborgb087a5d2013-07-31 23:39:13 +00004336 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004337 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00004338 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00004339 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00004340 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00004341
Daniel Dunbar88934e82011-10-05 21:04:55 +00004342 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4343 // -fno-pack-struct doesn't apply to -fpack-struct=.
4344 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00004345 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00004346 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00004347 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00004348 } else if (Args.hasFlag(options::OPT_fpack_struct,
4349 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00004350 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00004351 }
4352
Stephen Hines176edba2014-12-01 14:53:08 -08004353 // Handle -fmax-type-align=N and -fno-type-align
4354 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4355 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4356 if (!SkipMaxTypeAlign) {
4357 std::string MaxTypeAlignStr = "-fmax-type-align=";
4358 MaxTypeAlignStr += A->getValue();
4359 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4360 }
4361 } else if (getToolChain().getTriple().isOSDarwin()) {
4362 if (!SkipMaxTypeAlign) {
4363 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4364 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4365 }
4366 }
4367
Robert Lytton5f15f4d2013-08-13 09:43:10 +00004368 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00004369 if (!Args.hasArg(options::OPT_fcommon))
4370 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00004371 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00004372 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00004373
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00004374 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00004375 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00004376 CmdArgs.push_back("-fno-common");
4377
Daniel Dunbar70d3c922009-04-15 02:37:43 +00004378 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00004379 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00004380 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00004381 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004382 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00004383 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4384
Daniel Dunbar06205ca2010-10-15 22:30:42 +00004385 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4386 if (!Args.hasFlag(options::OPT_ffor_scope,
4387 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004388 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00004389 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4390
Stephen Hinesef822542014-07-21 00:47:37 -07004391 // -finput_charset=UTF-8 is default. Reject others
4392 if (Arg *inputCharset = Args.getLastArg(
4393 options::OPT_finput_charset_EQ)) {
4394 StringRef value = inputCharset->getValue();
4395 if (value != "UTF-8")
4396 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4397 }
4398
Stephen Hines176edba2014-12-01 14:53:08 -08004399 // -fexec_charset=UTF-8 is default. Reject others
4400 if (Arg *execCharset = Args.getLastArg(
4401 options::OPT_fexec_charset_EQ)) {
4402 StringRef value = execCharset->getValue();
4403 if (value != "UTF-8")
4404 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4405 }
4406
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00004407 // -fcaret-diagnostics is default.
4408 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4409 options::OPT_fno_caret_diagnostics, true))
4410 CmdArgs.push_back("-fno-caret-diagnostics");
4411
Daniel Dunbar49138fc2009-04-19 21:09:34 +00004412 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00004413 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00004414 options::OPT_fno_diagnostics_fixit_info))
4415 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00004416
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00004417 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00004418 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00004419 options::OPT_fno_diagnostics_show_option))
4420 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00004421
Chris Lattner6fbe8392010-05-04 21:55:25 +00004422 if (const Arg *A =
4423 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4424 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00004425 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00004426 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00004427
Douglas Gregorc9471b02011-05-21 17:07:29 +00004428 if (const Arg *A =
4429 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4430 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00004431 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00004432 }
4433
Chandler Carruthabaca7a2011-03-27 01:50:55 +00004434 if (Arg *A = Args.getLastArg(
4435 options::OPT_fdiagnostics_show_note_include_stack,
4436 options::OPT_fno_diagnostics_show_note_include_stack)) {
4437 if (A->getOption().matches(
4438 options::OPT_fdiagnostics_show_note_include_stack))
4439 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4440 else
4441 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4442 }
4443
Daniel Dunbar838be482009-11-04 06:24:57 +00004444 // Color diagnostics are the default, unless the terminal doesn't support
4445 // them.
Nico Weber9753d462013-04-17 21:52:44 +00004446 // Support both clang's -f[no-]color-diagnostics and gcc's
4447 // -f[no-]diagnostics-colors[=never|always|auto].
4448 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Stephen Hinesef822542014-07-21 00:47:37 -07004449 for (const auto &Arg : Args) {
4450 const Option &O = Arg->getOption();
Nico Weber9753d462013-04-17 21:52:44 +00004451 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4452 !O.matches(options::OPT_fdiagnostics_color) &&
4453 !O.matches(options::OPT_fno_color_diagnostics) &&
4454 !O.matches(options::OPT_fno_diagnostics_color) &&
4455 !O.matches(options::OPT_fdiagnostics_color_EQ))
4456 continue;
4457
Stephen Hinesef822542014-07-21 00:47:37 -07004458 Arg->claim();
Nico Weber9753d462013-04-17 21:52:44 +00004459 if (O.matches(options::OPT_fcolor_diagnostics) ||
4460 O.matches(options::OPT_fdiagnostics_color)) {
4461 ShowColors = Colors_On;
4462 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4463 O.matches(options::OPT_fno_diagnostics_color)) {
4464 ShowColors = Colors_Off;
4465 } else {
4466 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Stephen Hinesef822542014-07-21 00:47:37 -07004467 StringRef value(Arg->getValue());
Nico Weber9753d462013-04-17 21:52:44 +00004468 if (value == "always")
4469 ShowColors = Colors_On;
4470 else if (value == "never")
4471 ShowColors = Colors_Off;
4472 else if (value == "auto")
4473 ShowColors = Colors_Auto;
4474 else
4475 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4476 << ("-fdiagnostics-color=" + value).str();
4477 }
4478 }
4479 if (ShowColors == Colors_On ||
4480 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00004481 CmdArgs.push_back("-fcolor-diagnostics");
4482
Nico Rieck2956ef42013-09-11 00:38:02 +00004483 if (Args.hasArg(options::OPT_fansi_escape_codes))
4484 CmdArgs.push_back("-fansi-escape-codes");
4485
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00004486 if (!Args.hasFlag(options::OPT_fshow_source_location,
4487 options::OPT_fno_show_source_location))
4488 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00004489
Douglas Gregorc9471b02011-05-21 17:07:29 +00004490 if (!Args.hasFlag(options::OPT_fshow_column,
4491 options::OPT_fno_show_column,
4492 true))
4493 CmdArgs.push_back("-fno-show-column");
4494
Douglas Gregora0068fc2010-07-09 17:35:33 +00004495 if (!Args.hasFlag(options::OPT_fspell_checking,
4496 options::OPT_fno_spell_checking))
4497 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00004498
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00004499
Chad Rosier15490fd2012-12-05 21:08:21 +00004500 // -fno-asm-blocks is default.
4501 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4502 false))
4503 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00004504
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004505 // -fgnu-inline-asm is default.
4506 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4507 options::OPT_fno_gnu_inline_asm, true))
4508 CmdArgs.push_back("-fno-gnu-inline-asm");
4509
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00004510 // Enable vectorization per default according to the optimization level
4511 // selected. For optimization levels that want vectorization we use the alias
4512 // option to simplify the hasFlag logic.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004513 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00004514 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00004515 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00004516 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00004517 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00004518 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00004519
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004520 // -fslp-vectorize is enabled based on the optimization level selected.
4521 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4522 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
4523 options::OPT_fslp_vectorize;
4524 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
4525 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem50ea9632013-04-15 04:57:18 +00004526 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00004527
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00004528 // -fno-slp-vectorize-aggressive is default.
4529 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00004530 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00004531 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00004532
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00004533 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4534 A->render(Args, CmdArgs);
4535
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004536 // -fdollars-in-identifiers default varies depending on platform and
4537 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00004538 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004539 options::OPT_fno_dollars_in_identifiers)) {
4540 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00004541 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004542 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00004543 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004544 }
4545
Daniel Dunbare027a4b2009-05-22 19:02:20 +00004546 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4547 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00004548 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00004549 options::OPT_fno_unit_at_a_time)) {
4550 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004551 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00004552 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00004553
Eli Friedman19bda3a2011-11-02 01:53:16 +00004554 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4555 options::OPT_fno_apple_pragma_pack, false))
4556 CmdArgs.push_back("-fapple-pragma-pack");
4557
Eli Benderskyf3ecf892013-07-24 18:20:14 +00004558 // le32-specific flags:
4559 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4560 // by default.
4561 if (getToolChain().getArch() == llvm::Triple::le32) {
4562 CmdArgs.push_back("-fno-math-builtin");
4563 }
4564
Daniel Dunbar2ba91572009-09-10 03:37:02 +00004565 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00004566 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00004567 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00004568#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00004569 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004570 (getToolChain().getArch() == llvm::Triple::arm ||
4571 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00004572 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4573 CmdArgs.push_back("-fno-builtin-strcat");
4574 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4575 CmdArgs.push_back("-fno-builtin-strcpy");
4576 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00004577#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00004578
Stephen Hinesef822542014-07-21 00:47:37 -07004579 // Enable rewrite includes if the user's asked for it or if we're generating
4580 // diagnostics.
4581 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4582 // nice to enable this when doing a crashdump for modules as well.
4583 if (Args.hasFlag(options::OPT_frewrite_includes,
4584 options::OPT_fno_rewrite_includes, false) ||
4585 (C.isForDiagnostics() && !HaveModules))
4586 CmdArgs.push_back("-frewrite-includes");
4587
Daniel Dunbard98750f2011-03-18 21:23:40 +00004588 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00004589 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00004590 options::OPT_traditional_cpp)) {
4591 if (isa<PreprocessJobAction>(JA))
4592 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00004593 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00004594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00004595 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00004596
Daniel Dunbar1d460332009-03-18 10:01:51 +00004597 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00004598 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00004599
4600 // Handle serialized diagnostics.
4601 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4602 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00004603 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00004604 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004605
Ted Kremenek127ff2e2012-09-13 06:41:18 +00004606 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4607 CmdArgs.push_back("-fretain-comments-from-system-headers");
4608
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00004609 // Forward -fcomment-block-commands to -cc1.
4610 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00004611 // Forward -fparse-all-comments to -cc1.
4612 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00004613
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004614 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4615 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00004616 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004617 bool OptDisabled = false;
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004618 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4619 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00004620 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00004621
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004622 // We translate this by hand to the -cc1 argument, since nightly test uses
4623 // it and developers have been trained to spell it with -mllvm.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004624 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004625 CmdArgs.push_back("-disable-llvm-optzns");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004626 OptDisabled = true;
4627 } else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00004628 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004629 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004630
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004631 // With -save-temps, we want to save the unoptimized bitcode output from the
4632 // CompileJobAction, so disable optimizations if they are not already
4633 // disabled.
4634 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
4635 isa<CompileJobAction>(JA))
4636 CmdArgs.push_back("-disable-llvm-optzns");
4637
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00004638 if (Output.getType() == types::TY_Dependencies) {
4639 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00004640 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004641 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004642 CmdArgs.push_back(Output.getFilename());
4643 } else {
4644 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004645 }
4646
Stephen Hinesef822542014-07-21 00:47:37 -07004647 for (const auto &II : Inputs) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004648 addDashXForInput(Args, II, CmdArgs);
4649
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004650 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004651 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00004652 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00004653 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004654 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004655
Chris Lattnere6113de2009-11-03 19:50:27 +00004656 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4657
Daniel Dunbara001c1c2010-07-18 21:16:15 +00004658 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004659
4660 // Optionally embed the -cc1 level arguments into the debug info, for build
4661 // analysis.
4662 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00004663 ArgStringList OriginalArgs;
Stephen Hinesef822542014-07-21 00:47:37 -07004664 for (const auto &Arg : Args)
4665 Arg->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00004666
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00004667 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004668 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00004669 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Stephen Hines176edba2014-12-01 14:53:08 -08004670 SmallString<128> EscapedArg;
4671 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004672 Flags += " ";
Stephen Hines176edba2014-12-01 14:53:08 -08004673 Flags += EscapedArg;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004674 }
4675 CmdArgs.push_back("-dwarf-debug-flags");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004676 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004677 }
4678
Eric Christopher80190392013-02-22 20:12:52 +00004679 // Add the split debug info name to the command lines here so we
4680 // can propagate it to the backend.
4681 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00004682 getToolChain().getTriple().isOSLinux() &&
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004683 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4684 isa<BackendJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00004685 const char *SplitDwarfOut;
4686 if (SplitDwarf) {
4687 CmdArgs.push_back("-split-dwarf-file");
4688 SplitDwarfOut = SplitDebugName(Args, Inputs);
4689 CmdArgs.push_back(SplitDwarfOut);
4690 }
4691
4692 // Finally add the compile command to the compilation.
Stephen Hines651f13c2014-04-23 16:59:28 -07004693 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004694 Output.getType() == types::TY_Object &&
4695 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Stephen Hines176edba2014-12-01 14:53:08 -08004696 auto CLCommand =
4697 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4698 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4699 std::move(CLCommand)));
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00004700 } else {
Stephen Hines176edba2014-12-01 14:53:08 -08004701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00004702 }
4703
Daniel Dunbara880db02009-03-23 19:03:36 +00004704
Eric Christopherff971d72013-02-22 23:50:16 +00004705 // Handle the debug info splitting at object creation time if we're
4706 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00004707 // TODO: Currently only works on linux with newer objcopy.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004708 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00004709 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00004710
Roman Divackybe4c8702011-02-10 16:52:03 +00004711 if (Arg *A = Args.getLastArg(options::OPT_pg))
4712 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004713 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00004714 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00004715
Daniel Dunbar68fb4692009-04-03 20:51:31 +00004716 // Claim some arguments which clang supports automatically.
4717
Daniel Dunbarf4046862010-04-15 06:18:42 +00004718 // -fpch-preprocess is used with gcc to add a special marker in the output to
4719 // include the PCH file. Clang's PTH solution is completely transparent, so we
4720 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00004721 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004722
Daniel Dunbara880db02009-03-23 19:03:36 +00004723 // Claim some arguments which clang doesn't support, but we don't
4724 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00004725 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4726 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00004727
Rafael Espindola6155fbe2013-09-04 19:37:35 +00004728 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00004729 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004730}
4731
John McCall260611a2012-06-20 06:18:46 +00004732/// Add options related to the Objective-C runtime/ABI.
4733///
4734/// Returns true if the runtime is non-fragile.
4735ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4736 ArgStringList &cmdArgs,
4737 RewriteKind rewriteKind) const {
4738 // Look for the controlling runtime option.
4739 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4740 options::OPT_fgnu_runtime,
4741 options::OPT_fobjc_runtime_EQ);
4742
4743 // Just forward -fobjc-runtime= to the frontend. This supercedes
4744 // options about fragility.
4745 if (runtimeArg &&
4746 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4747 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00004748 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00004749 if (runtime.tryParse(value)) {
4750 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4751 << value;
4752 }
4753
4754 runtimeArg->render(args, cmdArgs);
4755 return runtime;
4756 }
4757
4758 // Otherwise, we'll need the ABI "version". Version numbers are
4759 // slightly confusing for historical reasons:
4760 // 1 - Traditional "fragile" ABI
4761 // 2 - Non-fragile ABI, version 1
4762 // 3 - Non-fragile ABI, version 2
4763 unsigned objcABIVersion = 1;
4764 // If -fobjc-abi-version= is present, use that to set the version.
4765 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004766 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00004767 if (value == "1")
4768 objcABIVersion = 1;
4769 else if (value == "2")
4770 objcABIVersion = 2;
4771 else if (value == "3")
4772 objcABIVersion = 3;
4773 else
4774 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4775 << value;
4776 } else {
4777 // Otherwise, determine if we are using the non-fragile ABI.
4778 bool nonFragileABIIsDefault =
4779 (rewriteKind == RK_NonFragile ||
4780 (rewriteKind == RK_None &&
4781 getToolChain().IsObjCNonFragileABIDefault()));
4782 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4783 options::OPT_fno_objc_nonfragile_abi,
4784 nonFragileABIIsDefault)) {
4785 // Determine the non-fragile ABI version to use.
4786#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4787 unsigned nonFragileABIVersion = 1;
4788#else
4789 unsigned nonFragileABIVersion = 2;
4790#endif
4791
4792 if (Arg *abiArg = args.getLastArg(
4793 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004794 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00004795 if (value == "1")
4796 nonFragileABIVersion = 1;
4797 else if (value == "2")
4798 nonFragileABIVersion = 2;
4799 else
4800 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4801 << value;
4802 }
4803
4804 objcABIVersion = 1 + nonFragileABIVersion;
4805 } else {
4806 objcABIVersion = 1;
4807 }
4808 }
4809
4810 // We don't actually care about the ABI version other than whether
4811 // it's non-fragile.
4812 bool isNonFragile = objcABIVersion != 1;
4813
4814 // If we have no runtime argument, ask the toolchain for its default runtime.
4815 // However, the rewriter only really supports the Mac runtime, so assume that.
4816 ObjCRuntime runtime;
4817 if (!runtimeArg) {
4818 switch (rewriteKind) {
4819 case RK_None:
4820 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4821 break;
4822 case RK_Fragile:
4823 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4824 break;
4825 case RK_NonFragile:
4826 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4827 break;
4828 }
4829
4830 // -fnext-runtime
4831 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4832 // On Darwin, make this use the default behavior for the toolchain.
4833 if (getToolChain().getTriple().isOSDarwin()) {
4834 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4835
4836 // Otherwise, build for a generic macosx port.
4837 } else {
4838 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4839 }
4840
4841 // -fgnu-runtime
4842 } else {
4843 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00004844 // Legacy behaviour is to target the gnustep runtime if we are i
4845 // non-fragile mode or the GCC runtime in fragile mode.
4846 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00004847 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00004848 else
4849 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00004850 }
4851
4852 cmdArgs.push_back(args.MakeArgString(
4853 "-fobjc-runtime=" + runtime.getAsString()));
4854 return runtime;
4855}
4856
Stephen Hinesef822542014-07-21 00:47:37 -07004857static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4858 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4859 I += HaveDash;
4860 return !HaveDash;
4861}
4862
4863struct EHFlags {
4864 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4865 bool Synch;
4866 bool Asynch;
4867 bool NoExceptC;
4868};
4869
4870/// /EH controls whether to run destructor cleanups when exceptions are
4871/// thrown. There are three modifiers:
4872/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4873/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4874/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4875/// - c: Assume that extern "C" functions are implicitly noexcept. This
4876/// modifier is an optimization, so we ignore it for now.
4877/// The default is /EHs-c-, meaning cleanups are disabled.
4878static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4879 EHFlags EH;
4880 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4881 for (auto EHVal : EHArgs) {
4882 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4883 switch (EHVal[I]) {
4884 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4885 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4886 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4887 default: break;
4888 }
4889 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4890 break;
4891 }
4892 }
4893 return EH;
4894}
4895
Hans Wennborgb3574792013-08-08 00:17:41 +00004896void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4897 unsigned RTOptionID = options::OPT__SLASH_MT;
4898
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00004899 if (Args.hasArg(options::OPT__SLASH_LDd))
4900 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4901 // but defining _DEBUG is sticky.
4902 RTOptionID = options::OPT__SLASH_MTd;
4903
Hans Wennborg76da1782013-09-18 22:26:39 +00004904 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00004905 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00004906
Hans Wennborgb3574792013-08-08 00:17:41 +00004907 switch(RTOptionID) {
4908 case options::OPT__SLASH_MD:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00004909 if (Args.hasArg(options::OPT__SLASH_LDd))
4910 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00004911 CmdArgs.push_back("-D_MT");
4912 CmdArgs.push_back("-D_DLL");
4913 CmdArgs.push_back("--dependent-lib=msvcrt");
4914 break;
4915 case options::OPT__SLASH_MDd:
4916 CmdArgs.push_back("-D_DEBUG");
4917 CmdArgs.push_back("-D_MT");
4918 CmdArgs.push_back("-D_DLL");
4919 CmdArgs.push_back("--dependent-lib=msvcrtd");
4920 break;
4921 case options::OPT__SLASH_MT:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00004922 if (Args.hasArg(options::OPT__SLASH_LDd))
4923 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00004924 CmdArgs.push_back("-D_MT");
4925 CmdArgs.push_back("--dependent-lib=libcmt");
4926 break;
4927 case options::OPT__SLASH_MTd:
4928 CmdArgs.push_back("-D_DEBUG");
4929 CmdArgs.push_back("-D_MT");
4930 CmdArgs.push_back("--dependent-lib=libcmtd");
4931 break;
4932 default:
4933 llvm_unreachable("Unexpected option ID.");
4934 }
4935
Reid Klecknera32c5232013-08-08 19:33:10 +00004936 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4937 // users want. The /Za flag to cl.exe turns this off, but it's not
4938 // implemented in clang.
4939 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00004940
Stephen Hines176edba2014-12-01 14:53:08 -08004941 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4942 // would produce interleaved output, so ignore /showIncludes in such cases.
4943 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4944 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4945 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00004946
Stephen Hinesef822542014-07-21 00:47:37 -07004947 // This controls whether or not we emit RTTI data for polymorphic types.
4948 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4949 /*default=*/false))
4950 CmdArgs.push_back("-fno-rtti-data");
Stephen Hines651f13c2014-04-23 16:59:28 -07004951
Stephen Hines651f13c2014-04-23 16:59:28 -07004952 const Driver &D = getToolChain().getDriver();
Stephen Hinesef822542014-07-21 00:47:37 -07004953 EHFlags EH = parseClangCLEHFlags(D, Args);
4954 // FIXME: Do something with NoExceptC.
4955 if (EH.Synch || EH.Asynch) {
Stephen Hinesef822542014-07-21 00:47:37 -07004956 CmdArgs.push_back("-fcxx-exceptions");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004957 CmdArgs.push_back("-fexceptions");
Stephen Hinesef822542014-07-21 00:47:37 -07004958 }
4959
4960 // /EP should expand to -E -P.
4961 if (Args.hasArg(options::OPT__SLASH_EP)) {
4962 CmdArgs.push_back("-E");
4963 CmdArgs.push_back("-P");
4964 }
4965
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004966 unsigned VolatileOptionID;
4967 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4968 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4969 VolatileOptionID = options::OPT__SLASH_volatile_ms;
4970 else
4971 VolatileOptionID = options::OPT__SLASH_volatile_iso;
4972
4973 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
4974 VolatileOptionID = A->getOption().getID();
4975
4976 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
4977 CmdArgs.push_back("-fms-volatile");
4978
Stephen Hines651f13c2014-04-23 16:59:28 -07004979 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4980 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4981 if (MostGeneralArg && BestCaseArg)
4982 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4983 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4984
4985 if (MostGeneralArg) {
4986 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4987 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4988 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4989
4990 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4991 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4992 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4993 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4994 << FirstConflict->getAsString(Args)
4995 << SecondConflict->getAsString(Args);
4996
4997 if (SingleArg)
4998 CmdArgs.push_back("-fms-memptr-rep=single");
4999 else if (MultipleArg)
5000 CmdArgs.push_back("-fms-memptr-rep=multiple");
5001 else
5002 CmdArgs.push_back("-fms-memptr-rep=virtual");
5003 }
5004
5005 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5006 A->render(Args, CmdArgs);
5007
Hans Wennborgb6475522013-09-10 01:07:07 +00005008 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5009 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00005010 if (Args.hasArg(options::OPT__SLASH_fallback))
5011 CmdArgs.push_back("msvc-fallback");
5012 else
5013 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00005014 }
Hans Wennborgb3574792013-08-08 00:17:41 +00005015}
5016
Stephen Hinesef822542014-07-21 00:47:37 -07005017visualstudio::Compile *Clang::getCLFallback() const {
5018 if (!CLFallback)
5019 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5020 return CLFallback.get();
5021}
5022
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005023void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5024 ArgStringList &CmdArgs) const {
5025 StringRef CPUName;
5026 StringRef ABIName;
5027 const llvm::Triple &Triple = getToolChain().getTriple();
5028 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5029
5030 CmdArgs.push_back("-target-abi");
5031 CmdArgs.push_back(ABIName.data());
5032}
5033
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005034void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005035 const InputInfo &Output,
5036 const InputInfoList &Inputs,
5037 const ArgList &Args,
5038 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005039 ArgStringList CmdArgs;
5040
5041 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5042 const InputInfo &Input = Inputs[0];
5043
Rafael Espindoladbe80d92010-11-17 22:13:25 +00005044 // Don't warn about "clang -w -c foo.s"
5045 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005046 // and "clang -emit-llvm -c foo.s"
5047 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00005048
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005049 claimNoWarnArgs(Args);
5050
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005051 // Invoke ourselves in -cc1as mode.
5052 //
5053 // FIXME: Implement custom jobs for internal actions.
5054 CmdArgs.push_back("-cc1as");
5055
5056 // Add the "effective" target triple.
5057 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00005058 std::string TripleStr =
5059 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005060 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5061
5062 // Set the output mode, we currently only expect to be used as a real
5063 // assembler.
5064 CmdArgs.push_back("-filetype");
5065 CmdArgs.push_back("obj");
5066
Eric Christopher27e2b982012-12-18 00:31:10 +00005067 // Set the main file name, so that debug info works even with
5068 // -save-temps or preprocessed assembly.
5069 CmdArgs.push_back("-main-file-name");
5070 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
5071
Rafael Espindolab330e402013-08-20 22:12:08 +00005072 // Add the target cpu
Rafael Espindola146dbbf2013-08-21 16:39:20 +00005073 const llvm::Triple &Triple = getToolChain().getTriple();
5074 std::string CPU = getCPUName(Args, Triple);
Rafael Espindolab330e402013-08-20 22:12:08 +00005075 if (!CPU.empty()) {
5076 CmdArgs.push_back("-target-cpu");
5077 CmdArgs.push_back(Args.MakeArgString(CPU));
5078 }
5079
Rafael Espindola146dbbf2013-08-21 16:39:20 +00005080 // Add the target features
5081 const Driver &D = getToolChain().getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07005082 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbachfc308292012-02-10 20:37:10 +00005083
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00005084 // Ignore explicit -force_cpusubtype_ALL option.
5085 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005086
Eric Christopher8f0a4032012-01-10 00:38:01 +00005087 // Determine the original source input.
5088 const Action *SourceAction = &JA;
5089 while (SourceAction->getKind() != Action::InputClass) {
5090 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5091 SourceAction = SourceAction->getInputs()[0];
5092 }
5093
Chandler Carruthd566df62012-12-17 21:40:04 +00005094 // Forward -g and handle debug info related flags, assuming we are dealing
5095 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00005096 if (SourceAction->getType() == types::TY_Asm ||
5097 SourceAction->getType() == types::TY_PP_Asm) {
5098 Args.ClaimAllArgs(options::OPT_g_Group);
5099 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5100 if (!A->getOption().matches(options::OPT_g0))
5101 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00005102
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005103 if (Args.hasArg(options::OPT_gdwarf_2))
5104 CmdArgs.push_back("-gdwarf-2");
5105 if (Args.hasArg(options::OPT_gdwarf_3))
5106 CmdArgs.push_back("-gdwarf-3");
5107 if (Args.hasArg(options::OPT_gdwarf_4))
5108 CmdArgs.push_back("-gdwarf-4");
5109
Chandler Carruthd566df62012-12-17 21:40:04 +00005110 // Add the -fdebug-compilation-dir flag if needed.
5111 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00005112
5113 // Set the AT_producer to the clang version when using the integrated
5114 // assembler on assembly source files.
5115 CmdArgs.push_back("-dwarf-debug-producer");
5116 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00005117 }
Kevin Enderby567003e2011-12-22 19:31:58 +00005118
5119 // Optionally embed the -cc1as level arguments into the debug info, for build
5120 // analysis.
5121 if (getToolChain().UseDwarfDebugFlags()) {
5122 ArgStringList OriginalArgs;
Stephen Hinesef822542014-07-21 00:47:37 -07005123 for (const auto &Arg : Args)
5124 Arg->render(Args, OriginalArgs);
Kevin Enderby567003e2011-12-22 19:31:58 +00005125
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00005126 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00005127 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5128 Flags += Exec;
5129 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Stephen Hines176edba2014-12-01 14:53:08 -08005130 SmallString<128> EscapedArg;
5131 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby567003e2011-12-22 19:31:58 +00005132 Flags += " ";
Stephen Hines176edba2014-12-01 14:53:08 -08005133 Flags += EscapedArg;
Kevin Enderby567003e2011-12-22 19:31:58 +00005134 }
5135 CmdArgs.push_back("-dwarf-debug-flags");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005136 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby567003e2011-12-22 19:31:58 +00005137 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005138
5139 // FIXME: Add -static support, once we have it.
5140
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005141 // Add target specific flags.
5142 switch(getToolChain().getArch()) {
5143 default:
5144 break;
5145
5146 case llvm::Triple::mips:
5147 case llvm::Triple::mipsel:
5148 case llvm::Triple::mips64:
5149 case llvm::Triple::mips64el:
5150 AddMIPSTargetArgs(Args, CmdArgs);
5151 break;
5152 }
5153
Stephen Hines651f13c2014-04-23 16:59:28 -07005154 // Consume all the warning flags. Usually this would be handled more
5155 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5156 // doesn't handle that so rather than warning about unused flags that are
5157 // actually used, we'll lie by omission instead.
5158 // FIXME: Stop lying and consume only the appropriate driver flags
5159 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5160 ie = Args.filtered_end();
5161 it != ie; ++it)
5162 (*it)->claim();
5163
David Blaikie73168db2013-07-25 21:19:01 +00005164 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5165 getToolChain().getDriver());
5166
Daniel Dunbar3df23252011-04-29 17:53:18 +00005167 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005168
5169 assert(Output.isFilename() && "Unexpected lipo output.");
5170 CmdArgs.push_back("-o");
5171 CmdArgs.push_back(Output.getFilename());
5172
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005173 assert(Input.isFilename() && "Invalid input.");
5174 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005175
Daniel Dunbara001c1c2010-07-18 21:16:15 +00005176 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Stephen Hines176edba2014-12-01 14:53:08 -08005177 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00005178
5179 // Handle the debug info splitting at object creation time if we're
5180 // creating an object.
5181 // TODO: Currently only works on linux with newer objcopy.
5182 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00005183 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00005184 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5185 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005186}
5187
Stephen Hines176edba2014-12-01 14:53:08 -08005188void GnuTool::anchor() {}
5189
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005190void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005191 const InputInfo &Output,
5192 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00005193 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005194 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005195 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005196 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00005197
Stephen Hinesef822542014-07-21 00:47:37 -07005198 for (const auto &A : Args) {
Michael J. Spencer91e06da2012-10-19 22:37:06 +00005199 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00005200 // Don't forward any -g arguments to assembly steps.
5201 if (isa<AssembleJobAction>(JA) &&
5202 A->getOption().matches(options::OPT_g_Group))
5203 continue;
5204
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00005205 // Don't forward any -W arguments to assembly and link steps.
5206 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5207 A->getOption().matches(options::OPT_W_Group))
5208 continue;
5209
Daniel Dunbar75877192009-03-19 07:55:12 +00005210 // It is unfortunate that we have to claim here, as this means
5211 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00005212 // platforms using a generic gcc, even if we are just using gcc
5213 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00005214 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00005215 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00005216 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005217 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005218
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00005219 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005220
5221 // If using a driver driver, force the arch.
Bob Wilson905c45f2011-10-14 05:03:44 +00005222 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005223 CmdArgs.push_back("-arch");
Stephen Hines176edba2014-12-01 14:53:08 -08005224 CmdArgs.push_back(
5225 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005226 }
5227
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00005228 // Try to force gcc to match the tool chain we want, if we recognize
5229 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00005230 //
5231 // FIXME: The triple class should directly provide the information we want
5232 // here.
Stephen Hines176edba2014-12-01 14:53:08 -08005233 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005234 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00005235 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005236 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5237 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00005238 CmdArgs.push_back("-m64");
5239
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005240 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005241 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00005242 CmdArgs.push_back(Output.getFilename());
5243 } else {
5244 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005245 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00005246 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005247
Tony Linthicum96319392011-12-12 21:14:55 +00005248 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5249 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005250
5251 // Only pass -x if gcc will understand it; otherwise hope gcc
5252 // understands the suffix correctly. The main use case this would go
5253 // wrong in is for linker inputs if they happened to have an odd
5254 // suffix; really the only way to get this to happen is a command
5255 // like '-x foobar a.c' which will treat a.c like a linker input.
5256 //
5257 // FIXME: For the linker case specifically, can we safely convert
5258 // inputs into '-Wl,' options?
Stephen Hinesef822542014-07-21 00:47:37 -07005259 for (const auto &II : Inputs) {
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00005260 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00005261 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5262 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005263 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00005264 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00005265 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005266 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00005267 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00005268 else if (II.getType() == types::TY_ModuleFile)
5269 D.Diag(diag::err_drv_no_module_support)
5270 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00005271
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005272 if (types::canTypeBeUserSpecified(II.getType())) {
5273 CmdArgs.push_back("-x");
5274 CmdArgs.push_back(types::getTypeName(II.getType()));
5275 }
5276
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005277 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00005278 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00005279 else {
5280 const Arg &A = II.getInputArg();
5281
5282 // Reverse translate some rewritten options.
5283 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5284 CmdArgs.push_back("-lstdc++");
5285 continue;
5286 }
5287
Daniel Dunbar115a7922009-03-19 07:29:38 +00005288 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00005289 A.render(Args, CmdArgs);
5290 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005291 }
5292
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00005293 const std::string customGCCName = D.getCCCGenericGCCName();
5294 const char *GCCName;
5295 if (!customGCCName.empty())
5296 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00005297 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00005298 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00005299 } else
5300 GCCName = "gcc";
5301
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005302 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005303 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Stephen Hines176edba2014-12-01 14:53:08 -08005304 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00005305}
5306
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00005307void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5308 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005309 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00005310}
5311
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00005312void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5313 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00005314 const Driver &D = getToolChain().getDriver();
5315
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005316 switch (JA.getType()) {
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00005317 // If -flto, etc. are present then make sure not to force assembly output.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005318 case types::TY_LLVM_IR:
5319 case types::TY_LTO_IR:
5320 case types::TY_LLVM_BC:
5321 case types::TY_LTO_BC:
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00005322 CmdArgs.push_back("-c");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005323 break;
5324 case types::TY_PP_Asm:
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00005325 CmdArgs.push_back("-S");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005326 break;
5327 case types::TY_Nothing:
5328 CmdArgs.push_back("-fsyntax-only");
5329 break;
5330 default:
5331 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbar64952502010-02-11 03:16:21 +00005332 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00005333}
5334
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00005335void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5336 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005337 // The types are (hopefully) good enough.
5338}
5339
Tony Linthicum96319392011-12-12 21:14:55 +00005340// Hexagon tools start.
5341void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5342 ArgStringList &CmdArgs) const {
5343
5344}
5345void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5346 const InputInfo &Output,
5347 const InputInfoList &Inputs,
5348 const ArgList &Args,
5349 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005350 claimNoWarnArgs(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00005351
5352 const Driver &D = getToolChain().getDriver();
5353 ArgStringList CmdArgs;
5354
5355 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00005356 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00005357 CmdArgs.push_back(Args.MakeArgString(MarchString));
5358
5359 RenderExtraToolArgs(JA, CmdArgs);
5360
5361 if (Output.isFilename()) {
5362 CmdArgs.push_back("-o");
5363 CmdArgs.push_back(Output.getFilename());
5364 } else {
5365 assert(Output.isNothing() && "Unexpected output");
5366 CmdArgs.push_back("-fsyntax-only");
5367 }
5368
Matthew Curtis33c95f12012-12-06 17:49:03 +00005369 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5370 if (!SmallDataThreshold.empty())
5371 CmdArgs.push_back(
5372 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00005373
Matthew Curtis3d8d4222012-12-07 17:23:04 +00005374 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5375 options::OPT_Xassembler);
5376
Tony Linthicum96319392011-12-12 21:14:55 +00005377 // Only pass -x if gcc will understand it; otherwise hope gcc
5378 // understands the suffix correctly. The main use case this would go
5379 // wrong in is for linker inputs if they happened to have an odd
5380 // suffix; really the only way to get this to happen is a command
5381 // like '-x foobar a.c' which will treat a.c like a linker input.
5382 //
5383 // FIXME: For the linker case specifically, can we safely convert
5384 // inputs into '-Wl,' options?
Stephen Hinesef822542014-07-21 00:47:37 -07005385 for (const auto &II : Inputs) {
Tony Linthicum96319392011-12-12 21:14:55 +00005386 // Don't try to pass LLVM or AST inputs to a generic gcc.
5387 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5388 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5389 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5390 << getToolChain().getTripleString();
5391 else if (II.getType() == types::TY_AST)
5392 D.Diag(clang::diag::err_drv_no_ast_support)
5393 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00005394 else if (II.getType() == types::TY_ModuleFile)
5395 D.Diag(diag::err_drv_no_module_support)
5396 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00005397
5398 if (II.isFilename())
5399 CmdArgs.push_back(II.getFilename());
5400 else
5401 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5402 II.getInputArg().render(Args, CmdArgs);
5403 }
5404
5405 const char *GCCName = "hexagon-as";
Stephen Hinesef822542014-07-21 00:47:37 -07005406 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Stephen Hines176edba2014-12-01 14:53:08 -08005407 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00005408}
Stephen Hinesef822542014-07-21 00:47:37 -07005409
Tony Linthicum96319392011-12-12 21:14:55 +00005410void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5411 ArgStringList &CmdArgs) const {
5412 // The types are (hopefully) good enough.
5413}
5414
5415void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5416 const InputInfo &Output,
5417 const InputInfoList &Inputs,
5418 const ArgList &Args,
5419 const char *LinkingOutput) const {
5420
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005421 const toolchains::Hexagon_TC& ToolChain =
5422 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5423 const Driver &D = ToolChain.getDriver();
5424
Tony Linthicum96319392011-12-12 21:14:55 +00005425 ArgStringList CmdArgs;
5426
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005427 //----------------------------------------------------------------------------
5428 //
5429 //----------------------------------------------------------------------------
5430 bool hasStaticArg = Args.hasArg(options::OPT_static);
5431 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00005432 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005433 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5434 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5435 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5436 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00005437
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005438 //----------------------------------------------------------------------------
5439 // Silence warnings for various options
5440 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00005441
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005442 Args.ClaimAllArgs(options::OPT_g_Group);
5443 Args.ClaimAllArgs(options::OPT_emit_llvm);
5444 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5445 // handled somewhere else.
5446 Args.ClaimAllArgs(options::OPT_static_libgcc);
5447
5448 //----------------------------------------------------------------------------
5449 //
5450 //----------------------------------------------------------------------------
Stephen Hinesef822542014-07-21 00:47:37 -07005451 for (const auto &Opt : ToolChain.ExtraOpts)
5452 CmdArgs.push_back(Opt.c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00005453
Matthew Curtis67814152012-12-06 14:16:43 +00005454 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5455 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00005456
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005457 if (buildingLib) {
5458 CmdArgs.push_back("-shared");
5459 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5460 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00005461 }
5462
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005463 if (hasStaticArg)
5464 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00005465
Matthew Curtis33c95f12012-12-06 17:49:03 +00005466 if (buildPIE && !buildingLib)
5467 CmdArgs.push_back("-pie");
5468
5469 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5470 if (!SmallDataThreshold.empty()) {
5471 CmdArgs.push_back(
5472 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5473 }
5474
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005475 //----------------------------------------------------------------------------
5476 //
5477 //----------------------------------------------------------------------------
5478 CmdArgs.push_back("-o");
5479 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00005480
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005481 const std::string MarchSuffix = "/" + MarchString;
5482 const std::string G0Suffix = "/G0";
5483 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Stephen Hines176edba2014-12-01 14:53:08 -08005484 const std::string RootDir =
5485 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005486 const std::string StartFilesDir = RootDir
5487 + "hexagon/lib"
5488 + (buildingLib
5489 ? MarchG0Suffix : MarchSuffix);
5490
5491 //----------------------------------------------------------------------------
5492 // moslib
5493 //----------------------------------------------------------------------------
5494 std::vector<std::string> oslibs;
5495 bool hasStandalone= false;
5496
5497 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5498 ie = Args.filtered_end(); it != ie; ++it) {
5499 (*it)->claim();
5500 oslibs.push_back((*it)->getValue());
5501 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00005502 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005503 if (oslibs.empty()) {
5504 oslibs.push_back("standalone");
5505 hasStandalone = true;
5506 }
Tony Linthicum96319392011-12-12 21:14:55 +00005507
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005508 //----------------------------------------------------------------------------
5509 // Start Files
5510 //----------------------------------------------------------------------------
5511 if (incStdLib && incStartFiles) {
5512
5513 if (!buildingLib) {
5514 if (hasStandalone) {
5515 CmdArgs.push_back(
5516 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5517 }
5518 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5519 }
5520 std::string initObj = useShared ? "/initS.o" : "/init.o";
5521 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5522 }
5523
5524 //----------------------------------------------------------------------------
5525 // Library Search Paths
5526 //----------------------------------------------------------------------------
5527 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Stephen Hinesef822542014-07-21 00:47:37 -07005528 for (const auto &LibPath : LibPaths)
5529 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005530
5531 //----------------------------------------------------------------------------
5532 //
5533 //----------------------------------------------------------------------------
5534 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5535 Args.AddAllArgs(CmdArgs, options::OPT_e);
5536 Args.AddAllArgs(CmdArgs, options::OPT_s);
5537 Args.AddAllArgs(CmdArgs, options::OPT_t);
5538 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5539
5540 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5541
5542 //----------------------------------------------------------------------------
5543 // Libraries
5544 //----------------------------------------------------------------------------
5545 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005546 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005547 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5548 CmdArgs.push_back("-lm");
5549 }
5550
5551 CmdArgs.push_back("--start-group");
5552
5553 if (!buildingLib) {
5554 for(std::vector<std::string>::iterator i = oslibs.begin(),
5555 e = oslibs.end(); i != e; ++i)
5556 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5557 CmdArgs.push_back("-lc");
5558 }
5559 CmdArgs.push_back("-lgcc");
5560
5561 CmdArgs.push_back("--end-group");
5562 }
5563
5564 //----------------------------------------------------------------------------
5565 // End files
5566 //----------------------------------------------------------------------------
5567 if (incStdLib && incStartFiles) {
5568 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5569 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5570 }
5571
5572 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Stephen Hines176edba2014-12-01 14:53:08 -08005573 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5574 CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00005575}
5576// Hexagon tools end.
5577
Stephen Hines176edba2014-12-01 14:53:08 -08005578/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Stephen Hines651f13c2014-04-23 16:59:28 -07005579const char *arm::getARMCPUForMArch(const ArgList &Args,
5580 const llvm::Triple &Triple) {
5581 StringRef MArch;
5582 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5583 // Otherwise, if we have -march= choose the base CPU for that arch.
5584 MArch = A->getValue();
5585 } else {
5586 // Otherwise, use the Arch from the triple.
5587 MArch = Triple.getArchName();
5588 }
5589
5590 // Handle -march=native.
5591 if (MArch == "native") {
5592 std::string CPU = llvm::sys::getHostCPUName();
5593 if (CPU != "generic") {
5594 // Translate the native cpu into the architecture. The switch below will
5595 // then chose the minimum cpu for that arch.
5596 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
5597 }
5598 }
5599
Stephen Hines176edba2014-12-01 14:53:08 -08005600 return Triple.getARMCPUForArch(MArch);
Stephen Hines651f13c2014-04-23 16:59:28 -07005601}
5602
5603/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
5604StringRef arm::getARMTargetCPU(const ArgList &Args,
5605 const llvm::Triple &Triple) {
5606 // FIXME: Warn on inconsistent use of -mcpu and -march.
5607 // If we have -mcpu=, use that.
5608 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5609 StringRef MCPU = A->getValue();
5610 // Handle -mcpu=native.
5611 if (MCPU == "native")
5612 return llvm::sys::getHostCPUName();
5613 else
5614 return MCPU;
5615 }
5616
5617 return getARMCPUForMArch(Args, Triple);
5618}
5619
5620/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5621/// CPU.
5622//
5623// FIXME: This is redundant with -mcpu, why does LLVM use this.
5624// FIXME: tblgen this, or kill it!
5625const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5626 return llvm::StringSwitch<const char *>(CPU)
5627 .Case("strongarm", "v4")
5628 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5629 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5630 .Cases("arm920", "arm920t", "arm922t", "v4t")
5631 .Cases("arm940t", "ep9312","v4t")
5632 .Cases("arm10tdmi", "arm1020t", "v5")
5633 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5634 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5635 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005636 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5637 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5638 .Cases("mpcorenovfp", "mpcore", "v6k")
Stephen Hines651f13c2014-04-23 16:59:28 -07005639 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Stephen Hines176edba2014-12-01 14:53:08 -08005640 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
5641 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07005642 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005643 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5644 .Cases("sc300", "cortex-m3", "v7m")
Stephen Hines176edba2014-12-01 14:53:08 -08005645 .Cases("cortex-m4", "cortex-m7", "v7em")
Stephen Hines651f13c2014-04-23 16:59:28 -07005646 .Case("swift", "v7s")
5647 .Case("cyclone", "v8")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005648 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Stephen Hines651f13c2014-04-23 16:59:28 -07005649 .Default("");
5650}
5651
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005652void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5653 if (Args.hasArg(options::OPT_r))
5654 return;
5655
5656 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5657 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5658 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005659 .Cases("v6", "v6k", "v6t2", nullptr)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005660 .Default("--be8");
5661
5662 if (LinkFlag)
5663 CmdArgs.push_back(LinkFlag);
5664}
5665
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07005666mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5667 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5668 .Case("mips1", NanLegacy)
5669 .Case("mips2", NanLegacy)
5670 .Case("mips3", NanLegacy)
5671 .Case("mips4", NanLegacy)
5672 .Case("mips5", NanLegacy)
5673 .Case("mips32", NanLegacy)
5674 .Case("mips32r2", NanLegacy)
5675 .Case("mips32r3", NanLegacy | Nan2008)
5676 .Case("mips32r5", NanLegacy | Nan2008)
5677 .Case("mips32r6", Nan2008)
5678 .Case("mips64", NanLegacy)
5679 .Case("mips64r2", NanLegacy)
5680 .Case("mips64r3", NanLegacy | Nan2008)
5681 .Case("mips64r5", NanLegacy | Nan2008)
5682 .Case("mips64r6", Nan2008)
5683 .Default(NanLegacy);
5684}
5685
Stephen Hines651f13c2014-04-23 16:59:28 -07005686bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5687 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5688 return A && (A->getValue() == StringRef(Value));
5689}
5690
Stephen Hines176edba2014-12-01 14:53:08 -08005691bool mips::isUCLibc(const ArgList &Args) {
5692 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
5693 return A && A->getOption().matches(options::OPT_muclibc);
5694}
5695
Stephen Hinesef822542014-07-21 00:47:37 -07005696bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
5697 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5698 return llvm::StringSwitch<bool>(NaNArg->getValue())
5699 .Case("2008", true)
5700 .Case("legacy", false)
5701 .Default(false);
5702
5703 // NaN2008 is the default for MIPS32r6/MIPS64r6.
5704 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5705 .Cases("mips32r6", "mips64r6", true)
5706 .Default(false);
5707
5708 return false;
5709}
5710
Stephen Hines176edba2014-12-01 14:53:08 -08005711bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5712 StringRef ABIName) {
5713 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
5714 Triple.getVendor() != llvm::Triple::MipsTechnologies)
5715 return false;
5716
5717 if (ABIName != "32")
5718 return false;
5719
5720 return llvm::StringSwitch<bool>(CPUName)
5721 .Cases("mips2", "mips3", "mips4", "mips5", true)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005722 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5723 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Stephen Hines176edba2014-12-01 14:53:08 -08005724 .Default(false);
5725}
5726
Stephen Hines651f13c2014-04-23 16:59:28 -07005727llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindolacfed8282012-10-31 18:51:07 +00005728 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5729 // archs which Darwin doesn't use.
5730
5731 // The matching this routine does is fairly pointless, since it is neither the
5732 // complete architecture list, nor a reasonable subset. The problem is that
5733 // historically the driver driver accepts this and also ties its -march=
5734 // handling to the architecture name, so we need to be careful before removing
5735 // support for it.
5736
5737 // This code must be kept in sync with Clang's Darwin specific argument
5738 // translation.
5739
5740 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5741 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5742 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5743 .Case("ppc64", llvm::Triple::ppc64)
5744 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5745 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5746 llvm::Triple::x86)
Jim Grosbach32ca73e2013-11-16 00:53:35 +00005747 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindolacfed8282012-10-31 18:51:07 +00005748 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00005749 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Stephen Hines651f13c2014-04-23 16:59:28 -07005750 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson2503ebd2013-03-04 22:37:49 +00005751 .Cases("armv7s", "xscale", llvm::Triple::arm)
Stephen Hines176edba2014-12-01 14:53:08 -08005752 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindolacfed8282012-10-31 18:51:07 +00005753 .Case("r600", llvm::Triple::r600)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005754 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindolacfed8282012-10-31 18:51:07 +00005755 .Case("nvptx", llvm::Triple::nvptx)
5756 .Case("nvptx64", llvm::Triple::nvptx64)
5757 .Case("amdil", llvm::Triple::amdil)
5758 .Case("spir", llvm::Triple::spir)
5759 .Default(llvm::Triple::UnknownArch);
5760}
Tony Linthicum96319392011-12-12 21:14:55 +00005761
Stephen Hines651f13c2014-04-23 16:59:28 -07005762void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5763 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5764 T.setArch(Arch);
5765
5766 if (Str == "x86_64h")
5767 T.setArchName(Str);
5768 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5769 T.setOS(llvm::Triple::UnknownOS);
5770 T.setObjectFormat(llvm::Triple::MachO);
5771 }
5772}
5773
Bob Wilson66b8a662012-11-23 06:14:39 +00005774const char *Clang::getBaseInputName(const ArgList &Args,
5775 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00005776 return Args.MakeArgString(
5777 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005778}
5779
Bob Wilson66b8a662012-11-23 06:14:39 +00005780const char *Clang::getBaseInputStem(const ArgList &Args,
5781 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005782 const char *Str = getBaseInputName(Args, Inputs);
5783
Chris Lattner657ca662011-01-16 08:14:11 +00005784 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00005785 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005786
5787 return Str;
5788}
5789
Bob Wilson66b8a662012-11-23 06:14:39 +00005790const char *Clang::getDependencyFileName(const ArgList &Args,
5791 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005792 // FIXME: Think about this more.
5793 std::string Res;
5794
5795 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00005796 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005797 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00005798 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00005799 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00005800 }
Daniel Dunbar88137642009-09-09 22:32:48 +00005801 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005802}
5803
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005804void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5805 const InputInfo &Output,
5806 const InputInfoList &Inputs,
5807 const ArgList &Args,
5808 const char *LinkingOutput) const {
5809 const ToolChain &ToolChain = getToolChain();
5810 const Driver &D = ToolChain.getDriver();
5811 ArgStringList CmdArgs;
5812
5813 // Silence warning for "clang -g foo.o -o foo"
5814 Args.ClaimAllArgs(options::OPT_g_Group);
5815 // and "clang -emit-llvm foo.o -o foo"
5816 Args.ClaimAllArgs(options::OPT_emit_llvm);
5817 // and for "clang -w foo.o -o foo". Other warning options are already
5818 // handled somewhere else.
5819 Args.ClaimAllArgs(options::OPT_w);
5820
5821 if (!D.SysRoot.empty())
5822 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5823
5824 // CloudABI only supports static linkage.
5825 CmdArgs.push_back("-Bstatic");
5826 CmdArgs.push_back("--eh-frame-hdr");
5827 CmdArgs.push_back("--gc-sections");
5828
5829 if (Output.isFilename()) {
5830 CmdArgs.push_back("-o");
5831 CmdArgs.push_back(Output.getFilename());
5832 } else {
5833 assert(Output.isNothing() && "Invalid output.");
5834 }
5835
5836 if (!Args.hasArg(options::OPT_nostdlib) &&
5837 !Args.hasArg(options::OPT_nostartfiles)) {
5838 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5839 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5840 }
5841
5842 Args.AddAllArgs(CmdArgs, options::OPT_L);
5843 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5844 for (const auto &Path : Paths)
5845 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5846 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5847 Args.AddAllArgs(CmdArgs, options::OPT_e);
5848 Args.AddAllArgs(CmdArgs, options::OPT_s);
5849 Args.AddAllArgs(CmdArgs, options::OPT_t);
5850 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5851 Args.AddAllArgs(CmdArgs, options::OPT_r);
5852
5853 if (D.IsUsingLTO(ToolChain, Args))
5854 AddGoldPlugin(ToolChain, Args, CmdArgs);
5855
5856 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5857
5858 if (!Args.hasArg(options::OPT_nostdlib) &&
5859 !Args.hasArg(options::OPT_nodefaultlibs)) {
5860 if (D.CCCIsCXX())
5861 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5862 CmdArgs.push_back("-lc");
5863 CmdArgs.push_back("-lcompiler_rt");
5864 }
5865
5866 if (!Args.hasArg(options::OPT_nostdlib) &&
5867 !Args.hasArg(options::OPT_nostartfiles))
5868 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5869
5870 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5871 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5872}
5873
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005874void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005875 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005876 const InputInfoList &Inputs,
5877 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005878 const char *LinkingOutput) const {
5879 ArgStringList CmdArgs;
5880
5881 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5882 const InputInfo &Input = Inputs[0];
5883
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00005884 // Determine the original source input.
5885 const Action *SourceAction = &JA;
5886 while (SourceAction->getKind() != Action::InputClass) {
5887 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5888 SourceAction = SourceAction->getInputs()[0];
5889 }
5890
Stephen Hines651f13c2014-04-23 16:59:28 -07005891 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00005892 // sure it runs its system assembler not clang's integrated assembler.
Stephen Hines651f13c2014-04-23 16:59:28 -07005893 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5894 // FIXME: at run-time detect assembler capabilities or rely on version
5895 // information forwarded by -target-assembler-version (future)
5896 if (Args.hasArg(options::OPT_fno_integrated_as)) {
5897 const llvm::Triple &T(getToolChain().getTriple());
5898 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
5899 CmdArgs.push_back("-Q");
5900 }
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00005901
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00005902 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00005903 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00005904 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00005905 if (Args.hasArg(options::OPT_gstabs))
5906 CmdArgs.push_back("--gstabs");
5907 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00005908 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00005909 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005910
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005911 // Derived from asm spec.
Stephen Hines651f13c2014-04-23 16:59:28 -07005912 AddMachOArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005913
Daniel Dunbarf5438e32010-07-22 01:47:22 +00005914 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00005915 if (getToolChain().getArch() == llvm::Triple::x86 ||
5916 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00005917 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5918 CmdArgs.push_back("-force_cpusubtype_ALL");
5919
Eli Bendersky8f4269a2013-07-24 22:20:49 +00005920 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00005921 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00005922 Args.hasArg(options::OPT_fapple_kext)) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07005923 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00005924 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005925 CmdArgs.push_back("-static");
5926
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005927 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5928 options::OPT_Xassembler);
5929
5930 assert(Output.isFilename() && "Unexpected lipo output.");
5931 CmdArgs.push_back("-o");
5932 CmdArgs.push_back(Output.getFilename());
5933
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005934 assert(Input.isFilename() && "Invalid input.");
5935 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005936
5937 // asm_final spec is empty.
5938
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005939 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005940 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08005941 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005942}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005943
Stephen Hines651f13c2014-04-23 16:59:28 -07005944void darwin::MachOTool::anchor() {}
David Blaikie99ba9e32011-12-20 02:48:34 +00005945
Stephen Hines651f13c2014-04-23 16:59:28 -07005946void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5947 ArgStringList &CmdArgs) const {
5948 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00005949
Daniel Dunbar02633b52009-03-26 16:23:12 +00005950 // Derived from darwin_arch spec.
5951 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00005952 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00005953
Daniel Dunbareeff4062010-01-22 02:04:58 +00005954 // FIXME: Is this needed anymore?
5955 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00005956 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00005957}
5958
Bill Wendling6acf8b42012-10-02 18:02:50 +00005959bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5960 // We only need to generate a temp path for LTO if we aren't compiling object
5961 // files. When compiling source files, we run 'dsymutil' after linking. We
5962 // don't run 'dsymutil' when compiling object files.
Stephen Hinesef822542014-07-21 00:47:37 -07005963 for (const auto &Input : Inputs)
5964 if (Input.getType() != types::TY_Object)
Bill Wendling6acf8b42012-10-02 18:02:50 +00005965 return true;
5966
5967 return false;
5968}
5969
Daniel Dunbar748de8e2010-09-09 21:51:05 +00005970void darwin::Link::AddLinkArgs(Compilation &C,
5971 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00005972 ArgStringList &CmdArgs,
5973 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005974 const Driver &D = getToolChain().getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07005975 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00005976
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005977 unsigned Version[3] = { 0, 0, 0 };
5978 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5979 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00005980 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005981 Version[1], Version[2], HadExtra) ||
5982 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005983 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005984 << A->getAsString(Args);
5985 }
5986
Stephen Hines651f13c2014-04-23 16:59:28 -07005987 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005988 // the user.
Stephen Hines651f13c2014-04-23 16:59:28 -07005989 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5990 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005991
Bob Wilsonbd77c592013-08-02 22:25:34 +00005992 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5993 CmdArgs.push_back("-export_dynamic");
5994
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005995 // If we are using App Extension restrictions, pass a flag to the linker
5996 // telling it that the compiled code has been audited.
5997 if (Args.hasFlag(options::OPT_fapplication_extension,
5998 options::OPT_fno_application_extension, false))
5999 CmdArgs.push_back("-application_extension");
6000
Bill Wendlingc35f9082012-11-16 23:03:00 +00006001 // If we are using LTO, then automatically create a temporary file path for
6002 // the linker to use, so that it's lifetime will extend past a possible
6003 // dsymutil step.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006004 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6005 NeedsTempPath(Inputs)) {
Bill Wendlingc35f9082012-11-16 23:03:00 +00006006 const char *TmpPath = C.getArgs().MakeArgString(
6007 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6008 C.addTempFile(TmpPath);
6009 CmdArgs.push_back("-object_path_lto");
6010 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00006011 }
6012
Daniel Dunbar02633b52009-03-26 16:23:12 +00006013 // Derived from the "link" spec.
6014 Args.AddAllArgs(CmdArgs, options::OPT_static);
6015 if (!Args.hasArg(options::OPT_static))
6016 CmdArgs.push_back("-dynamic");
6017 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6018 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6019 // here. How do we wish to handle such things?
6020 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006021
Daniel Dunbar02633b52009-03-26 16:23:12 +00006022 if (!Args.hasArg(options::OPT_dynamiclib)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07006023 AddMachOArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00006024 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00006025 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006026
6027 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6028 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6029 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6030
6031 Arg *A;
6032 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6033 (A = Args.getLastArg(options::OPT_current__version)) ||
6034 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00006035 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00006036 << A->getAsString(Args) << "-dynamiclib";
6037
6038 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6039 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6040 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6041 } else {
6042 CmdArgs.push_back("-dylib");
6043
6044 Arg *A;
6045 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6046 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6047 (A = Args.getLastArg(options::OPT_client__name)) ||
6048 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6049 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6050 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00006051 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00006052 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006053
Daniel Dunbar02633b52009-03-26 16:23:12 +00006054 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6055 "-dylib_compatibility_version");
6056 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6057 "-dylib_current_version");
6058
Stephen Hines651f13c2014-04-23 16:59:28 -07006059 AddMachOArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006060
6061 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6062 "-dylib_install_name");
6063 }
6064
6065 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6066 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6067 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Stephen Hines651f13c2014-04-23 16:59:28 -07006068 if (MachOTC.isTargetIOSBased())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00006069 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006070 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6071 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6072 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6073 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6074 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6075 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00006076 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006077 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6078 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6079 Args.AddAllArgs(CmdArgs, options::OPT_init);
6080
Daniel Dunbarce911f52011-04-28 21:23:41 +00006081 // Add the deployment target.
Stephen Hines651f13c2014-04-23 16:59:28 -07006082 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarce911f52011-04-28 21:23:41 +00006083
Daniel Dunbar02633b52009-03-26 16:23:12 +00006084 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6085 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6086 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6087 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6088 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006089
Daniel Dunbar47e879d2010-07-13 23:31:40 +00006090 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6091 options::OPT_fno_pie,
6092 options::OPT_fno_PIE)) {
6093 if (A->getOption().matches(options::OPT_fpie) ||
6094 A->getOption().matches(options::OPT_fPIE))
6095 CmdArgs.push_back("-pie");
6096 else
6097 CmdArgs.push_back("-no_pie");
6098 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00006099
6100 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6101 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6102 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6103 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6104 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6105 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6106 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6107 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6108 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6109 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6110 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6111 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6112 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6113 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6114 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6115 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00006116
Daniel Dunbarcc957192011-05-02 21:03:47 +00006117 // Give --sysroot= preference, over the Apple specific behavior to also use
6118 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00006119 StringRef sysroot = C.getSysRoot();
6120 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00006121 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00006122 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00006123 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6124 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00006125 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00006126 }
6127
Daniel Dunbar02633b52009-03-26 16:23:12 +00006128 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6129 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6130 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6131 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6132 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00006133 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006134 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6135 Args.AddAllArgs(CmdArgs, options::OPT_y);
6136 Args.AddLastArg(CmdArgs, options::OPT_w);
6137 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6138 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6139 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6140 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6141 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6142 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6143 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6144 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6145 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6146 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6147 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6148 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6149}
6150
Stephen Hines651f13c2014-04-23 16:59:28 -07006151enum LibOpenMP {
6152 LibUnknown,
6153 LibGOMP,
6154 LibIOMP5
6155};
6156
Daniel Dunbar02633b52009-03-26 16:23:12 +00006157void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006158 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006159 const InputInfoList &Inputs,
6160 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00006161 const char *LinkingOutput) const {
6162 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00006163
Stephen Hines176edba2014-12-01 14:53:08 -08006164 // If the number of arguments surpasses the system limits, we will encode the
6165 // input files in a separate file, shortening the command line. To this end,
6166 // build a list of input file names that can be passed via a file with the
6167 // -filelist linker option.
6168 llvm::opt::ArgStringList InputFileList;
6169
Daniel Dunbar02633b52009-03-26 16:23:12 +00006170 // The logic here is derived from gcc's behavior; most of which
6171 // comes from specs (starting with link_command). Consult gcc for
6172 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00006173 ArgStringList CmdArgs;
6174
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00006175 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6176 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6177 options::OPT_ccc_arcmt_migrate)) {
Stephen Hinesef822542014-07-21 00:47:37 -07006178 for (const auto &Arg : Args)
6179 Arg->claim();
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00006180 const char *Exec =
6181 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6182 CmdArgs.push_back(Output.getFilename());
Stephen Hines176edba2014-12-01 14:53:08 -08006183 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00006184 return;
6185 }
6186
Daniel Dunbar02633b52009-03-26 16:23:12 +00006187 // I'm not sure why this particular decomposition exists in gcc, but
6188 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00006189 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006190
Daniel Dunbar02633b52009-03-26 16:23:12 +00006191 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6192 Args.AddAllArgs(CmdArgs, options::OPT_s);
6193 Args.AddAllArgs(CmdArgs, options::OPT_t);
6194 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6195 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006196 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006197 Args.AddAllArgs(CmdArgs, options::OPT_r);
6198
Daniel Dunbar270073c2010-10-18 22:08:36 +00006199 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6200 // members of static archive libraries which implement Objective-C classes or
6201 // categories.
6202 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6203 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00006204
Daniel Dunbar02633b52009-03-26 16:23:12 +00006205 CmdArgs.push_back("-o");
6206 CmdArgs.push_back(Output.getFilename());
6207
Chad Rosier18937312012-05-16 23:45:12 +00006208 if (!Args.hasArg(options::OPT_nostdlib) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07006209 !Args.hasArg(options::OPT_nostartfiles))
6210 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006211
6212 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006213
Stephen Hines651f13c2014-04-23 16:59:28 -07006214 LibOpenMP UsedOpenMPLib = LibUnknown;
6215 if (Args.hasArg(options::OPT_fopenmp)) {
6216 UsedOpenMPLib = LibGOMP;
6217 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6218 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6219 .Case("libgomp", LibGOMP)
6220 .Case("libiomp5", LibIOMP5)
6221 .Default(LibUnknown);
6222 if (UsedOpenMPLib == LibUnknown)
6223 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6224 << A->getOption().getName() << A->getValue();
6225 }
6226 switch (UsedOpenMPLib) {
6227 case LibGOMP:
Daniel Dunbar02633b52009-03-26 16:23:12 +00006228 CmdArgs.push_back("-lgomp");
Stephen Hines651f13c2014-04-23 16:59:28 -07006229 break;
6230 case LibIOMP5:
6231 CmdArgs.push_back("-liomp5");
6232 break;
6233 case LibUnknown:
6234 break;
6235 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00006236
Douglas Gregor04e326b2012-05-15 21:00:27 +00006237 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -08006238 // Build the input file for -filelist (list of linker input files) in case we
6239 // need it later
6240 for (const auto &II : Inputs) {
6241 if (!II.isFilename()) {
6242 // This is a linker input argument.
6243 // We cannot mix input arguments and file names in a -filelist input, thus
6244 // we prematurely stop our list (remaining files shall be passed as
6245 // arguments).
6246 if (InputFileList.size() > 0)
6247 break;
6248
6249 continue;
6250 }
6251
6252 InputFileList.push_back(II.getFilename());
6253 }
6254
Bob Wilson63d9f3c2012-05-15 18:57:39 +00006255 if (isObjCRuntimeLinked(Args) &&
6256 !Args.hasArg(options::OPT_nostdlib) &&
6257 !Args.hasArg(options::OPT_nodefaultlibs)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07006258 // We use arclite library for both ARC and subscripting support.
6259 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6260
Bob Wilson0b1c7152012-04-21 00:21:42 +00006261 CmdArgs.push_back("-framework");
6262 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00006263 // Link libobj.
6264 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00006265 }
John McCallf85e1932011-06-15 23:02:42 +00006266
Daniel Dunbar02633b52009-03-26 16:23:12 +00006267 if (LinkingOutput) {
6268 CmdArgs.push_back("-arch_multiple");
6269 CmdArgs.push_back("-final_output");
6270 CmdArgs.push_back(LinkingOutput);
6271 }
6272
Daniel Dunbar02633b52009-03-26 16:23:12 +00006273 if (Args.hasArg(options::OPT_fnested_functions))
6274 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006275
Daniel Dunbar02633b52009-03-26 16:23:12 +00006276 if (!Args.hasArg(options::OPT_nostdlib) &&
6277 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006278 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006279 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00006280
Daniel Dunbar02633b52009-03-26 16:23:12 +00006281 // link_ssp spec is empty.
6282
Daniel Dunbar6cd41542009-09-18 08:15:03 +00006283 // Let the tool chain choose which runtime library to link.
Stephen Hines651f13c2014-04-23 16:59:28 -07006284 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00006285 }
6286
Chad Rosier18937312012-05-16 23:45:12 +00006287 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00006288 !Args.hasArg(options::OPT_nostartfiles)) {
6289 // endfile_spec is empty.
6290 }
6291
6292 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6293 Args.AddAllArgs(CmdArgs, options::OPT_F);
6294
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006295 // -iframework should be forwarded as -F.
6296 for (auto it = Args.filtered_begin(options::OPT_iframework),
6297 ie = Args.filtered_end(); it != ie; ++it)
6298 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6299 (*it)->getValue()));
6300
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006301 if (!Args.hasArg(options::OPT_nostdlib) &&
6302 !Args.hasArg(options::OPT_nodefaultlibs)) {
6303 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6304 if (A->getValue() == StringRef("Accelerate")) {
6305 CmdArgs.push_back("-framework");
6306 CmdArgs.push_back("Accelerate");
6307 }
6308 }
6309 }
6310
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006311 const char *Exec =
Stephen Hinesef822542014-07-21 00:47:37 -07006312 Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08006313 std::unique_ptr<Command> Cmd =
6314 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6315 Cmd->setInputFileList(std::move(InputFileList));
6316 C.addCommand(std::move(Cmd));
Daniel Dunbar02633b52009-03-26 16:23:12 +00006317}
6318
Daniel Dunbarff7488d2009-03-20 00:52:38 +00006319void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006320 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006321 const InputInfoList &Inputs,
6322 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00006323 const char *LinkingOutput) const {
6324 ArgStringList CmdArgs;
6325
6326 CmdArgs.push_back("-create");
6327 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00006328
6329 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00006330 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00006331
Stephen Hinesef822542014-07-21 00:47:37 -07006332 for (const auto &II : Inputs) {
Daniel Dunbarff7488d2009-03-20 00:52:38 +00006333 assert(II.isFilename() && "Unexpected lipo input.");
6334 CmdArgs.push_back(II.getFilename());
6335 }
Stephen Hinesef822542014-07-21 00:47:37 -07006336
6337 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Stephen Hines176edba2014-12-01 14:53:08 -08006338 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00006339}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006340
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00006341void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006342 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00006343 const InputInfoList &Inputs,
6344 const ArgList &Args,
6345 const char *LinkingOutput) const {
6346 ArgStringList CmdArgs;
6347
Daniel Dunbar03e92302011-05-09 17:23:16 +00006348 CmdArgs.push_back("-o");
6349 CmdArgs.push_back(Output.getFilename());
6350
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00006351 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6352 const InputInfo &Input = Inputs[0];
6353 assert(Input.isFilename() && "Unexpected dsymutil input.");
6354 CmdArgs.push_back(Input.getFilename());
6355
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00006356 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006357 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Stephen Hines176edba2014-12-01 14:53:08 -08006358 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00006359}
6360
Eric Christopherf8571862011-08-23 17:56:55 +00006361void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00006362 const InputInfo &Output,
6363 const InputInfoList &Inputs,
6364 const ArgList &Args,
6365 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00006366 ArgStringList CmdArgs;
6367 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00006368 CmdArgs.push_back("--debug-info");
6369 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00006370 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00006371
6372 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6373 const InputInfo &Input = Inputs[0];
6374 assert(Input.isFilename() && "Unexpected verify input");
6375
6376 // Grabbing the output of the earlier dsymutil run.
6377 CmdArgs.push_back(Input.getFilename());
6378
6379 const char *Exec =
6380 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Stephen Hines176edba2014-12-01 14:53:08 -08006381 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopherf8571862011-08-23 17:56:55 +00006382}
6383
David Chisnall31c46902012-02-15 13:39:01 +00006384void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6385 const InputInfo &Output,
6386 const InputInfoList &Inputs,
6387 const ArgList &Args,
6388 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006389 claimNoWarnArgs(Args);
David Chisnall31c46902012-02-15 13:39:01 +00006390 ArgStringList CmdArgs;
6391
6392 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6393 options::OPT_Xassembler);
6394
6395 CmdArgs.push_back("-o");
6396 CmdArgs.push_back(Output.getFilename());
6397
Stephen Hinesef822542014-07-21 00:47:37 -07006398 for (const auto &II : Inputs)
David Chisnall31c46902012-02-15 13:39:01 +00006399 CmdArgs.push_back(II.getFilename());
David Chisnall31c46902012-02-15 13:39:01 +00006400
Stephen Hinesef822542014-07-21 00:47:37 -07006401 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08006402 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnall31c46902012-02-15 13:39:01 +00006403}
6404
David Chisnall31c46902012-02-15 13:39:01 +00006405void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6406 const InputInfo &Output,
6407 const InputInfoList &Inputs,
6408 const ArgList &Args,
6409 const char *LinkingOutput) const {
6410 // FIXME: Find a real GCC, don't hard-code versions here
6411 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6412 const llvm::Triple &T = getToolChain().getTriple();
6413 std::string LibPath = "/usr/lib/";
6414 llvm::Triple::ArchType Arch = T.getArch();
6415 switch (Arch) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00006416 case llvm::Triple::x86:
6417 GCCLibPath +=
6418 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6419 break;
6420 case llvm::Triple::x86_64:
6421 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6422 GCCLibPath += "/4.5.2/amd64/";
6423 LibPath += "amd64/";
6424 break;
6425 default:
6426 llvm_unreachable("Unsupported architecture");
David Chisnall31c46902012-02-15 13:39:01 +00006427 }
6428
6429 ArgStringList CmdArgs;
6430
David Chisnall41d476d2012-02-29 15:06:12 +00006431 // Demangle C++ names in errors
6432 CmdArgs.push_back("-C");
6433
David Chisnall31c46902012-02-15 13:39:01 +00006434 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6435 (!Args.hasArg(options::OPT_shared))) {
6436 CmdArgs.push_back("-e");
6437 CmdArgs.push_back("_start");
6438 }
6439
6440 if (Args.hasArg(options::OPT_static)) {
6441 CmdArgs.push_back("-Bstatic");
6442 CmdArgs.push_back("-dn");
6443 } else {
6444 CmdArgs.push_back("-Bdynamic");
6445 if (Args.hasArg(options::OPT_shared)) {
6446 CmdArgs.push_back("-shared");
6447 } else {
6448 CmdArgs.push_back("--dynamic-linker");
6449 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6450 }
6451 }
6452
6453 if (Output.isFilename()) {
6454 CmdArgs.push_back("-o");
6455 CmdArgs.push_back(Output.getFilename());
6456 } else {
6457 assert(Output.isNothing() && "Invalid output.");
6458 }
6459
6460 if (!Args.hasArg(options::OPT_nostdlib) &&
6461 !Args.hasArg(options::OPT_nostartfiles)) {
6462 if (!Args.hasArg(options::OPT_shared)) {
6463 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6464 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00006465 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00006466 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6467 } else {
6468 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00006469 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6470 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00006471 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00006472 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00006473 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00006474 }
6475
6476 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6477
6478 Args.AddAllArgs(CmdArgs, options::OPT_L);
6479 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6480 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00006481 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00006482
6483 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6484
6485 if (!Args.hasArg(options::OPT_nostdlib) &&
6486 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006487 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00006488 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00006489 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00006490 if (!Args.hasArg(options::OPT_shared)) {
6491 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00006492 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00006493 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00006494 }
David Chisnall31c46902012-02-15 13:39:01 +00006495 }
6496
6497 if (!Args.hasArg(options::OPT_nostdlib) &&
6498 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00006499 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00006500 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00006501 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00006502
Stephen Hines651f13c2014-04-23 16:59:28 -07006503 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnall31c46902012-02-15 13:39:01 +00006504
6505 const char *Exec =
Stephen Hinesef822542014-07-21 00:47:37 -07006506 Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08006507 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00006508}
6509
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006510void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006511 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006512 const InputInfoList &Inputs,
6513 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00006514 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006515 claimNoWarnArgs(Args);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006516 ArgStringList CmdArgs;
Stephen Hines651f13c2014-04-23 16:59:28 -07006517 bool NeedsKPIC = false;
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006518
Stephen Hines651f13c2014-04-23 16:59:28 -07006519 switch (getToolChain().getArch()) {
6520 case llvm::Triple::x86:
6521 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6522 // instruct as in the base system to assemble 32-bit code.
Bill Wendlingac66cb82013-12-08 00:21:01 +00006523 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07006524 break;
6525
6526 case llvm::Triple::ppc:
Bill Wendlingac66cb82013-12-08 00:21:01 +00006527 CmdArgs.push_back("-mppc");
6528 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07006529 break;
6530
6531 case llvm::Triple::sparc:
6532 CmdArgs.push_back("-32");
6533 NeedsKPIC = true;
6534 break;
6535
6536 case llvm::Triple::sparcv9:
6537 CmdArgs.push_back("-64");
6538 CmdArgs.push_back("-Av9a");
6539 NeedsKPIC = true;
6540 break;
6541
6542 case llvm::Triple::mips64:
6543 case llvm::Triple::mips64el: {
Bill Wendlingac66cb82013-12-08 00:21:01 +00006544 StringRef CPUName;
6545 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08006546 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Bill Wendlingac66cb82013-12-08 00:21:01 +00006547
6548 CmdArgs.push_back("-mabi");
6549 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6550
6551 if (getToolChain().getArch() == llvm::Triple::mips64)
6552 CmdArgs.push_back("-EB");
6553 else
6554 CmdArgs.push_back("-EL");
6555
Stephen Hines651f13c2014-04-23 16:59:28 -07006556 NeedsKPIC = true;
6557 break;
Bill Wendlingac66cb82013-12-08 00:21:01 +00006558 }
6559
Stephen Hines651f13c2014-04-23 16:59:28 -07006560 default:
6561 break;
6562 }
6563
6564 if (NeedsKPIC)
6565 addAssemblerKPIC(Args, CmdArgs);
6566
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006567 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6568 options::OPT_Xassembler);
6569
6570 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006571 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006572
Stephen Hinesef822542014-07-21 00:47:37 -07006573 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006574 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006575
6576 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006577 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08006578 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006579}
6580
6581void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006582 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006583 const InputInfoList &Inputs,
6584 const ArgList &Args,
6585 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006586 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006587 ArgStringList CmdArgs;
6588
Rafael Espindola6cc2a682012-12-31 22:41:36 +00006589 // Silence warning for "clang -g foo.o -o foo"
6590 Args.ClaimAllArgs(options::OPT_g_Group);
6591 // and "clang -emit-llvm foo.o -o foo"
6592 Args.ClaimAllArgs(options::OPT_emit_llvm);
6593 // and for "clang -w foo.o -o foo". Other warning options are already
6594 // handled somewhere else.
6595 Args.ClaimAllArgs(options::OPT_w);
6596
Bill Wendlingac66cb82013-12-08 00:21:01 +00006597 if (getToolChain().getArch() == llvm::Triple::mips64)
6598 CmdArgs.push_back("-EB");
6599 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6600 CmdArgs.push_back("-EL");
6601
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006602 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00006603 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006604 CmdArgs.push_back("-e");
6605 CmdArgs.push_back("__start");
6606 }
6607
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006608 if (Args.hasArg(options::OPT_static)) {
6609 CmdArgs.push_back("-Bstatic");
6610 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00006611 if (Args.hasArg(options::OPT_rdynamic))
6612 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006613 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006614 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006615 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006616 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006617 } else {
6618 CmdArgs.push_back("-dynamic-linker");
6619 CmdArgs.push_back("/usr/libexec/ld.so");
6620 }
6621 }
6622
Rafael Espindola9adba392013-06-05 04:28:55 +00006623 if (Args.hasArg(options::OPT_nopie))
6624 CmdArgs.push_back("-nopie");
6625
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006626 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006627 CmdArgs.push_back("-o");
6628 CmdArgs.push_back(Output.getFilename());
6629 } else {
6630 assert(Output.isNothing() && "Invalid output.");
6631 }
6632
6633 if (!Args.hasArg(options::OPT_nostdlib) &&
6634 !Args.hasArg(options::OPT_nostartfiles)) {
6635 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00006636 if (Args.hasArg(options::OPT_pg))
6637 CmdArgs.push_back(Args.MakeArgString(
6638 getToolChain().GetFilePath("gcrt0.o")));
6639 else
6640 CmdArgs.push_back(Args.MakeArgString(
6641 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006642 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006643 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006644 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00006645 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006646 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006647 }
6648 }
6649
Edward O'Callaghane7e18202009-10-28 15:13:08 +00006650 std::string Triple = getToolChain().getTripleString();
6651 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00006652 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00006653 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00006654 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006655
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006656 Args.AddAllArgs(CmdArgs, options::OPT_L);
6657 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6658 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00006659 Args.AddAllArgs(CmdArgs, options::OPT_s);
6660 Args.AddAllArgs(CmdArgs, options::OPT_t);
6661 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6662 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006663
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006664 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006665
6666 if (!Args.hasArg(options::OPT_nostdlib) &&
6667 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006668 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006669 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00006670 if (Args.hasArg(options::OPT_pg))
6671 CmdArgs.push_back("-lm_p");
6672 else
6673 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00006674 }
6675
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006676 // FIXME: For some reason GCC passes -lgcc before adding
6677 // the default system libraries. Just mimic this for now.
6678 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006679
Eric Christopherdc6cc872012-09-13 06:32:34 +00006680 if (Args.hasArg(options::OPT_pthread)) {
6681 if (!Args.hasArg(options::OPT_shared) &&
6682 Args.hasArg(options::OPT_pg))
6683 CmdArgs.push_back("-lpthread_p");
6684 else
6685 CmdArgs.push_back("-lpthread");
6686 }
6687
Chandler Carruth657849c2011-12-17 22:32:42 +00006688 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00006689 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00006690 CmdArgs.push_back("-lc_p");
6691 else
6692 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00006693 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00006694
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006695 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006696 }
6697
6698 if (!Args.hasArg(options::OPT_nostdlib) &&
6699 !Args.hasArg(options::OPT_nostartfiles)) {
6700 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006701 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006702 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006703 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006704 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006705 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006706 }
6707
6708 const char *Exec =
Stephen Hinesef822542014-07-21 00:47:37 -07006709 Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08006710 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006711}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00006712
Eli Friedman42f74f22012-08-08 23:57:20 +00006713void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6714 const InputInfo &Output,
6715 const InputInfoList &Inputs,
6716 const ArgList &Args,
6717 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006718 claimNoWarnArgs(Args);
Eli Friedman42f74f22012-08-08 23:57:20 +00006719 ArgStringList CmdArgs;
6720
6721 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6722 options::OPT_Xassembler);
6723
6724 CmdArgs.push_back("-o");
6725 CmdArgs.push_back(Output.getFilename());
6726
Stephen Hinesef822542014-07-21 00:47:37 -07006727 for (const auto &II : Inputs)
Eli Friedman42f74f22012-08-08 23:57:20 +00006728 CmdArgs.push_back(II.getFilename());
Eli Friedman42f74f22012-08-08 23:57:20 +00006729
Stephen Hinesef822542014-07-21 00:47:37 -07006730 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08006731 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00006732}
6733
6734void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6735 const InputInfo &Output,
6736 const InputInfoList &Inputs,
6737 const ArgList &Args,
6738 const char *LinkingOutput) const {
6739 const Driver &D = getToolChain().getDriver();
6740 ArgStringList CmdArgs;
6741
6742 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6743 (!Args.hasArg(options::OPT_shared))) {
6744 CmdArgs.push_back("-e");
6745 CmdArgs.push_back("__start");
6746 }
6747
6748 if (Args.hasArg(options::OPT_static)) {
6749 CmdArgs.push_back("-Bstatic");
6750 } else {
6751 if (Args.hasArg(options::OPT_rdynamic))
6752 CmdArgs.push_back("-export-dynamic");
6753 CmdArgs.push_back("--eh-frame-hdr");
6754 CmdArgs.push_back("-Bdynamic");
6755 if (Args.hasArg(options::OPT_shared)) {
6756 CmdArgs.push_back("-shared");
6757 } else {
6758 CmdArgs.push_back("-dynamic-linker");
6759 CmdArgs.push_back("/usr/libexec/ld.so");
6760 }
6761 }
6762
6763 if (Output.isFilename()) {
6764 CmdArgs.push_back("-o");
6765 CmdArgs.push_back(Output.getFilename());
6766 } else {
6767 assert(Output.isNothing() && "Invalid output.");
6768 }
6769
6770 if (!Args.hasArg(options::OPT_nostdlib) &&
6771 !Args.hasArg(options::OPT_nostartfiles)) {
6772 if (!Args.hasArg(options::OPT_shared)) {
6773 if (Args.hasArg(options::OPT_pg))
6774 CmdArgs.push_back(Args.MakeArgString(
6775 getToolChain().GetFilePath("gcrt0.o")));
6776 else
6777 CmdArgs.push_back(Args.MakeArgString(
6778 getToolChain().GetFilePath("crt0.o")));
6779 CmdArgs.push_back(Args.MakeArgString(
6780 getToolChain().GetFilePath("crtbegin.o")));
6781 } else {
6782 CmdArgs.push_back(Args.MakeArgString(
6783 getToolChain().GetFilePath("crtbeginS.o")));
6784 }
6785 }
6786
6787 Args.AddAllArgs(CmdArgs, options::OPT_L);
6788 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6789 Args.AddAllArgs(CmdArgs, options::OPT_e);
6790
6791 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6792
6793 if (!Args.hasArg(options::OPT_nostdlib) &&
6794 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006795 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00006796 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6797 if (Args.hasArg(options::OPT_pg))
6798 CmdArgs.push_back("-lm_p");
6799 else
6800 CmdArgs.push_back("-lm");
6801 }
6802
Rafael Espindola3667bbe2012-10-23 17:07:31 +00006803 if (Args.hasArg(options::OPT_pthread)) {
6804 if (!Args.hasArg(options::OPT_shared) &&
6805 Args.hasArg(options::OPT_pg))
6806 CmdArgs.push_back("-lpthread_p");
6807 else
6808 CmdArgs.push_back("-lpthread");
6809 }
6810
Eli Friedman42f74f22012-08-08 23:57:20 +00006811 if (!Args.hasArg(options::OPT_shared)) {
6812 if (Args.hasArg(options::OPT_pg))
6813 CmdArgs.push_back("-lc_p");
6814 else
6815 CmdArgs.push_back("-lc");
6816 }
6817
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00006818 StringRef MyArch;
6819 switch (getToolChain().getTriple().getArch()) {
6820 case llvm::Triple::arm:
6821 MyArch = "arm";
6822 break;
6823 case llvm::Triple::x86:
6824 MyArch = "i386";
6825 break;
6826 case llvm::Triple::x86_64:
6827 MyArch = "amd64";
6828 break;
6829 default:
6830 llvm_unreachable("Unsupported architecture");
6831 }
6832 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00006833 }
6834
6835 if (!Args.hasArg(options::OPT_nostdlib) &&
6836 !Args.hasArg(options::OPT_nostartfiles)) {
6837 if (!Args.hasArg(options::OPT_shared))
6838 CmdArgs.push_back(Args.MakeArgString(
6839 getToolChain().GetFilePath("crtend.o")));
6840 else
6841 CmdArgs.push_back(Args.MakeArgString(
6842 getToolChain().GetFilePath("crtendS.o")));
6843 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00006844
6845 const char *Exec =
Stephen Hinesef822542014-07-21 00:47:37 -07006846 Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08006847 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00006848}
6849
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006850void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006851 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006852 const InputInfoList &Inputs,
6853 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00006854 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006855 claimNoWarnArgs(Args);
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006856 ArgStringList CmdArgs;
6857
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006858 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6859 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00006860 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006861 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00006862 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00006863 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00006864 else if (getToolChain().getArch() == llvm::Triple::mips ||
6865 getToolChain().getArch() == llvm::Triple::mipsel ||
6866 getToolChain().getArch() == llvm::Triple::mips64 ||
6867 getToolChain().getArch() == llvm::Triple::mips64el) {
6868 StringRef CPUName;
6869 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08006870 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00006871
Eric Christopherc55da4b2012-09-05 21:32:44 +00006872 CmdArgs.push_back("-march");
6873 CmdArgs.push_back(CPUName.data());
6874
Eric Christopherc55da4b2012-09-05 21:32:44 +00006875 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006876 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00006877
6878 if (getToolChain().getArch() == llvm::Triple::mips ||
6879 getToolChain().getArch() == llvm::Triple::mips64)
6880 CmdArgs.push_back("-EB");
6881 else
6882 CmdArgs.push_back("-EL");
6883
Stephen Hines651f13c2014-04-23 16:59:28 -07006884 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola27fa2362012-12-13 04:17:14 +00006885 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Stephen Hines651f13c2014-04-23 16:59:28 -07006886 getToolChain().getArch() == llvm::Triple::armeb ||
6887 getToolChain().getArch() == llvm::Triple::thumb ||
6888 getToolChain().getArch() == llvm::Triple::thumbeb) {
6889 const Driver &D = getToolChain().getDriver();
6890 const llvm::Triple &Triple = getToolChain().getTriple();
6891 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6892
6893 if (FloatABI == "hard") {
6894 CmdArgs.push_back("-mfpu=vfp");
6895 } else {
6896 CmdArgs.push_back("-mfpu=softvfp");
6897 }
6898
Rafael Espindola27fa2362012-12-13 04:17:14 +00006899 switch(getToolChain().getTriple().getEnvironment()) {
Stephen Hines651f13c2014-04-23 16:59:28 -07006900 case llvm::Triple::GNUEABIHF:
Rafael Espindola27fa2362012-12-13 04:17:14 +00006901 case llvm::Triple::GNUEABI:
6902 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00006903 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00006904 break;
6905
6906 default:
6907 CmdArgs.push_back("-matpcs");
6908 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006909 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
6910 getToolChain().getArch() == llvm::Triple::sparcv9) {
6911 if (getToolChain().getArch() == llvm::Triple::sparc)
6912 CmdArgs.push_back("-Av8plusa");
6913 else
6914 CmdArgs.push_back("-Av9a");
6915
6916 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc55da4b2012-09-05 21:32:44 +00006917 }
Eric Christophered734732010-03-02 02:41:08 +00006918
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6920 options::OPT_Xassembler);
6921
6922 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006923 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006924
Stephen Hinesef822542014-07-21 00:47:37 -07006925 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006926 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006927
Stephen Hinesef822542014-07-21 00:47:37 -07006928 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08006929 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006930}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006931
6932void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006933 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006934 const InputInfoList &Inputs,
6935 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00006936 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00006937 const toolchains::FreeBSD& ToolChain =
6938 static_cast<const toolchains::FreeBSD&>(getToolChain());
6939 const Driver &D = ToolChain.getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07006940 const bool IsPIE =
6941 !Args.hasArg(options::OPT_shared) &&
6942 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006943 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00006944
6945 // Silence warning for "clang -g foo.o -o foo"
6946 Args.ClaimAllArgs(options::OPT_g_Group);
6947 // and "clang -emit-llvm foo.o -o foo"
6948 Args.ClaimAllArgs(options::OPT_emit_llvm);
6949 // and for "clang -w foo.o -o foo". Other warning options are already
6950 // handled somewhere else.
6951 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006952
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006953 if (!D.SysRoot.empty())
6954 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6955
Stephen Hines651f13c2014-04-23 16:59:28 -07006956 if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00006957 CmdArgs.push_back("-pie");
6958
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006959 if (Args.hasArg(options::OPT_static)) {
6960 CmdArgs.push_back("-Bstatic");
6961 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00006962 if (Args.hasArg(options::OPT_rdynamic))
6963 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006964 CmdArgs.push_back("--eh-frame-hdr");
6965 if (Args.hasArg(options::OPT_shared)) {
6966 CmdArgs.push_back("-Bshareable");
6967 } else {
6968 CmdArgs.push_back("-dynamic-linker");
6969 CmdArgs.push_back("/libexec/ld-elf.so.1");
6970 }
Roman Divacky94380162012-08-28 15:09:03 +00006971 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6972 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00006973 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6974 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6975 CmdArgs.push_back("--hash-style=both");
6976 }
6977 }
6978 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006979 }
6980
6981 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6982 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006983 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006984 CmdArgs.push_back("-m");
6985 CmdArgs.push_back("elf_i386_fbsd");
6986 }
6987
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006988 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00006989 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00006990 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00006991 }
6992
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006993 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006994 CmdArgs.push_back("-o");
6995 CmdArgs.push_back(Output.getFilename());
6996 } else {
6997 assert(Output.isNothing() && "Invalid output.");
6998 }
6999
7000 if (!Args.hasArg(options::OPT_nostdlib) &&
7001 !Args.hasArg(options::OPT_nostartfiles)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007002 const char *crt1 = nullptr;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007003 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00007004 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00007005 crt1 = "gcrt1.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07007006 else if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00007007 crt1 = "Scrt1.o";
7008 else
7009 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007010 }
Roman Divacky94380162012-08-28 15:09:03 +00007011 if (crt1)
7012 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7013
7014 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7015
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007016 const char *crtbegin = nullptr;
Roman Divacky94380162012-08-28 15:09:03 +00007017 if (Args.hasArg(options::OPT_static))
7018 crtbegin = "crtbeginT.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07007019 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00007020 crtbegin = "crtbeginS.o";
7021 else
7022 crtbegin = "crtbegin.o";
7023
7024 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007025 }
7026
7027 Args.AddAllArgs(CmdArgs, options::OPT_L);
Stephen Hines176edba2014-12-01 14:53:08 -08007028 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Stephen Hinesef822542014-07-21 00:47:37 -07007029 for (const auto &Path : Paths)
7030 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007031 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7032 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00007033 Args.AddAllArgs(CmdArgs, options::OPT_s);
7034 Args.AddAllArgs(CmdArgs, options::OPT_t);
7035 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7036 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007037
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007038 if (D.IsUsingLTO(getToolChain(), Args))
Stephen Hines651f13c2014-04-23 16:59:28 -07007039 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackydb334192013-11-10 09:31:43 +00007040
Stephen Hines176edba2014-12-01 14:53:08 -08007041 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divacky94380162012-08-28 15:09:03 +00007042 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007043
7044 if (!Args.hasArg(options::OPT_nostdlib) &&
7045 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007046 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00007047 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00007048 if (Args.hasArg(options::OPT_pg))
7049 CmdArgs.push_back("-lm_p");
7050 else
7051 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00007052 }
Stephen Hines176edba2014-12-01 14:53:08 -08007053 if (NeedsSanitizerDeps)
7054 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007055 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7056 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00007057 if (Args.hasArg(options::OPT_pg))
7058 CmdArgs.push_back("-lgcc_p");
7059 else
7060 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007061 if (Args.hasArg(options::OPT_static)) {
7062 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00007063 } else if (Args.hasArg(options::OPT_pg)) {
7064 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007065 } else {
7066 CmdArgs.push_back("--as-needed");
7067 CmdArgs.push_back("-lgcc_s");
7068 CmdArgs.push_back("--no-as-needed");
7069 }
7070
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00007071 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00007072 if (Args.hasArg(options::OPT_pg))
7073 CmdArgs.push_back("-lpthread_p");
7074 else
7075 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00007076 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007077
Roman Divackyc16bb762011-02-10 16:59:40 +00007078 if (Args.hasArg(options::OPT_pg)) {
7079 if (Args.hasArg(options::OPT_shared))
7080 CmdArgs.push_back("-lc");
7081 else
7082 CmdArgs.push_back("-lc_p");
7083 CmdArgs.push_back("-lgcc_p");
7084 } else {
7085 CmdArgs.push_back("-lc");
7086 CmdArgs.push_back("-lgcc");
7087 }
7088
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007089 if (Args.hasArg(options::OPT_static)) {
7090 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00007091 } else if (Args.hasArg(options::OPT_pg)) {
7092 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007093 } else {
7094 CmdArgs.push_back("--as-needed");
7095 CmdArgs.push_back("-lgcc_s");
7096 CmdArgs.push_back("--no-as-needed");
7097 }
7098 }
7099
7100 if (!Args.hasArg(options::OPT_nostdlib) &&
7101 !Args.hasArg(options::OPT_nostartfiles)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007102 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00007103 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00007104 else
7105 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00007106 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007107 }
7108
Stephen Hines651f13c2014-04-23 16:59:28 -07007109 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00007110
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007111 const char *Exec =
Stephen Hinesef822542014-07-21 00:47:37 -07007112 Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08007113 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007114}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007115
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007116void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7117 const InputInfo &Output,
7118 const InputInfoList &Inputs,
7119 const ArgList &Args,
7120 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007121 claimNoWarnArgs(Args);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007122 ArgStringList CmdArgs;
7123
Stephen Hines651f13c2014-04-23 16:59:28 -07007124 // GNU as needs different flags for creating the correct output format
7125 // on architectures with different ABIs or optional feature sets.
7126 switch (getToolChain().getArch()) {
7127 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007128 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07007129 break;
7130 case llvm::Triple::arm:
7131 case llvm::Triple::armeb:
7132 case llvm::Triple::thumb:
7133 case llvm::Triple::thumbeb: {
7134 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Bill Wendlingcf660bd2013-12-06 19:12:36 +00007135 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Stephen Hines651f13c2014-04-23 16:59:28 -07007136 break;
Bill Wendlingcf660bd2013-12-06 19:12:36 +00007137 }
7138
Stephen Hines651f13c2014-04-23 16:59:28 -07007139 case llvm::Triple::mips:
7140 case llvm::Triple::mipsel:
7141 case llvm::Triple::mips64:
7142 case llvm::Triple::mips64el: {
Bill Wendlingc54c8852013-12-09 02:59:27 +00007143 StringRef CPUName;
7144 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08007145 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Bill Wendlingc54c8852013-12-09 02:59:27 +00007146
7147 CmdArgs.push_back("-march");
7148 CmdArgs.push_back(CPUName.data());
7149
7150 CmdArgs.push_back("-mabi");
7151 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7152
7153 if (getToolChain().getArch() == llvm::Triple::mips ||
7154 getToolChain().getArch() == llvm::Triple::mips64)
7155 CmdArgs.push_back("-EB");
7156 else
7157 CmdArgs.push_back("-EL");
7158
Stephen Hines651f13c2014-04-23 16:59:28 -07007159 addAssemblerKPIC(Args, CmdArgs);
7160 break;
7161 }
7162
7163 case llvm::Triple::sparc:
7164 CmdArgs.push_back("-32");
7165 addAssemblerKPIC(Args, CmdArgs);
7166 break;
7167
7168 case llvm::Triple::sparcv9:
7169 CmdArgs.push_back("-64");
7170 CmdArgs.push_back("-Av9");
7171 addAssemblerKPIC(Args, CmdArgs);
7172 break;
7173
7174 default:
7175 break;
Bill Wendlingc54c8852013-12-09 02:59:27 +00007176 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007177
7178 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7179 options::OPT_Xassembler);
7180
7181 CmdArgs.push_back("-o");
7182 CmdArgs.push_back(Output.getFilename());
7183
Stephen Hinesef822542014-07-21 00:47:37 -07007184 for (const auto &II : Inputs)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007185 CmdArgs.push_back(II.getFilename());
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007186
David Chisnall5adcec12011-09-27 22:03:18 +00007187 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Stephen Hines176edba2014-12-01 14:53:08 -08007188 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007189}
7190
7191void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7192 const InputInfo &Output,
7193 const InputInfoList &Inputs,
7194 const ArgList &Args,
7195 const char *LinkingOutput) const {
7196 const Driver &D = getToolChain().getDriver();
7197 ArgStringList CmdArgs;
7198
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00007199 if (!D.SysRoot.empty())
7200 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7201
Stephen Hines651f13c2014-04-23 16:59:28 -07007202 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007203 if (Args.hasArg(options::OPT_static)) {
7204 CmdArgs.push_back("-Bstatic");
7205 } else {
7206 if (Args.hasArg(options::OPT_rdynamic))
7207 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007208 if (Args.hasArg(options::OPT_shared)) {
7209 CmdArgs.push_back("-Bshareable");
7210 } else {
7211 CmdArgs.push_back("-dynamic-linker");
7212 CmdArgs.push_back("/libexec/ld.elf_so");
7213 }
7214 }
7215
Stephen Hines651f13c2014-04-23 16:59:28 -07007216 // Many NetBSD architectures support more than one ABI.
7217 // Determine the correct emulation for ld.
7218 switch (getToolChain().getArch()) {
7219 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007220 CmdArgs.push_back("-m");
7221 CmdArgs.push_back("elf_i386");
Stephen Hines651f13c2014-04-23 16:59:28 -07007222 break;
7223 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07007224 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07007225 CmdArgs.push_back("-m");
7226 switch (getToolChain().getTriple().getEnvironment()) {
7227 case llvm::Triple::EABI:
7228 case llvm::Triple::GNUEABI:
7229 CmdArgs.push_back("armelf_nbsd_eabi");
7230 break;
7231 case llvm::Triple::EABIHF:
7232 case llvm::Triple::GNUEABIHF:
7233 CmdArgs.push_back("armelf_nbsd_eabihf");
7234 break;
7235 default:
7236 CmdArgs.push_back("armelf_nbsd");
7237 break;
7238 }
7239 break;
Stephen Hines176edba2014-12-01 14:53:08 -08007240 case llvm::Triple::armeb:
7241 case llvm::Triple::thumbeb:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007242 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Stephen Hines176edba2014-12-01 14:53:08 -08007243 CmdArgs.push_back("-m");
7244 switch (getToolChain().getTriple().getEnvironment()) {
7245 case llvm::Triple::EABI:
7246 case llvm::Triple::GNUEABI:
7247 CmdArgs.push_back("armelfb_nbsd_eabi");
7248 break;
7249 case llvm::Triple::EABIHF:
7250 case llvm::Triple::GNUEABIHF:
7251 CmdArgs.push_back("armelfb_nbsd_eabihf");
7252 break;
7253 default:
7254 CmdArgs.push_back("armelfb_nbsd");
7255 break;
7256 }
7257 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07007258 case llvm::Triple::mips64:
7259 case llvm::Triple::mips64el:
7260 if (mips::hasMipsAbiArg(Args, "32")) {
7261 CmdArgs.push_back("-m");
7262 if (getToolChain().getArch() == llvm::Triple::mips64)
7263 CmdArgs.push_back("elf32btsmip");
7264 else
7265 CmdArgs.push_back("elf32ltsmip");
7266 } else if (mips::hasMipsAbiArg(Args, "64")) {
7267 CmdArgs.push_back("-m");
7268 if (getToolChain().getArch() == llvm::Triple::mips64)
7269 CmdArgs.push_back("elf64btsmip");
7270 else
7271 CmdArgs.push_back("elf64ltsmip");
7272 }
7273 break;
Stephen Hines176edba2014-12-01 14:53:08 -08007274 case llvm::Triple::ppc:
7275 CmdArgs.push_back("-m");
7276 CmdArgs.push_back("elf32ppc_nbsd");
7277 break;
7278
7279 case llvm::Triple::ppc64:
7280 case llvm::Triple::ppc64le:
7281 CmdArgs.push_back("-m");
7282 CmdArgs.push_back("elf64ppc");
7283 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07007284
7285 case llvm::Triple::sparc:
7286 CmdArgs.push_back("-m");
7287 CmdArgs.push_back("elf32_sparc");
7288 break;
7289
7290 case llvm::Triple::sparcv9:
7291 CmdArgs.push_back("-m");
7292 CmdArgs.push_back("elf64_sparc");
7293 break;
7294
7295 default:
7296 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007297 }
7298
7299 if (Output.isFilename()) {
7300 CmdArgs.push_back("-o");
7301 CmdArgs.push_back(Output.getFilename());
7302 } else {
7303 assert(Output.isNothing() && "Invalid output.");
7304 }
7305
7306 if (!Args.hasArg(options::OPT_nostdlib) &&
7307 !Args.hasArg(options::OPT_nostartfiles)) {
7308 if (!Args.hasArg(options::OPT_shared)) {
7309 CmdArgs.push_back(Args.MakeArgString(
7310 getToolChain().GetFilePath("crt0.o")));
7311 CmdArgs.push_back(Args.MakeArgString(
7312 getToolChain().GetFilePath("crti.o")));
7313 CmdArgs.push_back(Args.MakeArgString(
7314 getToolChain().GetFilePath("crtbegin.o")));
7315 } else {
7316 CmdArgs.push_back(Args.MakeArgString(
7317 getToolChain().GetFilePath("crti.o")));
7318 CmdArgs.push_back(Args.MakeArgString(
7319 getToolChain().GetFilePath("crtbeginS.o")));
7320 }
7321 }
7322
7323 Args.AddAllArgs(CmdArgs, options::OPT_L);
7324 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7325 Args.AddAllArgs(CmdArgs, options::OPT_e);
7326 Args.AddAllArgs(CmdArgs, options::OPT_s);
7327 Args.AddAllArgs(CmdArgs, options::OPT_t);
7328 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7329 Args.AddAllArgs(CmdArgs, options::OPT_r);
7330
7331 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7332
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00007333 unsigned Major, Minor, Micro;
7334 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7335 bool useLibgcc = true;
Stephen Hines176edba2014-12-01 14:53:08 -08007336 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007337 switch(getToolChain().getArch()) {
Stephen Hines176edba2014-12-01 14:53:08 -08007338 case llvm::Triple::aarch64:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007339 case llvm::Triple::arm:
7340 case llvm::Triple::armeb:
7341 case llvm::Triple::thumb:
7342 case llvm::Triple::thumbeb:
Stephen Hines176edba2014-12-01 14:53:08 -08007343 case llvm::Triple::ppc:
7344 case llvm::Triple::ppc64:
7345 case llvm::Triple::ppc64le:
Stephen Hines651f13c2014-04-23 16:59:28 -07007346 case llvm::Triple::x86:
7347 case llvm::Triple::x86_64:
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00007348 useLibgcc = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07007349 break;
7350 default:
7351 break;
7352 }
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00007353 }
7354
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007355 if (!Args.hasArg(options::OPT_nostdlib) &&
7356 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007357 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007358 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7359 CmdArgs.push_back("-lm");
7360 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007361 if (Args.hasArg(options::OPT_pthread))
7362 CmdArgs.push_back("-lpthread");
7363 CmdArgs.push_back("-lc");
7364
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00007365 if (useLibgcc) {
7366 if (Args.hasArg(options::OPT_static)) {
7367 // libgcc_eh depends on libc, so resolve as much as possible,
7368 // pull in any new requirements from libc and then get the rest
7369 // of libgcc.
7370 CmdArgs.push_back("-lgcc_eh");
7371 CmdArgs.push_back("-lc");
7372 CmdArgs.push_back("-lgcc");
7373 } else {
7374 CmdArgs.push_back("-lgcc");
7375 CmdArgs.push_back("--as-needed");
7376 CmdArgs.push_back("-lgcc_s");
7377 CmdArgs.push_back("--no-as-needed");
7378 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007379 }
7380 }
7381
7382 if (!Args.hasArg(options::OPT_nostdlib) &&
7383 !Args.hasArg(options::OPT_nostartfiles)) {
7384 if (!Args.hasArg(options::OPT_shared))
7385 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7386 "crtend.o")));
7387 else
7388 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7389 "crtendS.o")));
7390 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7391 "crtn.o")));
7392 }
7393
Stephen Hines651f13c2014-04-23 16:59:28 -07007394 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00007395
Stephen Hinesef822542014-07-21 00:47:37 -07007396 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08007397 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00007398}
7399
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00007400void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7401 const InputInfo &Output,
7402 const InputInfoList &Inputs,
7403 const ArgList &Args,
7404 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007405 claimNoWarnArgs(Args);
7406
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007407 ArgStringList CmdArgs;
Stephen Hines651f13c2014-04-23 16:59:28 -07007408 bool NeedsKPIC = false;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007409
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007410 switch (getToolChain().getArch()) {
7411 default:
7412 break;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007413 // Add --32/--64 to make sure we get the format we want.
7414 // This is incomplete
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007415 case llvm::Triple::x86:
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007416 CmdArgs.push_back("--32");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007417 break;
7418 case llvm::Triple::x86_64:
Stephen Hinesef822542014-07-21 00:47:37 -07007419 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7420 CmdArgs.push_back("--x32");
7421 else
7422 CmdArgs.push_back("--64");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007423 break;
7424 case llvm::Triple::ppc:
Eli Friedman7972c882011-11-28 23:46:52 +00007425 CmdArgs.push_back("-a32");
7426 CmdArgs.push_back("-mppc");
7427 CmdArgs.push_back("-many");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007428 break;
7429 case llvm::Triple::ppc64:
Eli Friedman7972c882011-11-28 23:46:52 +00007430 CmdArgs.push_back("-a64");
7431 CmdArgs.push_back("-mppc64");
7432 CmdArgs.push_back("-many");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007433 break;
7434 case llvm::Triple::ppc64le:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00007435 CmdArgs.push_back("-a64");
Stephen Hines651f13c2014-04-23 16:59:28 -07007436 CmdArgs.push_back("-mppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00007437 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07007438 CmdArgs.push_back("-mlittle-endian");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007439 break;
7440 case llvm::Triple::sparc:
Stephen Hines651f13c2014-04-23 16:59:28 -07007441 CmdArgs.push_back("-32");
7442 CmdArgs.push_back("-Av8plusa");
7443 NeedsKPIC = true;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007444 break;
7445 case llvm::Triple::sparcv9:
Stephen Hines651f13c2014-04-23 16:59:28 -07007446 CmdArgs.push_back("-64");
7447 CmdArgs.push_back("-Av9a");
7448 NeedsKPIC = true;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007449 break;
7450 case llvm::Triple::arm:
7451 case llvm::Triple::armeb:
7452 case llvm::Triple::thumb:
7453 case llvm::Triple::thumbeb: {
7454 const llvm::Triple &Triple = getToolChain().getTriple();
7455 switch (Triple.getSubArch()) {
7456 case llvm::Triple::ARMSubArch_v7:
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007457 CmdArgs.push_back("-mfpu=neon");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007458 break;
7459 case llvm::Triple::ARMSubArch_v8:
Bernard Ogden80e90c22013-10-24 18:32:41 +00007460 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007461 break;
7462 default:
7463 break;
7464 }
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00007465
Stephen Hines651f13c2014-04-23 16:59:28 -07007466 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07007467 getToolChain().getDriver(), Args,
7468 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00007469 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00007470
7471 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Stephen Hines651f13c2014-04-23 16:59:28 -07007472
7473 // FIXME: remove krait check when GNU tools support krait cpu
7474 // for now replace it with -march=armv7-a to avoid a lower
7475 // march from being picked in the absence of a cpu flag.
7476 Arg *A;
7477 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7478 StringRef(A->getValue()) == "krait")
7479 CmdArgs.push_back("-march=armv7-a");
7480 else
7481 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00007482 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007483 break;
7484 }
7485 case llvm::Triple::mips:
7486 case llvm::Triple::mipsel:
7487 case llvm::Triple::mips64:
7488 case llvm::Triple::mips64el: {
Simon Atanasyan073a7802012-04-07 22:31:29 +00007489 StringRef CPUName;
7490 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08007491 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
7492 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00007493
Simon Atanasyan073a7802012-04-07 22:31:29 +00007494 CmdArgs.push_back("-march");
7495 CmdArgs.push_back(CPUName.data());
7496
Simon Atanasyan073a7802012-04-07 22:31:29 +00007497 CmdArgs.push_back("-mabi");
Stephen Hines176edba2014-12-01 14:53:08 -08007498 CmdArgs.push_back(ABIName.data());
7499
7500 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7501 // or -mshared (not implemented) is in effect.
7502 bool IsPicOrPie = false;
7503 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7504 options::OPT_fpic, options::OPT_fno_pic,
7505 options::OPT_fPIE, options::OPT_fno_PIE,
7506 options::OPT_fpie, options::OPT_fno_pie)) {
7507 if (A->getOption().matches(options::OPT_fPIC) ||
7508 A->getOption().matches(options::OPT_fpic) ||
7509 A->getOption().matches(options::OPT_fPIE) ||
7510 A->getOption().matches(options::OPT_fpie))
7511 IsPicOrPie = true;
7512 }
7513 if (!IsPicOrPie)
7514 CmdArgs.push_back("-mno-shared");
7515
7516 // LLVM doesn't support -mplt yet and acts as if it is always given.
7517 // However, -mplt has no effect with the N64 ABI.
7518 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00007519
7520 if (getToolChain().getArch() == llvm::Triple::mips ||
7521 getToolChain().getArch() == llvm::Triple::mips64)
7522 CmdArgs.push_back("-EB");
7523 else
7524 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00007525
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00007526 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7527 if (StringRef(A->getValue()) == "2008")
7528 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7529 }
7530
Stephen Hines176edba2014-12-01 14:53:08 -08007531 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7532 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7533 options::OPT_mfp64)) {
7534 A->claim();
7535 A->render(Args, CmdArgs);
7536 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7537 ABIName))
7538 CmdArgs.push_back("-mfpxx");
7539
7540 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7541 // -mno-mips16 is actually -no-mips16.
7542 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7543 options::OPT_mno_mips16)) {
7544 if (A->getOption().matches(options::OPT_mips16)) {
7545 A->claim();
7546 A->render(Args, CmdArgs);
7547 } else {
7548 A->claim();
7549 CmdArgs.push_back("-no-mips16");
7550 }
7551 }
7552
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00007553 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7554 options::OPT_mno_micromips);
7555 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7556 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7557
Daniel Sanders0d5d6ff2013-12-02 10:14:43 +00007558 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7559 // Do not use AddLastArg because not all versions of MIPS assembler
7560 // support -mmsa / -mno-msa options.
7561 if (A->getOption().matches(options::OPT_mmsa))
7562 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7563 }
7564
Stephen Hines176edba2014-12-01 14:53:08 -08007565 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7566 options::OPT_msoft_float);
7567
7568 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7569 options::OPT_mno_odd_spreg);
7570
Stephen Hines651f13c2014-04-23 16:59:28 -07007571 NeedsKPIC = true;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007572 break;
7573 }
7574 case llvm::Triple::systemz: {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00007575 // Always pass an -march option, since our default of z10 is later
7576 // than the GNU assembler's default.
7577 StringRef CPUName = getSystemZTargetCPU(Args);
7578 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007579 break;
7580 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007581 }
7582
Stephen Hines651f13c2014-04-23 16:59:28 -07007583 if (NeedsKPIC)
7584 addAssemblerKPIC(Args, CmdArgs);
7585
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007586 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7587 options::OPT_Xassembler);
7588
7589 CmdArgs.push_back("-o");
7590 CmdArgs.push_back(Output.getFilename());
7591
Stephen Hinesef822542014-07-21 00:47:37 -07007592 for (const auto &II : Inputs)
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007593 CmdArgs.push_back(II.getFilename());
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007594
Stephen Hinesef822542014-07-21 00:47:37 -07007595 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08007596 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00007597
7598 // Handle the debug info splitting at object creation time if we're
7599 // creating an object.
7600 // TODO: Currently only works on linux with newer objcopy.
7601 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00007602 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00007603 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7604 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007605}
7606
Stephen Hines651f13c2014-04-23 16:59:28 -07007607static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007608 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00007609 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00007610 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7611 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00007612 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007613 CmdArgs.push_back("-lgcc");
7614
Logan Chien529a73d2012-11-19 12:04:11 +00007615 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007616 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007617 CmdArgs.push_back("-lgcc");
7618 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007619 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007620 CmdArgs.push_back("--as-needed");
7621 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00007622 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007623 CmdArgs.push_back("--no-as-needed");
7624 }
7625
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007626 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007627 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00007628 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007629 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00007630
7631 // According to Android ABI, we have to link with libdl if we are
7632 // linking with non-static libgcc.
7633 //
7634 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7635 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7636 if (isAndroid && !StaticLibgcc)
7637 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007638}
7639
Stephen Hines176edba2014-12-01 14:53:08 -08007640static std::string getLinuxDynamicLinker(const ArgList &Args,
7641 const toolchains::Linux &ToolChain) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007642 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7643 if (ToolChain.getTriple().isArch64Bit())
7644 return "/system/bin/linker64";
7645 else
7646 return "/system/bin/linker";
7647 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7648 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007649 return "/lib/ld-linux.so.2";
Stephen Hines176edba2014-12-01 14:53:08 -08007650 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007651 return "/lib/ld-linux-aarch64.so.1";
Stephen Hines176edba2014-12-01 14:53:08 -08007652 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Stephen Hines651f13c2014-04-23 16:59:28 -07007653 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007654 else if (ToolChain.getArch() == llvm::Triple::arm ||
7655 ToolChain.getArch() == llvm::Triple::thumb) {
7656 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7657 return "/lib/ld-linux-armhf.so.3";
7658 else
7659 return "/lib/ld-linux.so.3";
Stephen Hines651f13c2014-04-23 16:59:28 -07007660 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7661 ToolChain.getArch() == llvm::Triple::thumbeb) {
7662 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7663 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7664 else
7665 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007666 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Stephen Hines176edba2014-12-01 14:53:08 -08007667 ToolChain.getArch() == llvm::Triple::mipsel ||
7668 ToolChain.getArch() == llvm::Triple::mips64 ||
Stephen Hinesef822542014-07-21 00:47:37 -07007669 ToolChain.getArch() == llvm::Triple::mips64el) {
Stephen Hines176edba2014-12-01 14:53:08 -08007670 StringRef CPUName;
7671 StringRef ABIName;
7672 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7673 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7674
7675 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7676 .Case("o32", "/lib")
7677 .Case("n32", "/lib32")
7678 .Case("n64", "/lib64")
7679 .Default("/lib");
7680 StringRef LibName;
7681 if (mips::isUCLibc(Args))
7682 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7683 else
7684 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
7685
7686 return (LibDir + "/" + LibName).str();
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007687 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7688 return "/lib/ld.so.1";
Stephen Hines176edba2014-12-01 14:53:08 -08007689 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7690 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7691 return "/lib64/ld64.so.2";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007692 return "/lib64/ld64.so.1";
Stephen Hines176edba2014-12-01 14:53:08 -08007693 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7694 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7695 return "/lib64/ld64.so.1";
Stephen Hinesef822542014-07-21 00:47:37 -07007696 return "/lib64/ld64.so.2";
Stephen Hines176edba2014-12-01 14:53:08 -08007697 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7698 return "/lib64/ld64.so.1";
Stephen Hines651f13c2014-04-23 16:59:28 -07007699 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7700 return "/lib64/ld-linux.so.2";
Stephen Hinesef822542014-07-21 00:47:37 -07007701 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7702 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7703 return "/libx32/ld-linux-x32.so.2";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007704 else
7705 return "/lib64/ld-linux-x86-64.so.2";
7706}
7707
Stephen Hines651f13c2014-04-23 16:59:28 -07007708static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007709 ArgStringList &CmdArgs, const ArgList &Args) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007710 // Make use of compiler-rt if --rtlib option is used
7711 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7712
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007713 switch (RLT) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007714 case ToolChain::RLT_CompilerRT:
Stephen Hines176edba2014-12-01 14:53:08 -08007715 switch (TC.getTriple().getOS()) {
7716 default: llvm_unreachable("unsupported OS");
7717 case llvm::Triple::Win32:
Stephen Hines176edba2014-12-01 14:53:08 -08007718 case llvm::Triple::Linux:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007719 addClangRT(TC, Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -08007720 break;
7721 }
Stephen Hines651f13c2014-04-23 16:59:28 -07007722 break;
7723 case ToolChain::RLT_Libgcc:
7724 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7725 break;
7726 }
7727}
7728
Stephen Hines176edba2014-12-01 14:53:08 -08007729static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7730 switch (T.getArch()) {
7731 case llvm::Triple::x86:
7732 return "elf_i386";
7733 case llvm::Triple::aarch64:
7734 return "aarch64linux";
7735 case llvm::Triple::aarch64_be:
7736 return "aarch64_be_linux";
7737 case llvm::Triple::arm:
7738 case llvm::Triple::thumb:
7739 return "armelf_linux_eabi";
7740 case llvm::Triple::armeb:
7741 case llvm::Triple::thumbeb:
7742 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7743 case llvm::Triple::ppc:
7744 return "elf32ppclinux";
7745 case llvm::Triple::ppc64:
7746 return "elf64ppc";
7747 case llvm::Triple::ppc64le:
7748 return "elf64lppc";
7749 case llvm::Triple::sparc:
7750 return "elf32_sparc";
7751 case llvm::Triple::sparcv9:
7752 return "elf64_sparc";
7753 case llvm::Triple::mips:
7754 return "elf32btsmip";
7755 case llvm::Triple::mipsel:
7756 return "elf32ltsmip";
7757 case llvm::Triple::mips64:
7758 if (mips::hasMipsAbiArg(Args, "n32"))
7759 return "elf32btsmipn32";
7760 return "elf64btsmip";
7761 case llvm::Triple::mips64el:
7762 if (mips::hasMipsAbiArg(Args, "n32"))
7763 return "elf32ltsmipn32";
7764 return "elf64ltsmip";
7765 case llvm::Triple::systemz:
7766 return "elf64_s390";
7767 case llvm::Triple::x86_64:
7768 if (T.getEnvironment() == llvm::Triple::GNUX32)
7769 return "elf32_x86_64";
7770 return "elf_x86_64";
7771 default:
7772 llvm_unreachable("Unexpected arch");
7773 }
7774}
7775
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00007776void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7777 const InputInfo &Output,
7778 const InputInfoList &Inputs,
7779 const ArgList &Args,
7780 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00007781 const toolchains::Linux& ToolChain =
7782 static_cast<const toolchains::Linux&>(getToolChain());
7783 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00007784 const bool isAndroid =
7785 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007786 const bool IsPIE =
7787 !Args.hasArg(options::OPT_shared) &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007788 !Args.hasArg(options::OPT_static) &&
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007789 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007790
Rafael Espindolac1da9812010-11-07 20:14:31 +00007791 ArgStringList CmdArgs;
7792
Rafael Espindola26f14c32010-11-15 18:28:16 +00007793 // Silence warning for "clang -g foo.o -o foo"
7794 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00007795 // and "clang -emit-llvm foo.o -o foo"
7796 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00007797 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00007798 // handled somewhere else.
7799 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00007800
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00007801 if (!D.SysRoot.empty())
7802 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007803
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007804 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00007805 CmdArgs.push_back("-pie");
7806
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00007807 if (Args.hasArg(options::OPT_rdynamic))
7808 CmdArgs.push_back("-export-dynamic");
7809
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00007810 if (Args.hasArg(options::OPT_s))
7811 CmdArgs.push_back("-s");
7812
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007813 if (ToolChain.getArch() == llvm::Triple::armeb ||
7814 ToolChain.getArch() == llvm::Triple::thumbeb)
7815 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7816
Stephen Hinesef822542014-07-21 00:47:37 -07007817 for (const auto &Opt : ToolChain.ExtraOpts)
7818 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac1da9812010-11-07 20:14:31 +00007819
7820 if (!Args.hasArg(options::OPT_static)) {
7821 CmdArgs.push_back("--eh-frame-hdr");
7822 }
7823
7824 CmdArgs.push_back("-m");
Stephen Hines176edba2014-12-01 14:53:08 -08007825 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007826
7827 if (Args.hasArg(options::OPT_static)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007828 if (ToolChain.getArch() == llvm::Triple::arm ||
7829 ToolChain.getArch() == llvm::Triple::armeb ||
7830 ToolChain.getArch() == llvm::Triple::thumb ||
7831 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00007832 CmdArgs.push_back("-Bstatic");
7833 else
7834 CmdArgs.push_back("-static");
7835 } else if (Args.hasArg(options::OPT_shared)) {
7836 CmdArgs.push_back("-shared");
7837 }
7838
7839 if (ToolChain.getArch() == llvm::Triple::arm ||
Stephen Hines651f13c2014-04-23 16:59:28 -07007840 ToolChain.getArch() == llvm::Triple::armeb ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00007841 ToolChain.getArch() == llvm::Triple::thumb ||
Stephen Hines651f13c2014-04-23 16:59:28 -07007842 ToolChain.getArch() == llvm::Triple::thumbeb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00007843 (!Args.hasArg(options::OPT_static) &&
7844 !Args.hasArg(options::OPT_shared))) {
7845 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007846 CmdArgs.push_back(Args.MakeArgString(
7847 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007848 }
7849
7850 CmdArgs.push_back("-o");
7851 CmdArgs.push_back(Output.getFilename());
7852
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007853 if (!Args.hasArg(options::OPT_nostdlib) &&
7854 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007855 if (!isAndroid) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007856 const char *crt1 = nullptr;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007857 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00007858 if (Args.hasArg(options::OPT_pg))
7859 crt1 = "gcrt1.o";
7860 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007861 crt1 = "Scrt1.o";
7862 else
7863 crt1 = "crt1.o";
7864 }
7865 if (crt1)
7866 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007867
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007868 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7869 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00007870
Rafael Espindola89414b32010-11-12 03:00:39 +00007871 const char *crtbegin;
7872 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007873 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007874 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007875 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007876 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007877 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00007878 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007879 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00007880 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00007881
7882 // Add crtfastmath.o if available and fast math is enabled.
7883 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00007884 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00007885
7886 Args.AddAllArgs(CmdArgs, options::OPT_L);
Stephen Hinesef822542014-07-21 00:47:37 -07007887 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac1da9812010-11-07 20:14:31 +00007888
Stephen Hines176edba2014-12-01 14:53:08 -08007889 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac1da9812010-11-07 20:14:31 +00007890
Stephen Hinesef822542014-07-21 00:47:37 -07007891 for (const auto &Path : Paths)
7892 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007893
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007894 if (D.IsUsingLTO(getToolChain(), Args))
Stephen Hines651f13c2014-04-23 16:59:28 -07007895 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth700d4e42013-01-13 11:46:33 +00007896
Nick Lewyckye276cfc2012-08-17 03:39:16 +00007897 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7898 CmdArgs.push_back("--no-demangle");
7899
Stephen Hines176edba2014-12-01 14:53:08 -08007900 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac1da9812010-11-07 20:14:31 +00007901 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00007902 // The profile runtime also needs access to system libraries.
Stephen Hines651f13c2014-04-23 16:59:28 -07007903 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00007904
Hans Wennborg76b86c22013-07-18 20:29:38 +00007905 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007906 !Args.hasArg(options::OPT_nostdlib) &&
7907 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00007908 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7909 !Args.hasArg(options::OPT_static);
7910 if (OnlyLibstdcxxStatic)
7911 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00007912 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00007913 if (OnlyLibstdcxxStatic)
7914 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00007915 CmdArgs.push_back("-lm");
7916 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007917 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7918 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac1da9812010-11-07 20:14:31 +00007919
Rafael Espindola89414b32010-11-12 03:00:39 +00007920 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007921 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7922 if (Args.hasArg(options::OPT_static))
7923 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00007924
Stephen Hines176edba2014-12-01 14:53:08 -08007925 if (NeedsSanitizerDeps)
7926 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7927
Stephen Hines651f13c2014-04-23 16:59:28 -07007928 LibOpenMP UsedOpenMPLib = LibUnknown;
7929 if (Args.hasArg(options::OPT_fopenmp)) {
7930 UsedOpenMPLib = LibGOMP;
7931 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7932 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7933 .Case("libgomp", LibGOMP)
7934 .Case("libiomp5", LibIOMP5)
7935 .Default(LibUnknown);
7936 if (UsedOpenMPLib == LibUnknown)
7937 D.Diag(diag::err_drv_unsupported_option_argument)
7938 << A->getOption().getName() << A->getValue();
7939 }
7940 switch (UsedOpenMPLib) {
7941 case LibGOMP:
Chandler Carruthdf96e022013-01-17 13:19:29 +00007942 CmdArgs.push_back("-lgomp");
7943
Stephen Hines651f13c2014-04-23 16:59:28 -07007944 // FIXME: Exclude this for platforms with libgomp that don't require
7945 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruthdf96e022013-01-17 13:19:29 +00007946 CmdArgs.push_back("-lrt");
Stephen Hines651f13c2014-04-23 16:59:28 -07007947 break;
7948 case LibIOMP5:
7949 CmdArgs.push_back("-liomp5");
7950 break;
7951 case LibUnknown:
7952 break;
Chandler Carruthdf96e022013-01-17 13:19:29 +00007953 }
Stephen Hines651f13c2014-04-23 16:59:28 -07007954 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00007955
Stephen Hinesef822542014-07-21 00:47:37 -07007956 if ((Args.hasArg(options::OPT_pthread) ||
7957 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7958 !isAndroid)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007959 CmdArgs.push_back("-lpthread");
7960
7961 CmdArgs.push_back("-lc");
7962
7963 if (Args.hasArg(options::OPT_static))
7964 CmdArgs.push_back("--end-group");
7965 else
Stephen Hines651f13c2014-04-23 16:59:28 -07007966 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007967 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00007968
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007969 if (!Args.hasArg(options::OPT_nostartfiles)) {
7970 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007971 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007972 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007973 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007974 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007975 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007976 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00007977
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007978 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007979 if (!isAndroid)
7980 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007981 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00007982 }
7983
Stephen Hines176edba2014-12-01 14:53:08 -08007984 C.addCommand(
7985 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007986}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007987
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07007988
7989// NaCl ARM assembly (inline or standalone) can be written with a set of macros
7990// for the various SFI requirements like register masking. The assembly tool
7991// inserts the file containing the macros as an input into all the assembly
7992// jobs.
7993void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
7994 const InputInfo &Output,
7995 const InputInfoList &Inputs,
7996 const ArgList &Args,
7997 const char *LinkingOutput) const {
7998 const toolchains::NaCl_TC& ToolChain =
7999 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8000 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8001 "nacl-arm-macros.s");
8002 InputInfoList NewInputs;
8003 NewInputs.push_back(NaClMacros);
8004 NewInputs.append(Inputs.begin(), Inputs.end());
8005 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8006 LinkingOutput);
8007}
8008
8009
8010// This is quite similar to gnutools::link::ConstructJob with changes that
8011// we use static by default, do not yet support sanitizers or LTO, and a few
8012// others. Eventually we can support more of that and hopefully migrate back
8013// to gnutools::link.
8014void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8015 const InputInfo &Output,
8016 const InputInfoList &Inputs,
8017 const ArgList &Args,
8018 const char *LinkingOutput) const {
8019
8020 const toolchains::NaCl_TC& ToolChain =
8021 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8022 const Driver &D = ToolChain.getDriver();
8023 const bool IsStatic =
8024 !Args.hasArg(options::OPT_dynamic) &&
8025 !Args.hasArg(options::OPT_shared);
8026
8027 ArgStringList CmdArgs;
8028
8029 // Silence warning for "clang -g foo.o -o foo"
8030 Args.ClaimAllArgs(options::OPT_g_Group);
8031 // and "clang -emit-llvm foo.o -o foo"
8032 Args.ClaimAllArgs(options::OPT_emit_llvm);
8033 // and for "clang -w foo.o -o foo". Other warning options are already
8034 // handled somewhere else.
8035 Args.ClaimAllArgs(options::OPT_w);
8036
8037 if (!D.SysRoot.empty())
8038 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8039
8040 if (Args.hasArg(options::OPT_rdynamic))
8041 CmdArgs.push_back("-export-dynamic");
8042
8043 if (Args.hasArg(options::OPT_s))
8044 CmdArgs.push_back("-s");
8045
8046 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8047 // there is --build-id, which we do want.
8048 CmdArgs.push_back("--build-id");
8049
8050 if (!IsStatic)
8051 CmdArgs.push_back("--eh-frame-hdr");
8052
8053 CmdArgs.push_back("-m");
8054 if (ToolChain.getArch() == llvm::Triple::x86)
8055 CmdArgs.push_back("elf_i386_nacl");
8056 else if (ToolChain.getArch() == llvm::Triple::arm)
8057 CmdArgs.push_back("armelf_nacl");
8058 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8059 CmdArgs.push_back("elf_x86_64_nacl");
8060 else
8061 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8062 "Native Client";
8063
8064
8065 if (IsStatic)
8066 CmdArgs.push_back("-static");
8067 else if (Args.hasArg(options::OPT_shared))
8068 CmdArgs.push_back("-shared");
8069
8070 CmdArgs.push_back("-o");
8071 CmdArgs.push_back(Output.getFilename());
8072 if (!Args.hasArg(options::OPT_nostdlib) &&
8073 !Args.hasArg(options::OPT_nostartfiles)) {
8074 if (!Args.hasArg(options::OPT_shared))
8075 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8076 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8077
8078 const char *crtbegin;
8079 if (IsStatic)
8080 crtbegin = "crtbeginT.o";
8081 else if (Args.hasArg(options::OPT_shared))
8082 crtbegin = "crtbeginS.o";
8083 else
8084 crtbegin = "crtbegin.o";
8085 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8086 }
8087
8088 Args.AddAllArgs(CmdArgs, options::OPT_L);
8089 Args.AddAllArgs(CmdArgs, options::OPT_u);
8090
8091 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8092
8093 for (const auto &Path : Paths)
8094 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8095
8096 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8097 CmdArgs.push_back("--no-demangle");
8098
8099 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8100
8101 if (D.CCCIsCXX() &&
8102 !Args.hasArg(options::OPT_nostdlib) &&
8103 !Args.hasArg(options::OPT_nodefaultlibs)) {
8104 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8105 !IsStatic;
8106 if (OnlyLibstdcxxStatic)
8107 CmdArgs.push_back("-Bstatic");
8108 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8109 if (OnlyLibstdcxxStatic)
8110 CmdArgs.push_back("-Bdynamic");
8111 CmdArgs.push_back("-lm");
8112 }
8113
8114 if (!Args.hasArg(options::OPT_nostdlib)) {
8115 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8116 // Always use groups, since it has no effect on dynamic libraries.
8117 CmdArgs.push_back("--start-group");
8118 CmdArgs.push_back("-lc");
8119 // NaCl's libc++ currently requires libpthread, so just always include it
8120 // in the group for C++.
8121 if (Args.hasArg(options::OPT_pthread) ||
8122 Args.hasArg(options::OPT_pthreads) ||
8123 D.CCCIsCXX()) {
8124 CmdArgs.push_back("-lpthread");
8125 }
8126
8127 CmdArgs.push_back("-lgcc");
8128 CmdArgs.push_back("--as-needed");
8129 if (IsStatic)
8130 CmdArgs.push_back("-lgcc_eh");
8131 else
8132 CmdArgs.push_back("-lgcc_s");
8133 CmdArgs.push_back("--no-as-needed");
8134 CmdArgs.push_back("--end-group");
8135 }
8136
8137 if (!Args.hasArg(options::OPT_nostartfiles)) {
8138 const char *crtend;
8139 if (Args.hasArg(options::OPT_shared))
8140 crtend = "crtendS.o";
8141 else
8142 crtend = "crtend.o";
8143
8144 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8145 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8146 }
8147 }
8148
8149 C.addCommand(llvm::make_unique<Command>(JA, *this,
8150 ToolChain.Linker.c_str(), CmdArgs));
8151}
8152
8153
Chris Lattner38e317d2010-07-07 16:01:42 +00008154void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00008155 const InputInfo &Output,
8156 const InputInfoList &Inputs,
8157 const ArgList &Args,
8158 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008159 claimNoWarnArgs(Args);
Chris Lattner38e317d2010-07-07 16:01:42 +00008160 ArgStringList CmdArgs;
8161
Stephen Hinesef822542014-07-21 00:47:37 -07008162 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner38e317d2010-07-07 16:01:42 +00008163
8164 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008165 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00008166
Stephen Hinesef822542014-07-21 00:47:37 -07008167 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008168 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00008169
Stephen Hinesef822542014-07-21 00:47:37 -07008170 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08008171 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00008172}
8173
8174void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00008175 const InputInfo &Output,
8176 const InputInfoList &Inputs,
8177 const ArgList &Args,
8178 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00008179 const Driver &D = getToolChain().getDriver();
8180 ArgStringList CmdArgs;
8181
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008182 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00008183 CmdArgs.push_back("-o");
8184 CmdArgs.push_back(Output.getFilename());
8185 } else {
8186 assert(Output.isNothing() && "Invalid output.");
8187 }
8188
8189 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00008190 !Args.hasArg(options::OPT_nostartfiles)) {
8191 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8192 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8193 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8194 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8195 }
Chris Lattner38e317d2010-07-07 16:01:42 +00008196
8197 Args.AddAllArgs(CmdArgs, options::OPT_L);
8198 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8199 Args.AddAllArgs(CmdArgs, options::OPT_e);
8200
Daniel Dunbar2008fee2010-09-17 00:24:54 +00008201 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00008202
Stephen Hines651f13c2014-04-23 16:59:28 -07008203 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman6d402dc2011-12-08 23:54:21 +00008204
Chris Lattner38e317d2010-07-07 16:01:42 +00008205 if (!Args.hasArg(options::OPT_nostdlib) &&
8206 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00008207 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00008208 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00008209 CmdArgs.push_back("-lm");
8210 }
Chris Lattner38e317d2010-07-07 16:01:42 +00008211 }
8212
8213 if (!Args.hasArg(options::OPT_nostdlib) &&
8214 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00008215 if (Args.hasArg(options::OPT_pthread))
8216 CmdArgs.push_back("-lpthread");
8217 CmdArgs.push_back("-lc");
8218 CmdArgs.push_back("-lCompilerRT-Generic");
8219 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8220 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00008221 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00008222 }
8223
Stephen Hinesef822542014-07-21 00:47:37 -07008224 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08008225 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00008226}
8227
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008228/// DragonFly Tools
8229
8230// For now, DragonFly Assemble does just about the same as for
8231// FreeBSD, but this may change soon.
8232void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00008233 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00008234 const InputInfoList &Inputs,
8235 const ArgList &Args,
8236 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008237 claimNoWarnArgs(Args);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008238 ArgStringList CmdArgs;
8239
8240 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8241 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00008242 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008243 CmdArgs.push_back("--32");
8244
Stephen Hinesef822542014-07-21 00:47:37 -07008245 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008246
8247 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008248 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008249
Stephen Hinesef822542014-07-21 00:47:37 -07008250 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008251 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008252
Stephen Hinesef822542014-07-21 00:47:37 -07008253 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Stephen Hines176edba2014-12-01 14:53:08 -08008254 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008255}
8256
8257void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00008258 const InputInfo &Output,
8259 const InputInfoList &Inputs,
8260 const ArgList &Args,
8261 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00008262 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008263 ArgStringList CmdArgs;
Stephen Hines176edba2014-12-01 14:53:08 -08008264 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall8cfb7202013-04-11 22:55:55 +00008265
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00008266 if (!D.SysRoot.empty())
8267 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8268
John McCall8cfb7202013-04-11 22:55:55 +00008269 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008270 if (Args.hasArg(options::OPT_static)) {
8271 CmdArgs.push_back("-Bstatic");
8272 } else {
John McCall8cfb7202013-04-11 22:55:55 +00008273 if (Args.hasArg(options::OPT_rdynamic))
8274 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008275 if (Args.hasArg(options::OPT_shared))
8276 CmdArgs.push_back("-Bshareable");
8277 else {
8278 CmdArgs.push_back("-dynamic-linker");
8279 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8280 }
John McCall8cfb7202013-04-11 22:55:55 +00008281 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008282 }
8283
8284 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8285 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00008286 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008287 CmdArgs.push_back("-m");
8288 CmdArgs.push_back("elf_i386");
8289 }
8290
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008291 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008292 CmdArgs.push_back("-o");
8293 CmdArgs.push_back(Output.getFilename());
8294 } else {
8295 assert(Output.isNothing() && "Invalid output.");
8296 }
8297
8298 if (!Args.hasArg(options::OPT_nostdlib) &&
8299 !Args.hasArg(options::OPT_nostartfiles)) {
8300 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00008301 if (Args.hasArg(options::OPT_pg))
8302 CmdArgs.push_back(Args.MakeArgString(
8303 getToolChain().GetFilePath("gcrt1.o")));
8304 else {
8305 if (Args.hasArg(options::OPT_pie))
8306 CmdArgs.push_back(Args.MakeArgString(
8307 getToolChain().GetFilePath("Scrt1.o")));
8308 else
8309 CmdArgs.push_back(Args.MakeArgString(
8310 getToolChain().GetFilePath("crt1.o")));
8311 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008312 }
John McCall8cfb7202013-04-11 22:55:55 +00008313 CmdArgs.push_back(Args.MakeArgString(
8314 getToolChain().GetFilePath("crti.o")));
8315 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8316 CmdArgs.push_back(Args.MakeArgString(
8317 getToolChain().GetFilePath("crtbeginS.o")));
8318 else
8319 CmdArgs.push_back(Args.MakeArgString(
8320 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008321 }
8322
8323 Args.AddAllArgs(CmdArgs, options::OPT_L);
8324 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8325 Args.AddAllArgs(CmdArgs, options::OPT_e);
8326
Daniel Dunbar2008fee2010-09-17 00:24:54 +00008327 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008328
8329 if (!Args.hasArg(options::OPT_nostdlib) &&
8330 !Args.hasArg(options::OPT_nodefaultlibs)) {
8331 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8332 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00008333 if (UseGCC47)
8334 CmdArgs.push_back("-L/usr/lib/gcc47");
8335 else
8336 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008337
8338 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00008339 if (UseGCC47) {
8340 CmdArgs.push_back("-rpath");
8341 CmdArgs.push_back("/usr/lib/gcc47");
8342 } else {
8343 CmdArgs.push_back("-rpath");
8344 CmdArgs.push_back("/usr/lib/gcc44");
8345 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008346 }
8347
Hans Wennborg76b86c22013-07-18 20:29:38 +00008348 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00008349 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00008350 CmdArgs.push_back("-lm");
8351 }
8352
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008353 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00008354 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008355
8356 if (!Args.hasArg(options::OPT_nolibc)) {
8357 CmdArgs.push_back("-lc");
8358 }
8359
John McCall8cfb7202013-04-11 22:55:55 +00008360 if (UseGCC47) {
8361 if (Args.hasArg(options::OPT_static) ||
8362 Args.hasArg(options::OPT_static_libgcc)) {
8363 CmdArgs.push_back("-lgcc");
8364 CmdArgs.push_back("-lgcc_eh");
8365 } else {
8366 if (Args.hasArg(options::OPT_shared_libgcc)) {
8367 CmdArgs.push_back("-lgcc_pic");
8368 if (!Args.hasArg(options::OPT_shared))
8369 CmdArgs.push_back("-lgcc");
8370 } else {
8371 CmdArgs.push_back("-lgcc");
8372 CmdArgs.push_back("--as-needed");
8373 CmdArgs.push_back("-lgcc_pic");
8374 CmdArgs.push_back("--no-as-needed");
8375 }
8376 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008377 } else {
John McCall8cfb7202013-04-11 22:55:55 +00008378 if (Args.hasArg(options::OPT_shared)) {
8379 CmdArgs.push_back("-lgcc_pic");
8380 } else {
8381 CmdArgs.push_back("-lgcc");
8382 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008383 }
8384 }
8385
8386 if (!Args.hasArg(options::OPT_nostdlib) &&
8387 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00008388 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00008389 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00008390 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00008391 else
8392 CmdArgs.push_back(Args.MakeArgString(
8393 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00008394 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00008395 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008396 }
8397
Stephen Hines651f13c2014-04-23 16:59:28 -07008398 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00008399
Stephen Hinesef822542014-07-21 00:47:37 -07008400 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08008401 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008402}
Michael J. Spencerff58e362010-08-21 21:55:07 +00008403
Stephen Hines176edba2014-12-01 14:53:08 -08008404// Try to find Exe from a Visual Studio distribution. This first tries to find
8405// an installed copy of Visual Studio and, failing that, looks in the PATH,
8406// making sure that whatever executable that's found is not a same-named exe
8407// from clang itself to prevent clang from falling back to itself.
8408static std::string FindVisualStudioExecutable(const ToolChain &TC,
8409 const char *Exe,
8410 const char *ClangProgramPath) {
8411 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8412 std::string visualStudioBinDir;
8413 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8414 visualStudioBinDir)) {
8415 SmallString<128> FilePath(visualStudioBinDir);
8416 llvm::sys::path::append(FilePath, Exe);
8417 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8418 return FilePath.str();
8419 }
8420
8421 return Exe;
8422}
8423
Michael J. Spencerff58e362010-08-21 21:55:07 +00008424void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8425 const InputInfo &Output,
8426 const InputInfoList &Inputs,
8427 const ArgList &Args,
8428 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00008429 ArgStringList CmdArgs;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008430 const ToolChain &TC = getToolChain();
Michael J. Spencerff58e362010-08-21 21:55:07 +00008431
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008432 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8433 if (Output.isFilename())
Daniel Dunbare5a37f42010-09-17 00:45:02 +00008434 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8435 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00008436
8437 if (!Args.hasArg(options::OPT_nostdlib) &&
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008438 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerff58e362010-08-21 21:55:07 +00008439 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerff58e362010-08-21 21:55:07 +00008440
Stephen Hines176edba2014-12-01 14:53:08 -08008441 if (!llvm::sys::Process::GetEnv("LIB")) {
8442 // If the VC environment hasn't been configured (perhaps because the user
8443 // did not run vcvarsall), try to build a consistent link environment. If
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008444 // the environment variable is set however, assume the user knows what
8445 // they're doing.
Stephen Hines176edba2014-12-01 14:53:08 -08008446 std::string VisualStudioDir;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008447 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Stephen Hines176edba2014-12-01 14:53:08 -08008448 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8449 SmallString<128> LibDir(VisualStudioDir);
8450 llvm::sys::path::append(LibDir, "VC", "lib");
8451 switch (MSVC.getArch()) {
8452 case llvm::Triple::x86:
8453 // x86 just puts the libraries directly in lib
8454 break;
8455 case llvm::Triple::x86_64:
8456 llvm::sys::path::append(LibDir, "amd64");
8457 break;
8458 case llvm::Triple::arm:
8459 llvm::sys::path::append(LibDir, "arm");
8460 break;
8461 default:
8462 break;
8463 }
8464 CmdArgs.push_back(
8465 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8466 }
8467
8468 std::string WindowsSdkLibPath;
8469 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8470 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8471 WindowsSdkLibPath.c_str()));
8472 }
8473
Michael J. Spencerff58e362010-08-21 21:55:07 +00008474 CmdArgs.push_back("-nologo");
8475
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008476 if (Args.hasArg(options::OPT_g_Group))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008477 CmdArgs.push_back("-debug");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008478
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008479 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8480 options::OPT__SLASH_LDd,
8481 options::OPT_shared);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00008482 if (DLL) {
8483 CmdArgs.push_back(Args.MakeArgString("-dll"));
8484
8485 SmallString<128> ImplibName(Output.getFilename());
8486 llvm::sys::path::replace_extension(ImplibName, "lib");
8487 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008488 ImplibName));
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00008489 }
8490
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008491 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00008492 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00008493 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Stephen Hines176edba2014-12-01 14:53:08 -08008494 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008495 static const char *CompilerRTComponents[] = {
8496 "asan_dynamic",
8497 "asan_dynamic_runtime_thunk",
8498 };
8499 for (const auto &Component : CompilerRTComponents)
8500 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Stephen Hines176edba2014-12-01 14:53:08 -08008501 // Make sure the dynamic runtime thunk is not optimized out at link time
8502 // to ensure proper SEH handling.
8503 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
8504 } else if (DLL) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008505 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008506 } else {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008507 static const char *CompilerRTComponents[] = {
8508 "asan",
8509 "asan_cxx",
8510 };
8511 for (const auto &Component : CompilerRTComponents)
8512 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008513 }
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00008514 }
8515
Hans Wennborg5db95272013-08-13 23:38:57 +00008516 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00008517
Stephen Hines176edba2014-12-01 14:53:08 -08008518 // Add filenames, libraries, and other linker inputs.
8519 for (const auto &Input : Inputs) {
8520 if (Input.isFilename()) {
Stephen Hinesef822542014-07-21 00:47:37 -07008521 CmdArgs.push_back(Input.getFilename());
Stephen Hines176edba2014-12-01 14:53:08 -08008522 continue;
8523 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00008524
Stephen Hines176edba2014-12-01 14:53:08 -08008525 const Arg &A = Input.getInputArg();
8526
8527 // Render -l options differently for the MSVC linker.
8528 if (A.getOption().matches(options::OPT_l)) {
8529 StringRef Lib = A.getValue();
8530 const char *LinkLibArg;
8531 if (Lib.endswith(".lib"))
8532 LinkLibArg = Args.MakeArgString(Lib);
8533 else
8534 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8535 CmdArgs.push_back(LinkLibArg);
8536 continue;
8537 }
8538
8539 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8540 // or -L. Render it, even if MSVC doesn't understand it.
8541 A.renderAsInput(Args, CmdArgs);
8542 }
8543
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008544 // We need to special case some linker paths. In the case of lld, we need to
8545 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8546 // linker, we need to use a special search algorithm.
8547 llvm::SmallString<128> linkPath;
8548 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8549 if (Linker.equals_lower("lld"))
8550 Linker = "lld-link";
8551
8552 if (Linker.equals_lower("link")) {
8553 // If we're using the MSVC linker, it's not sufficient to just use link
8554 // from the program PATH, because other environments like GnuWin32 install
8555 // their own link.exe which may come first.
8556 linkPath = FindVisualStudioExecutable(TC, "link.exe",
8557 C.getDriver().getClangProgramPath());
8558 } else {
8559 linkPath = Linker;
8560 llvm::sys::path::replace_extension(linkPath, "exe");
8561 linkPath = TC.GetProgramPath(linkPath.c_str());
8562 }
8563
Stephen Hines176edba2014-12-01 14:53:08 -08008564 const char *Exec = Args.MakeArgString(linkPath);
8565 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerff58e362010-08-21 21:55:07 +00008566}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008567
8568void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8569 const InputInfo &Output,
8570 const InputInfoList &Inputs,
8571 const ArgList &Args,
8572 const char *LinkingOutput) const {
8573 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8574}
8575
Stephen Hines176edba2014-12-01 14:53:08 -08008576std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8577 Compilation &C, const JobAction &JA, const InputInfo &Output,
8578 const InputInfoList &Inputs, const ArgList &Args,
8579 const char *LinkingOutput) const {
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008580 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00008581 CmdArgs.push_back("/nologo");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008582 CmdArgs.push_back("/c"); // Compile only.
8583 CmdArgs.push_back("/W0"); // No warnings.
8584
8585 // The goal is to be able to invoke this tool correctly based on
8586 // any flag accepted by clang-cl.
8587
8588 // These are spelled the same way in clang and cl.exe,.
8589 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8590 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborga8ffc162013-09-24 18:17:21 +00008591
8592 // Optimization level.
8593 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8594 if (A->getOption().getID() == options::OPT_O0) {
8595 CmdArgs.push_back("/Od");
8596 } else {
8597 StringRef OptLevel = A->getValue();
8598 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8599 A->render(Args, CmdArgs);
8600 else if (OptLevel == "3")
8601 CmdArgs.push_back("/Ox");
8602 }
8603 }
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008604
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008605 // Flags for which clang-cl has an alias.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008606 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8607
Stephen Hinesef822542014-07-21 00:47:37 -07008608 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8609 /*default=*/false))
8610 CmdArgs.push_back("/GR-");
Stephen Hines651f13c2014-04-23 16:59:28 -07008611 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8612 options::OPT_fno_function_sections))
8613 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8614 ? "/Gy"
8615 : "/Gy-");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008616 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8617 options::OPT_fno_data_sections))
8618 CmdArgs.push_back(
8619 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008620 if (Args.hasArg(options::OPT_fsyntax_only))
8621 CmdArgs.push_back("/Zs");
Stephen Hines651f13c2014-04-23 16:59:28 -07008622 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8623 CmdArgs.push_back("/Z7");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008624
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008625 std::vector<std::string> Includes =
8626 Args.getAllArgValues(options::OPT_include);
Stephen Hinesef822542014-07-21 00:47:37 -07008627 for (const auto &Include : Includes)
8628 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg4fe475a2013-09-27 17:54:18 +00008629
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008630 // Flags that can simply be passed through.
8631 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8632 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Stephen Hinesef822542014-07-21 00:47:37 -07008633 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008634
8635 // The order of these flags is relevant, so pick the last one.
8636 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8637 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8638 A->render(Args, CmdArgs);
8639
8640
8641 // Input filename.
8642 assert(Inputs.size() == 1);
8643 const InputInfo &II = Inputs[0];
8644 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8645 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8646 if (II.isFilename())
8647 CmdArgs.push_back(II.getFilename());
8648 else
8649 II.getInputArg().renderAsInput(Args, CmdArgs);
8650
8651 // Output filename.
8652 assert(Output.getType() == types::TY_Object);
8653 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8654 Output.getFilename());
8655 CmdArgs.push_back(Fo);
8656
Hans Wennborgdc40bf92013-09-20 18:16:35 +00008657 const Driver &D = getToolChain().getDriver();
Stephen Hines176edba2014-12-01 14:53:08 -08008658 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8659 D.getClangProgramPath());
8660 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8661 CmdArgs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00008662}
Robert Lytton4e490e22013-10-11 10:29:40 +00008663
8664
8665/// XCore Tools
8666// We pass assemble and link construction to the xcc tool.
8667
8668void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8669 const InputInfo &Output,
8670 const InputInfoList &Inputs,
8671 const ArgList &Args,
8672 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008673 claimNoWarnArgs(Args);
Robert Lytton4e490e22013-10-11 10:29:40 +00008674 ArgStringList CmdArgs;
8675
8676 CmdArgs.push_back("-o");
8677 CmdArgs.push_back(Output.getFilename());
8678
8679 CmdArgs.push_back("-c");
8680
Stephen Hines651f13c2014-04-23 16:59:28 -07008681 if (Args.hasArg(options::OPT_v))
8682 CmdArgs.push_back("-v");
8683
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008684 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8685 if (!A->getOption().matches(options::OPT_g0))
8686 CmdArgs.push_back("-g");
Stephen Hines651f13c2014-04-23 16:59:28 -07008687
8688 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8689 false))
8690 CmdArgs.push_back("-fverbose-asm");
Robert Lytton4e490e22013-10-11 10:29:40 +00008691
8692 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8693 options::OPT_Xassembler);
8694
Stephen Hinesef822542014-07-21 00:47:37 -07008695 for (const auto &II : Inputs)
Robert Lytton4e490e22013-10-11 10:29:40 +00008696 CmdArgs.push_back(II.getFilename());
Robert Lytton4e490e22013-10-11 10:29:40 +00008697
Stephen Hinesef822542014-07-21 00:47:37 -07008698 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Stephen Hines176edba2014-12-01 14:53:08 -08008699 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lytton4e490e22013-10-11 10:29:40 +00008700}
8701
8702void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8703 const InputInfo &Output,
8704 const InputInfoList &Inputs,
8705 const ArgList &Args,
8706 const char *LinkingOutput) const {
8707 ArgStringList CmdArgs;
8708
8709 if (Output.isFilename()) {
8710 CmdArgs.push_back("-o");
8711 CmdArgs.push_back(Output.getFilename());
8712 } else {
8713 assert(Output.isNothing() && "Invalid output.");
8714 }
8715
Stephen Hines651f13c2014-04-23 16:59:28 -07008716 if (Args.hasArg(options::OPT_v))
8717 CmdArgs.push_back("-v");
8718
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008719 if (exceptionSettings(Args, getToolChain().getTriple()))
Stephen Hines651f13c2014-04-23 16:59:28 -07008720 CmdArgs.push_back("-fexceptions");
8721
Robert Lytton4e490e22013-10-11 10:29:40 +00008722 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8723
Stephen Hinesef822542014-07-21 00:47:37 -07008724 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Stephen Hines176edba2014-12-01 14:53:08 -08008725 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lytton4e490e22013-10-11 10:29:40 +00008726}
Stephen Hines176edba2014-12-01 14:53:08 -08008727
8728void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8729 const InputInfo &Output,
8730 const InputInfoList &Inputs,
8731 const ArgList &Args,
8732 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008733 claimNoWarnArgs(Args);
Stephen Hines176edba2014-12-01 14:53:08 -08008734 const auto &TC =
8735 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8736 ArgStringList CmdArgs;
8737 const char *Exec;
8738
8739 switch (TC.getArch()) {
8740 default: llvm_unreachable("unsupported architecture");
8741 case llvm::Triple::arm:
8742 case llvm::Triple::thumb:
8743 break;
8744 case llvm::Triple::x86:
8745 CmdArgs.push_back("--32");
8746 break;
8747 case llvm::Triple::x86_64:
8748 CmdArgs.push_back("--64");
8749 break;
8750 }
8751
8752 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8753
8754 CmdArgs.push_back("-o");
8755 CmdArgs.push_back(Output.getFilename());
8756
8757 for (const auto &Input : Inputs)
8758 CmdArgs.push_back(Input.getFilename());
8759
8760 const std::string Assembler = TC.GetProgramPath("as");
8761 Exec = Args.MakeArgString(Assembler);
8762
8763 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8764}
8765
8766void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8767 const InputInfo &Output,
8768 const InputInfoList &Inputs,
8769 const ArgList &Args,
8770 const char *LinkingOutput) const {
8771 const auto &TC =
8772 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8773 const llvm::Triple &T = TC.getTriple();
8774 const Driver &D = TC.getDriver();
8775 SmallString<128> EntryPoint;
8776 ArgStringList CmdArgs;
8777 const char *Exec;
8778
8779 // Silence warning for "clang -g foo.o -o foo"
8780 Args.ClaimAllArgs(options::OPT_g_Group);
8781 // and "clang -emit-llvm foo.o -o foo"
8782 Args.ClaimAllArgs(options::OPT_emit_llvm);
8783 // and for "clang -w foo.o -o foo"
8784 Args.ClaimAllArgs(options::OPT_w);
8785 // Other warning options are already handled somewhere else.
8786
8787 if (!D.SysRoot.empty())
8788 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8789
8790 if (Args.hasArg(options::OPT_pie))
8791 CmdArgs.push_back("-pie");
8792 if (Args.hasArg(options::OPT_rdynamic))
8793 CmdArgs.push_back("-export-dynamic");
8794 if (Args.hasArg(options::OPT_s))
8795 CmdArgs.push_back("--strip-all");
8796
8797 CmdArgs.push_back("-m");
8798 switch (TC.getArch()) {
8799 default: llvm_unreachable("unsupported architecture");
8800 case llvm::Triple::arm:
8801 case llvm::Triple::thumb:
8802 // FIXME: this is incorrect for WinCE
8803 CmdArgs.push_back("thumb2pe");
8804 break;
8805 case llvm::Triple::x86:
8806 CmdArgs.push_back("i386pe");
8807 EntryPoint.append("_");
8808 break;
8809 case llvm::Triple::x86_64:
8810 CmdArgs.push_back("i386pep");
8811 break;
8812 }
8813
8814 if (Args.hasArg(options::OPT_shared)) {
8815 switch (T.getArch()) {
8816 default: llvm_unreachable("unsupported architecture");
8817 case llvm::Triple::arm:
8818 case llvm::Triple::thumb:
8819 case llvm::Triple::x86_64:
8820 EntryPoint.append("_DllMainCRTStartup");
8821 break;
8822 case llvm::Triple::x86:
8823 EntryPoint.append("_DllMainCRTStartup@12");
8824 break;
8825 }
8826
8827 CmdArgs.push_back("-shared");
8828 CmdArgs.push_back("-Bdynamic");
8829
8830 CmdArgs.push_back("--enable-auto-image-base");
8831
8832 CmdArgs.push_back("--entry");
8833 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8834 } else {
8835 EntryPoint.append("mainCRTStartup");
8836
8837 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8838 : "-Bdynamic");
8839
8840 if (!Args.hasArg(options::OPT_nostdlib) &&
8841 !Args.hasArg(options::OPT_nostartfiles)) {
8842 CmdArgs.push_back("--entry");
8843 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8844 }
8845
8846 // FIXME: handle subsystem
8847 }
8848
8849 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
8850 CmdArgs.push_back("--allow-multiple-definition");
8851
8852 CmdArgs.push_back("-o");
8853 CmdArgs.push_back(Output.getFilename());
8854
8855 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8856 SmallString<261> ImpLib(Output.getFilename());
8857 llvm::sys::path::replace_extension(ImpLib, ".lib");
8858
8859 CmdArgs.push_back("--out-implib");
8860 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8861 }
8862
8863 if (!Args.hasArg(options::OPT_nostdlib) &&
8864 !Args.hasArg(options::OPT_nostartfiles)) {
8865 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8866 const char *CRTBegin;
8867
8868 CRTBegin =
8869 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8870 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8871 }
8872
8873 Args.AddAllArgs(CmdArgs, options::OPT_L);
8874
8875 const auto &Paths = TC.getFilePaths();
8876 for (const auto &Path : Paths)
8877 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8878
8879 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8880
8881 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8882 !Args.hasArg(options::OPT_nodefaultlibs)) {
8883 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8884 !Args.hasArg(options::OPT_static);
8885 if (StaticCXX)
8886 CmdArgs.push_back("-Bstatic");
8887 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8888 if (StaticCXX)
8889 CmdArgs.push_back("-Bdynamic");
8890 }
8891
8892 if (!Args.hasArg(options::OPT_nostdlib)) {
8893 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8894 // TODO handle /MT[d] /MD[d]
8895 CmdArgs.push_back("-lmsvcrt");
8896 AddRunTimeLibs(TC, D, CmdArgs, Args);
8897 }
8898 }
8899
8900 const std::string Linker = TC.GetProgramPath("ld");
8901 Exec = Args.MakeArgString(Linker);
8902
8903 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8904}