blob: f1a9f41d5396ddf59c6bc248b7afa39c39460e31 [file] [log] [blame]
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
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"
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080035#include "llvm/Support/CodeGen.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070036#include "llvm/Support/Compression.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070042#include "llvm/Support/Program.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080044#include "llvm/Support/TargetParser.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000045
Stephen Hines0e2c34f2015-03-23 12:09:02 -070046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000052using namespace clang;
Reid Klecknerb1e25a12013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000054
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070099 .Case("leon2", "-Av8")
100 .Case("at697e", "-Av8")
101 .Case("at697f", "-Av8")
102 .Case("leon3", "-Av8")
103 .Case("ut699", "-Av8")
104 .Case("gr712rc", "-Av8")
105 .Case("leon4", "-Av8")
106 .Case("gr740", "-Av8")
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800107 .Default("-Av8");
Stephen Hines651f13c2014-04-23 16:59:28 -0700108 }
109}
110
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000111/// CheckPreprocessingOptions - Perform some validation of preprocessing
112/// arguments that is shared with gcc.
113static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Stephen Hinesef822542014-07-21 00:47:37 -0700114 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
115 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
116 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000117 D.Diag(diag::err_drv_argument_only_allowed_with)
Stephen Hinesef822542014-07-21 00:47:37 -0700118 << A->getBaseArg().getAsString(Args)
119 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
120 }
121 }
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000122}
123
Daniel Dunbare2fd6642009-09-10 01:21:12 +0000124/// CheckCodeGenerationOptions - Perform some validation of code generation
125/// arguments that is shared with gcc.
126static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
127 // In gcc, only ARM checks this, but it seems reasonable to check universally.
128 if (Args.hasArg(options::OPT_static))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800129 if (const Arg *A =
130 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
131 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
132 << "-static";
Daniel Dunbare2fd6642009-09-10 01:21:12 +0000133}
134
Stephen Hines176edba2014-12-01 14:53:08 -0800135// Add backslashes to escape spaces and other backslashes.
136// This is used for the space-separated argument list specified with
137// the -dwarf-debug-flags option.
138static void EscapeSpacesAndBackslashes(const char *Arg,
139 SmallVectorImpl<char> &Res) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800140 for (; *Arg; ++Arg) {
Stephen Hines176edba2014-12-01 14:53:08 -0800141 switch (*Arg) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800142 default:
143 break;
Stephen Hines176edba2014-12-01 14:53:08 -0800144 case ' ':
145 case '\\':
146 Res.push_back('\\');
147 break;
148 }
149 Res.push_back(*Arg);
150 }
151}
152
Chris Lattner3edbeb72010-03-29 17:55:58 +0000153// Quote target names for inclusion in GNU Make dependency files.
154// Only the characters '$', '#', ' ', '\t' are quoted.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800155static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000156 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
157 switch (Target[i]) {
158 case ' ':
159 case '\t':
160 // Escape the preceding backslashes
161 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
162 Res.push_back('\\');
163
164 // Escape the space/tab
165 Res.push_back('\\');
166 break;
167 case '$':
168 Res.push_back('$');
169 break;
170 case '#':
171 Res.push_back('\\');
172 break;
173 default:
174 break;
175 }
176
177 Res.push_back(Target[i]);
178 }
179}
180
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800181static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
182 const char *ArgName, const char *EnvVar) {
Bill Wendling3d717152012-03-12 22:10:06 +0000183 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000184 bool CombinedArg = false;
185
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000186 if (!DirList)
187 return; // Nothing to do.
188
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000189 StringRef Name(ArgName);
190 if (Name.equals("-I") || Name.equals("-L"))
191 CombinedArg = true;
192
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000193 StringRef Dirs(DirList);
194 if (Dirs.empty()) // Empty string should not add '.'.
195 return;
196
197 StringRef::size_type Delim;
Rafael Espindola8db7ec02013-06-25 14:29:51 +0000198 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000199 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000200 if (CombinedArg) {
201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(".");
205 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000206 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000207 if (CombinedArg) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800208 CmdArgs.push_back(
209 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000210 } else {
211 CmdArgs.push_back(ArgName);
212 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
213 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000214 }
Nico Weber09c5c392012-03-19 15:00:03 +0000215 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000216 }
217
218 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000219 if (CombinedArg) {
220 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
221 } else {
222 CmdArgs.push_back(ArgName);
223 CmdArgs.push_back(".");
224 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000225 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000226 if (CombinedArg) {
227 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
228 } else {
229 CmdArgs.push_back(ArgName);
230 CmdArgs.push_back(Args.MakeArgString(Dirs));
231 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000232 }
233}
234
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800235static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
236 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000237 const Driver &D = TC.getDriver();
238
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000239 // Add extra linker input arguments which are not treated as inputs
240 // (constructed via -Xarch_).
241 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
242
Stephen Hinesef822542014-07-21 00:47:37 -0700243 for (const auto &II : Inputs) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800244 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000245 // Don't try to pass LLVM inputs unless we have native support.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800246 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000247
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000248 // Add filenames immediately.
249 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000250 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000251 continue;
252 }
253
254 // Otherwise, this is a linker input argument.
255 const Arg &A = II.getInputArg();
256
257 // Handle reserved library options.
Stephen Hinesef822542014-07-21 00:47:37 -0700258 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000259 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Stephen Hinesef822542014-07-21 00:47:37 -0700260 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Sen7433fed2010-09-17 18:39:08 +0000261 TC.AddCCKextLibArgs(Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -0800262 else if (A.getOption().matches(options::OPT_z)) {
263 // Pass -z prefix for gcc linker compatibility.
264 A.claim();
265 A.render(Args, CmdArgs);
266 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800267 A.renderAsInput(Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -0800268 }
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000269 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000270
271 // LIBRARY_PATH - included following the user specified library paths.
Stephen Hines651f13c2014-04-23 16:59:28 -0700272 // and only supported on native toolchains.
273 if (!TC.isCrossCompiling())
274 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000275}
276
John McCallf85e1932011-06-15 23:02:42 +0000277/// \brief Determine whether Objective-C automated reference counting is
278/// enabled.
279static bool isObjCAutoRefCount(const ArgList &Args) {
280 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
281}
282
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000283/// \brief Determine whether we are linking the ObjC runtime.
284static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000285 if (isObjCAutoRefCount(Args)) {
286 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000287 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000288 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000289 return Args.hasArg(options::OPT_fobjc_link_runtime);
290}
291
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000292static bool forwardToGCC(const Option &O) {
Reid Kleckner4cd90df2013-06-19 15:09:06 +0000293 // Don't forward inputs from the original command line. They are added from
294 // InputInfoList.
Richard Smithe40bc4b2013-06-20 01:33:59 +0000295 return O.getKind() != Option::InputClass &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800296 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000297}
298
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800299void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
300 const Driver &D, const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000301 ArgStringList &CmdArgs,
302 const InputInfo &Output,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800303 const InputInfoList &Inputs,
304 const ToolChain *AuxToolChain) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000305 Arg *A;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700306 const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000307
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000308 CheckPreprocessingOptions(D, Args);
309
310 Args.AddLastArg(CmdArgs, options::OPT_C);
311 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000312
313 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000314 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000315 (A = Args.getLastArg(options::OPT_MD)) ||
316 (A = Args.getLastArg(options::OPT_MMD))) {
317 // Determine the output location.
318 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000319 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000320 DepFile = MF->getValue();
Chad Rosier9d718632013-01-24 19:14:47 +0000321 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000322 } else if (Output.getType() == types::TY_Dependencies) {
323 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000324 } else if (A->getOption().matches(options::OPT_M) ||
325 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000326 DepFile = "-";
327 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +0000328 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000329 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000330 }
331 CmdArgs.push_back("-dependency-file");
332 CmdArgs.push_back(DepFile);
333
Chris Lattner3edbeb72010-03-29 17:55:58 +0000334 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000335 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
336 const char *DepTarget;
337
338 // If user provided -o, that is the dependency target, except
339 // when we are only generating a dependency file.
340 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
341 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000342 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000343 } else {
344 // Otherwise derive from the base input.
345 //
346 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000347 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000348 llvm::sys::path::replace_extension(P, "o");
349 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000350 }
351
352 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000353 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000354 QuoteTarget(DepTarget, Quoted);
355 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000356 }
357
Daniel Dunbarb827a052009-11-19 03:26:40 +0000358 if (A->getOption().matches(options::OPT_M) ||
359 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000360 CmdArgs.push_back("-sys-header-deps");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700361 if ((isa<PrecompileJobAction>(JA) &&
362 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
363 Args.hasArg(options::OPT_fmodule_file_deps))
Stephen Hines651f13c2014-04-23 16:59:28 -0700364 CmdArgs.push_back("-module-file-deps");
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000365 }
366
Peter Collingbournebb527862011-07-12 19:35:15 +0000367 if (Args.hasArg(options::OPT_MG)) {
368 if (!A || A->getOption().matches(options::OPT_MD) ||
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800369 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000370 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000371 CmdArgs.push_back("-MG");
372 }
373
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000374 Args.AddLastArg(CmdArgs, options::OPT_MP);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700375 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000376
377 // Convert all -MQ <target> args to -MT <quoted target>
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700378 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000379 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000380
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000381 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000382 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000383 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000384 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000385 CmdArgs.push_back(Args.MakeArgString(Quoted));
386
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800387 // -MT flag - no change
Chris Lattner3edbeb72010-03-29 17:55:58 +0000388 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000389 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000390 }
391 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000392
Douglas Gregordf91ef32009-04-18 00:34:01 +0000393 // Add -i* options, and automatically translate to
394 // -include-pch/-include-pth for transparent PCH support. It's
395 // wonky, but we include looking for .gch so we can support seamless
396 // replacement into a build system already set up to be generating
397 // .gch files.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700398 int YcIndex = -1, YuIndex = -1;
399 {
400 int AI = -1;
401 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
402 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
403 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
404 // Walk the whole i_Group and skip non "-include" flags so that the index
405 // here matches the index in the next loop below.
406 ++AI;
407 if (!A->getOption().matches(options::OPT_include))
408 continue;
409 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
410 YcIndex = AI;
411 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
412 YuIndex = AI;
413 }
414 }
415 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
416 Driver::InputList Inputs;
417 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
418 assert(Inputs.size() == 1 && "Need one input when building pch");
419 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
420 Inputs[0].second->getValue()));
421 }
422
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000423 bool RenderedImplicitInclude = false;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700424 int AI = -1;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700425 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700426 ++AI;
427
428 if (getToolChain().getDriver().IsCLMode() &&
429 A->getOption().matches(options::OPT_include)) {
430 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
431 // include is compiled into foo.h, and everything after goes into
432 // the .obj file. /Yufoo.h means that all includes prior to and including
433 // foo.h are completely skipped and replaced with a use of the pch file
434 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
435 // just mean that the last one wins.) If /Yc and /Yu are both present
436 // and refer to the same file, /Yc wins.
437 // Note that OPT__SLASH_FI gets mapped to OPT_include.
438 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
439 // cl.exe seems to support both flags with different values, but that
440 // seems strange (which flag does /Fp now refer to?), so don't implement
441 // that until someone needs it.
442 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
443 if (PchIndex != -1) {
444 if (isa<PrecompileJobAction>(JA)) {
445 // When building the pch, skip all includes after the pch.
446 assert(YcIndex != -1 && PchIndex == YcIndex);
447 if (AI >= YcIndex)
448 continue;
449 } else {
450 // When using the pch, skip all includes prior to the pch.
451 if (AI < PchIndex) {
452 A->claim();
453 continue;
454 }
455 if (AI == PchIndex) {
456 A->claim();
457 CmdArgs.push_back("-include-pch");
458 CmdArgs.push_back(
459 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
460 continue;
461 }
462 }
463 }
464 } else if (A->getOption().matches(options::OPT_include)) {
465 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000466 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
467 RenderedImplicitInclude = true;
468
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000469 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000470 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000471
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000472 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000473 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000474 SmallString<128> P(A->getValue());
475 // We want the files to have a name like foo.h.pch. Add a dummy extension
476 // so that replace_extension does the right thing.
477 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000478 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000479 llvm::sys::path::replace_extension(P, "pch");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700480 if (llvm::sys::fs::exists(P))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000481 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000482 }
483
Douglas Gregordf91ef32009-04-18 00:34:01 +0000484 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000485 llvm::sys::path::replace_extension(P, "pth");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700486 if (llvm::sys::fs::exists(P))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000487 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000488 }
489
Douglas Gregordf91ef32009-04-18 00:34:01 +0000490 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000491 llvm::sys::path::replace_extension(P, "gch");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700492 if (llvm::sys::fs::exists(P)) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000493 FoundPCH = UsePCH;
494 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000495 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000496 }
497
498 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000499 if (IsFirstImplicitInclude) {
500 A->claim();
501 if (UsePCH)
502 CmdArgs.push_back("-include-pch");
503 else
504 CmdArgs.push_back("-include-pth");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700505 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000506 continue;
507 } else {
508 // Ignore the PCH if not first on command line and emit warning.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800509 D.Diag(diag::warn_drv_pch_not_first_include) << P
510 << A->getAsString(Args);
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000511 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000512 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700513 } else if (A->getOption().matches(options::OPT_isystem_after)) {
514 // Handling of paths which must come late. These entries are handled by
515 // the toolchain itself after the resource dir is inserted in the right
516 // search order.
517 // Do not claim the argument so that the use of the argument does not
518 // silently go unnoticed on toolchains which do not honour the option.
519 continue;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000520 }
521
522 // Not translated, render as usual.
523 A->claim();
524 A->render(Args, CmdArgs);
525 }
526
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800527 Args.AddAllArgs(CmdArgs,
528 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
529 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000530
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800531 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000532
533 // FIXME: There is a very unfortunate problem here, some troubled
534 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
535 // really support that we would have to parse and then translate
536 // those options. :(
537 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
538 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000539
540 // -I- is a deprecated GCC feature, reject it.
541 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000542 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000543
544 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
545 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000546 StringRef sysroot = C.getSysRoot();
547 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000548 if (!Args.hasArg(options::OPT_isysroot)) {
549 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000550 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000551 }
552 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000553
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000554 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000555 // FIXME: We should probably sink the logic for handling these from the
556 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000557 // CPATH - included following the user specified includes (but prior to
558 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000559 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000560 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000561 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000562 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000563 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000564 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000565 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000566 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000567 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000568
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800569 // Optional AuxToolChain indicates that we need to include headers
570 // for more than one target. If that's the case, add include paths
571 // from AuxToolChain right after include paths of the same kind for
572 // the current target.
573
Chandler Carruth88491fc2011-11-04 07:12:53 +0000574 // Add C++ include arguments, if needed.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800575 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000576 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800577 if (AuxToolChain)
578 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
579 }
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000580
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700581 // Add system include arguments for all targets but IAMCU.
582 if (!IsIAMCU) {
583 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
584 if (AuxToolChain)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800585 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700586 } else {
587 // For IAMCU add special include arguments.
588 getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs);
589 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800590
591 // Add CUDA include arguments, if needed.
592 if (types::isCuda(Inputs[0].getType()))
593 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000594}
595
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000596// FIXME: Move to target hook.
597static bool isSignedCharDefault(const llvm::Triple &Triple) {
598 switch (Triple.getArch()) {
599 default:
600 return true;
601
Tim Northoverc264e162013-01-31 12:13:10 +0000602 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -0700603 case llvm::Triple::aarch64_be:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000604 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -0700605 case llvm::Triple::armeb:
Stephen Hines176edba2014-12-01 14:53:08 -0800606 case llvm::Triple::thumb:
607 case llvm::Triple::thumbeb:
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700608 if (Triple.isOSDarwin() || Triple.isOSWindows())
609 return true;
610 return false;
611
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000612 case llvm::Triple::ppc:
613 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000614 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000615 return true;
616 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000617
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700618 case llvm::Triple::hexagon:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000619 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000620 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000621 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000622 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000623 }
624}
625
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000626static bool isNoCommonDefault(const llvm::Triple &Triple) {
627 switch (Triple.getArch()) {
628 default:
629 return false;
630
631 case llvm::Triple::xcore:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800632 case llvm::Triple::wasm32:
633 case llvm::Triple::wasm64:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000634 return true;
635 }
636}
637
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800638// ARM tools start.
639
640// Get SubArch (vN).
641static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
642 llvm::StringRef Arch = Triple.getArchName();
643 return llvm::ARM::parseArchVersion(Arch);
644}
645
646// True if M-profile.
647static bool isARMMProfile(const llvm::Triple &Triple) {
648 llvm::StringRef Arch = Triple.getArchName();
649 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
650 return Profile == llvm::ARM::PK_M;
651}
652
653// Get Arch/CPU from args.
654static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
655 llvm::StringRef &CPU, bool FromAs = false) {
656 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
657 CPU = A->getValue();
658 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
659 Arch = A->getValue();
660 if (!FromAs)
661 return;
662
663 for (const Arg *A :
664 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
665 StringRef Value = A->getValue();
666 if (Value.startswith("-mcpu="))
667 CPU = Value.substr(6);
668 if (Value.startswith("-march="))
669 Arch = Value.substr(7);
670 }
671}
672
Silviu Baranga1db2e272013-10-21 10:54:53 +0000673// Handle -mhwdiv=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800674// FIXME: Use ARMTargetParser.
Silviu Baranga1db2e272013-10-21 10:54:53 +0000675static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800676 const ArgList &Args, StringRef HWDiv,
677 std::vector<const char *> &Features) {
678 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
679 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Baranga1db2e272013-10-21 10:54:53 +0000680 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
681}
Stephen Hines176edba2014-12-01 14:53:08 -0800682
Amara Emersonfe7ed042013-10-01 10:20:54 +0000683// Handle -mfpu=.
Amara Emersonfe7ed042013-10-01 10:20:54 +0000684static void getARMFPUFeatures(const Driver &D, const Arg *A,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800685 const ArgList &Args, StringRef FPU,
Amara Emersonfe7ed042013-10-01 10:20:54 +0000686 std::vector<const char *> &Features) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800687 unsigned FPUID = llvm::ARM::parseFPU(FPU);
688 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosier99317272012-04-04 20:51:35 +0000689 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
690}
691
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800692// Decode ARM features from string like +[no]featureA+[no]featureB+...
693static bool DecodeARMFeatures(const Driver &D, StringRef text,
694 std::vector<const char *> &Features) {
695 SmallVector<StringRef, 8> Split;
696 text.split(Split, StringRef("+"), -1, false);
697
698 for (StringRef Feature : Split) {
699 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
700 if (FeatureName)
701 Features.push_back(FeatureName);
702 else
703 return false;
704 }
705 return true;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700706}
707
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800708// Check if -march is valid by checking if it can be canonicalised and parsed.
709// getARMArch is used here instead of just checking the -march value in order
710// to handle -march=native correctly.
711static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
712 llvm::StringRef ArchName,
713 std::vector<const char *> &Features,
714 const llvm::Triple &Triple) {
715 std::pair<StringRef, StringRef> Split = ArchName.split("+");
716
717 std::string MArch = arm::getARMArch(ArchName, Triple);
718 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
719 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
720 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
721}
722
723// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
724static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
725 llvm::StringRef CPUName, llvm::StringRef ArchName,
726 std::vector<const char *> &Features,
727 const llvm::Triple &Triple) {
728 std::pair<StringRef, StringRef> Split = CPUName.split("+");
729
730 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
731 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
732 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
733 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
734}
735
736static bool useAAPCSForMachO(const llvm::Triple &T) {
737 // The backend is hardwired to assume AAPCS for M-class processors, ensure
738 // the frontend matches that.
739 return T.getEnvironment() == llvm::Triple::EABI ||
740 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700741}
742
Anton Korobeynikove2571792012-04-09 13:38:30 +0000743// Select the float ABI as determined by -msoft-float, -mhard-float, and
744// -mfloat-abi=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800745arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
746 const Driver &D = TC.getDriver();
747 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
748 auto SubArch = getARMSubArchVersionNumber(Triple);
749 arm::FloatABI ABI = FloatABI::Invalid;
750 if (Arg *A =
751 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
752 options::OPT_mfloat_abi_EQ)) {
753 if (A->getOption().matches(options::OPT_msoft_float)) {
754 ABI = FloatABI::Soft;
755 } else if (A->getOption().matches(options::OPT_mhard_float)) {
756 ABI = FloatABI::Hard;
757 } else {
758 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
759 .Case("soft", FloatABI::Soft)
760 .Case("softfp", FloatABI::SoftFP)
761 .Case("hard", FloatABI::Hard)
762 .Default(FloatABI::Invalid);
763 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
764 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
765 ABI = FloatABI::Soft;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000766 }
767 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800768
769 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
770 // "apcs-gnu".
771 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
772 ABI == FloatABI::Hard) {
773 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
774 << Triple.getArchName();
775 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000776 }
777
778 // If unspecified, choose the default based on the platform.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800779 if (ABI == FloatABI::Invalid) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000780 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000781 case llvm::Triple::Darwin:
782 case llvm::Triple::MacOSX:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800783 case llvm::Triple::IOS:
784 case llvm::Triple::TvOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000785 // Darwin defaults to "softfp" for v6 and v7.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800786 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700787 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000788 break;
789 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800790 case llvm::Triple::WatchOS:
791 ABI = FloatABI::Hard;
792 break;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000793
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700794 // FIXME: this is invalid for WindowsCE
795 case llvm::Triple::Win32:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800796 ABI = FloatABI::Hard;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700797 break;
798
Rafael Espindola27fa2362012-12-13 04:17:14 +0000799 case llvm::Triple::FreeBSD:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800800 switch (Triple.getEnvironment()) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700801 case llvm::Triple::GNUEABIHF:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800802 ABI = FloatABI::Hard;
Stephen Hines651f13c2014-04-23 16:59:28 -0700803 break;
804 default:
805 // FreeBSD defaults to soft float
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800806 ABI = FloatABI::Soft;
Stephen Hines651f13c2014-04-23 16:59:28 -0700807 break;
808 }
Rafael Espindola27fa2362012-12-13 04:17:14 +0000809 break;
810
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000811 default:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800812 switch (Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000813 case llvm::Triple::GNUEABIHF:
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700814 case llvm::Triple::MuslEABIHF:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800815 case llvm::Triple::EABIHF:
816 ABI = FloatABI::Hard;
Jiangning Liuff104a12012-07-31 08:06:29 +0000817 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000818 case llvm::Triple::GNUEABI:
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700819 case llvm::Triple::MuslEABI:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000820 case llvm::Triple::EABI:
821 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800822 ABI = FloatABI::SoftFP;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000823 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800824 case llvm::Triple::Android:
825 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthb43550b2012-01-10 19:47:42 +0000826 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000827 default:
828 // Assume "soft", but warn the user we are guessing.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700829 if (Triple.isOSBinFormatMachO() &&
830 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
831 ABI = FloatABI::Hard;
832 else
833 ABI = FloatABI::Soft;
834
Stephen Hines651f13c2014-04-23 16:59:28 -0700835 if (Triple.getOS() != llvm::Triple::UnknownOS ||
836 !Triple.isOSBinFormatMachO())
837 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000838 break;
839 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000840 }
841 }
842
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800843 assert(ABI != FloatABI::Invalid && "must select an ABI");
844 return ABI;
Anton Korobeynikove2571792012-04-09 13:38:30 +0000845}
846
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800847static void getARMTargetFeatures(const ToolChain &TC,
848 const llvm::Triple &Triple,
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000849 const ArgList &Args,
Stephen Hines651f13c2014-04-23 16:59:28 -0700850 std::vector<const char *> &Features,
851 bool ForAS) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800852 const Driver &D = TC.getDriver();
853
854 bool KernelOrKext =
855 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
856 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
857 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
858 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
859
Stephen Hines651f13c2014-04-23 16:59:28 -0700860 if (!ForAS) {
861 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
862 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
863 // stripped out by the ARM target. We should probably pass this a new
864 // -target-option, which is handled by the -cc1/-cc1as invocation.
865 //
866 // FIXME2: For consistency, it would be ideal if we set up the target
867 // machine state the same when using the frontend or the assembler. We don't
868 // currently do that for the assembler, we pass the options directly to the
869 // backend and never even instantiate the frontend TargetInfo. If we did,
870 // and used its handleTargetFeatures hook, then we could ensure the
871 // assembler and the frontend behave the same.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000872
Stephen Hines651f13c2014-04-23 16:59:28 -0700873 // Use software floating point operations?
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800874 if (ABI == arm::FloatABI::Soft)
Stephen Hines651f13c2014-04-23 16:59:28 -0700875 Features.push_back("+soft-float");
876
877 // Use software floating point argument passing?
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800878 if (ABI != arm::FloatABI::Hard)
Stephen Hines651f13c2014-04-23 16:59:28 -0700879 Features.push_back("+soft-float-abi");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800880 } else {
881 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
882 // to the assembler correctly.
883 for (const Arg *A :
884 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
885 StringRef Value = A->getValue();
886 if (Value.startswith("-mfpu=")) {
887 WaFPU = A;
888 } else if (Value.startswith("-mcpu=")) {
889 WaCPU = A;
890 } else if (Value.startswith("-mhwdiv=")) {
891 WaHDiv = A;
892 } else if (Value.startswith("-march=")) {
893 WaArch = A;
894 }
895 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700896 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000897
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800898 // Check -march. ClangAs gives preference to -Wa,-march=.
899 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
900 StringRef ArchName;
901 if (WaArch) {
902 if (ArchArg)
903 D.Diag(clang::diag::warn_drv_unused_argument)
904 << ArchArg->getAsString(Args);
905 ArchName = StringRef(WaArch->getValue()).substr(7);
906 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
907 // FIXME: Set Arch.
908 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
909 } else if (ArchArg) {
910 ArchName = ArchArg->getValue();
911 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700912 }
913
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800914 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
915 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
916 StringRef CPUName;
917 if (WaCPU) {
918 if (CPUArg)
919 D.Diag(clang::diag::warn_drv_unused_argument)
920 << CPUArg->getAsString(Args);
921 CPUName = StringRef(WaCPU->getValue()).substr(6);
922 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
923 } else if (CPUArg) {
924 CPUName = CPUArg->getValue();
925 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700926 }
927
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800928 // Add CPU features for generic CPUs
929 if (CPUName == "native") {
930 llvm::StringMap<bool> HostFeatures;
931 if (llvm::sys::getHostCPUFeatures(HostFeatures))
932 for (auto &F : HostFeatures)
933 Features.push_back(
934 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
935 }
936
937 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
938 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
939 if (WaFPU) {
940 if (FPUArg)
941 D.Diag(clang::diag::warn_drv_unused_argument)
942 << FPUArg->getAsString(Args);
943 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
944 Features);
945 } else if (FPUArg) {
946 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
947 }
948
949 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
950 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
951 if (WaHDiv) {
952 if (HDivArg)
953 D.Diag(clang::diag::warn_drv_unused_argument)
954 << HDivArg->getAsString(Args);
955 getARMHWDivFeatures(D, WaHDiv, Args,
956 StringRef(WaHDiv->getValue()).substr(8), Features);
957 } else if (HDivArg)
958 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
959
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000960 // Setting -msoft-float effectively disables NEON because of the GCC
961 // implementation, although the same isn't true of VFP or VFP3.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800962 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000963 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700964 // Also need to explicitly disable features which imply NEON.
965 Features.push_back("-crypto");
966 }
Bernard Ogden909f35a2013-10-29 09:47:51 +0000967
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700968 // En/disable crc code generation.
969 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden909f35a2013-10-29 09:47:51 +0000970 if (A->getOption().matches(options::OPT_mcrc))
971 Features.push_back("+crc");
972 else
973 Features.push_back("-crc");
974 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700975
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800976 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
977 // neither options are specified, see if we are compiling for kernel/kext and
978 // decide whether to pass "+long-calls" based on the OS and its version.
979 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
980 options::OPT_mno_long_calls)) {
981 if (A->getOption().matches(options::OPT_mlong_calls))
982 Features.push_back("+long-calls");
983 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
984 !Triple.isWatchOS()) {
985 Features.push_back("+long-calls");
986 }
987
988 // Kernel code has more strict alignment requirements.
989 if (KernelOrKext)
990 Features.push_back("+strict-align");
991 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
992 options::OPT_munaligned_access)) {
993 if (A->getOption().matches(options::OPT_munaligned_access)) {
994 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
995 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
996 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700997 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
998 // access either.
999 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
1000 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001001 } else
1002 Features.push_back("+strict-align");
1003 } else {
1004 // Assume pre-ARMv6 doesn't support unaligned accesses.
1005 //
1006 // ARMv6 may or may not support unaligned accesses depending on the
1007 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
1008 // Darwin and NetBSD targets support unaligned accesses, and others don't.
1009 //
1010 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
1011 // which raises an alignment fault on unaligned accesses. Linux
1012 // defaults this bit to 0 and handles it as a system-wide (not
1013 // per-process) setting. It is therefore safe to assume that ARMv7+
1014 // Linux targets support unaligned accesses. The same goes for NaCl.
1015 //
1016 // The above behavior is consistent with GCC.
1017 int VersionNum = getARMSubArchVersionNumber(Triple);
1018 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
1019 if (VersionNum < 6 ||
1020 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
1021 Features.push_back("+strict-align");
1022 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1023 if (VersionNum < 7)
1024 Features.push_back("+strict-align");
1025 } else
1026 Features.push_back("+strict-align");
1027 }
1028
1029 // llvm does not support reserving registers in general. There is support
1030 // for reserving r9 on ARM though (defined as a platform-specific register
1031 // in ARM EABI).
1032 if (Args.hasArg(options::OPT_ffixed_r9))
1033 Features.push_back("+reserve-r9");
1034
1035 // The kext linker doesn't know how to deal with movw/movt.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001036 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001037 Features.push_back("+no-movt");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001038}
Anton Korobeynikove2571792012-04-09 13:38:30 +00001039
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001040void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1041 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikove2571792012-04-09 13:38:30 +00001042 // Select the ABI to use.
Anton Korobeynikove2571792012-04-09 13:38:30 +00001043 // FIXME: Support -meabi.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001044 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001045 const char *ABIName = nullptr;
Anton Korobeynikove2571792012-04-09 13:38:30 +00001046 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001047 ABIName = A->getValue();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001048 } else if (Triple.isOSBinFormatMachO()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001049 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +00001050 ABIName = "aapcs";
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001051 } else if (Triple.isWatchABI()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001052 ABIName = "aapcs16";
Daniel Dunbar2e4e1102012-10-22 18:30:51 +00001053 } else {
1054 ABIName = "apcs-gnu";
1055 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001056 } else if (Triple.isOSWindows()) {
1057 // FIXME: this is invalid for WindowsCE
1058 ABIName = "aapcs";
Anton Korobeynikove2571792012-04-09 13:38:30 +00001059 } else {
1060 // Select the default based on the platform.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001061 switch (Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +00001062 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +00001063 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +00001064 case llvm::Triple::GNUEABIHF:
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001065 case llvm::Triple::MuslEABI:
1066 case llvm::Triple::MuslEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +00001067 ABIName = "aapcs-linux";
1068 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07001069 case llvm::Triple::EABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +00001070 case llvm::Triple::EABI:
1071 ABIName = "aapcs";
1072 break;
1073 default:
Stephen Hines176edba2014-12-01 14:53:08 -08001074 if (Triple.getOS() == llvm::Triple::NetBSD)
1075 ABIName = "apcs-gnu";
1076 else
1077 ABIName = "aapcs";
1078 break;
Anton Korobeynikove2571792012-04-09 13:38:30 +00001079 }
1080 }
1081 CmdArgs.push_back("-target-abi");
1082 CmdArgs.push_back(ABIName);
1083
Anton Korobeynikove2571792012-04-09 13:38:30 +00001084 // Determine floating point ABI from the options & target defaults.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001085 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
1086 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbarcbd19332009-09-10 23:00:09 +00001087 // Floating point operations and argument passing are soft.
Daniel Dunbarcbd19332009-09-10 23:00:09 +00001088 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +00001089 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +00001090 CmdArgs.push_back("-mfloat-abi");
1091 CmdArgs.push_back("soft");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001092 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbarcbd19332009-09-10 23:00:09 +00001093 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +00001094 CmdArgs.push_back("-mfloat-abi");
1095 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +00001096 } else {
1097 // Floating point operations and argument passing are hard.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001098 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +00001099 CmdArgs.push_back("-mfloat-abi");
1100 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +00001101 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001102
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001103 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosier1b906052011-08-26 00:26:29 +00001104 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1105 options::OPT_mno_global_merge)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001106 CmdArgs.push_back("-backend-option");
Chad Rosier1b906052011-08-26 00:26:29 +00001107 if (A->getOption().matches(options::OPT_mno_global_merge))
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001108 CmdArgs.push_back("-arm-global-merge=false");
1109 else
1110 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosier1b906052011-08-26 00:26:29 +00001111 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +00001112
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001113 if (!Args.hasFlag(options::OPT_mimplicit_float,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001114 options::OPT_mno_implicit_float, true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +00001115 CmdArgs.push_back("-no-implicit-float");
Stephen Hines651f13c2014-04-23 16:59:28 -07001116}
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001117// ARM tools end.
Stephen Hines651f13c2014-04-23 16:59:28 -07001118
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001119/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1120/// targeting.
1121static std::string getAArch64TargetCPU(const ArgList &Args) {
Stephen Hines176edba2014-12-01 14:53:08 -08001122 Arg *A;
1123 std::string CPU;
1124 // If we have -mtune or -mcpu, use that.
1125 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001126 CPU = StringRef(A->getValue()).lower();
Stephen Hines176edba2014-12-01 14:53:08 -08001127 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
1128 StringRef Mcpu = A->getValue();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001129 CPU = Mcpu.split("+").first.lower();
Stephen Hines651f13c2014-04-23 16:59:28 -07001130 }
1131
Stephen Hines176edba2014-12-01 14:53:08 -08001132 // Handle CPU name is 'native'.
1133 if (CPU == "native")
1134 return llvm::sys::getHostCPUName();
1135 else if (CPU.size())
1136 return CPU;
Stephen Hines651f13c2014-04-23 16:59:28 -07001137
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001138 // Make sure we pick "cyclone" if -arch is used.
1139 // FIXME: Should this be picked by checking the target triple instead?
1140 if (Args.getLastArg(options::OPT_arch))
1141 return "cyclone";
1142
1143 return "generic";
Stephen Hines651f13c2014-04-23 16:59:28 -07001144}
1145
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001146void Clang::AddAArch64TargetArgs(const ArgList &Args,
1147 ArgStringList &CmdArgs) const {
Stephen Hines651f13c2014-04-23 16:59:28 -07001148 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1149 llvm::Triple Triple(TripleStr);
1150
1151 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1152 Args.hasArg(options::OPT_mkernel) ||
1153 Args.hasArg(options::OPT_fapple_kext))
1154 CmdArgs.push_back("-disable-red-zone");
1155
1156 if (!Args.hasFlag(options::OPT_mimplicit_float,
1157 options::OPT_mno_implicit_float, true))
1158 CmdArgs.push_back("-no-implicit-float");
1159
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001160 const char *ABIName = nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001161 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1162 ABIName = A->getValue();
1163 else if (Triple.isOSDarwin())
1164 ABIName = "darwinpcs";
1165 else
1166 ABIName = "aapcs";
1167
1168 CmdArgs.push_back("-target-abi");
1169 CmdArgs.push_back(ABIName);
1170
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001171 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1172 options::OPT_mno_fix_cortex_a53_835769)) {
1173 CmdArgs.push_back("-backend-option");
1174 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1175 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1176 else
1177 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001178 } else if (Triple.isAndroid()) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001179 // Enabled A53 errata (835769) workaround by default on android
1180 CmdArgs.push_back("-backend-option");
1181 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1182 }
1183
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001184 // Forward the -mglobal-merge option for explicit control over the pass.
Stephen Hinesef822542014-07-21 00:47:37 -07001185 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1186 options::OPT_mno_global_merge)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001187 CmdArgs.push_back("-backend-option");
Stephen Hinesef822542014-07-21 00:47:37 -07001188 if (A->getOption().matches(options::OPT_mno_global_merge))
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001189 CmdArgs.push_back("-aarch64-global-merge=false");
1190 else
1191 CmdArgs.push_back("-aarch64-global-merge=true");
Stephen Hinesef822542014-07-21 00:47:37 -07001192 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001193}
1194
Simon Atanasyana2768be2012-04-07 22:09:23 +00001195// Get CPU and ABI names. They are not independent
1196// so we have to calculate them together.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001197void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1198 StringRef &CPUName, StringRef &ABIName) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001199 const char *DefMips32CPU = "mips32r2";
1200 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka9f360622011-09-26 21:07:52 +00001201
Stephen Hinesef822542014-07-21 00:47:37 -07001202 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1203 // default for mips64(el)?-img-linux-gnu.
1204 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1205 Triple.getEnvironment() == llvm::Triple::GNU) {
1206 DefMips32CPU = "mips32r6";
1207 DefMips64CPU = "mips64r6";
1208 }
1209
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001210 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001211 if (Triple.isAndroid()) {
1212 DefMips32CPU = "mips32";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001213 DefMips64CPU = "mips64r6";
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001214 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001215
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001216 // MIPS3 is the default for mips64*-unknown-openbsd.
1217 if (Triple.getOS() == llvm::Triple::OpenBSD)
1218 DefMips64CPU = "mips3";
1219
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001220 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyan66751bc2013-10-09 12:12:24 +00001221 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001222
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001223 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001224 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001225 // Convert a GNU style Mips ABI name to the name
1226 // accepted by LLVM Mips backend.
1227 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001228 .Case("32", "o32")
1229 .Case("64", "n64")
1230 .Default(ABIName);
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001231 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001232
1233 // Setup default CPU and ABI names.
1234 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +00001235 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001236 default:
1237 llvm_unreachable("Unexpected triple arch name");
1238 case llvm::Triple::mips:
1239 case llvm::Triple::mipsel:
1240 CPUName = DefMips32CPU;
1241 break;
1242 case llvm::Triple::mips64:
1243 case llvm::Triple::mips64el:
1244 CPUName = DefMips64CPU;
1245 break;
1246 }
1247 }
1248
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001249 if (ABIName.empty() &&
1250 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
1251 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
1252 ABIName = llvm::StringSwitch<const char *>(CPUName)
1253 .Case("mips1", "o32")
1254 .Case("mips2", "o32")
1255 .Case("mips3", "n64")
1256 .Case("mips4", "n64")
1257 .Case("mips5", "n64")
1258 .Case("mips32", "o32")
1259 .Case("mips32r2", "o32")
1260 .Case("mips32r3", "o32")
1261 .Case("mips32r5", "o32")
1262 .Case("mips32r6", "o32")
1263 .Case("mips64", "n64")
1264 .Case("mips64r2", "n64")
1265 .Case("mips64r3", "n64")
1266 .Case("mips64r5", "n64")
1267 .Case("mips64r6", "n64")
1268 .Case("octeon", "n64")
1269 .Case("p5600", "o32")
1270 .Default("");
1271 }
1272
Stephen Hinesef822542014-07-21 00:47:37 -07001273 if (ABIName.empty()) {
1274 // Deduce ABI name from the target triple.
1275 if (Triple.getArch() == llvm::Triple::mips ||
1276 Triple.getArch() == llvm::Triple::mipsel)
1277 ABIName = "o32";
1278 else
1279 ABIName = "n64";
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001280 }
1281
Stephen Hinesef822542014-07-21 00:47:37 -07001282 if (CPUName.empty()) {
1283 // Deduce CPU name from ABI name.
1284 CPUName = llvm::StringSwitch<const char *>(ABIName)
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001285 .Case("o32", DefMips32CPU)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001286 .Cases("n32", "n64", DefMips64CPU)
1287 .Default("");
Stephen Hinesef822542014-07-21 00:47:37 -07001288 }
Stephen Hines176edba2014-12-01 14:53:08 -08001289
1290 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyana2768be2012-04-07 22:09:23 +00001291}
1292
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001293std::string mips::getMipsABILibSuffix(const ArgList &Args,
1294 const llvm::Triple &Triple) {
1295 StringRef CPUName, ABIName;
1296 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1297 return llvm::StringSwitch<std::string>(ABIName)
1298 .Case("o32", "")
1299 .Case("n32", "32")
1300 .Case("n64", "64");
1301}
1302
Simon Atanasyane9616a42013-02-27 14:55:49 +00001303// Convert ABI name to the GNU tools acceptable variant.
1304static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1305 return llvm::StringSwitch<llvm::StringRef>(ABI)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001306 .Case("o32", "32")
1307 .Case("n64", "64")
1308 .Default(ABI);
Simon Atanasyane9616a42013-02-27 14:55:49 +00001309}
1310
Simon Atanasyan5e627792012-06-02 15:06:29 +00001311// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1312// and -mfloat-abi=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001313static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1314 mips::FloatABI ABI = mips::FloatABI::Invalid;
1315 if (Arg *A =
1316 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1317 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +00001318 if (A->getOption().matches(options::OPT_msoft_float))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001319 ABI = mips::FloatABI::Soft;
Eric Christophered734732010-03-02 02:41:08 +00001320 else if (A->getOption().matches(options::OPT_mhard_float))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001321 ABI = mips::FloatABI::Hard;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001322 else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001323 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1324 .Case("soft", mips::FloatABI::Soft)
1325 .Case("hard", mips::FloatABI::Hard)
1326 .Default(mips::FloatABI::Invalid);
1327 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001328 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001329 ABI = mips::FloatABI::Hard;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001330 }
1331 }
Eric Christophered734732010-03-02 02:41:08 +00001332 }
1333
1334 // If unspecified, choose the default based on the platform.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001335 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001336 // Assume "hard", because it's a default value used by gcc.
1337 // When we start to recognize specific target MIPS processors,
1338 // we will be able to select the default more correctly.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001339 ABI = mips::FloatABI::Hard;
Eric Christophered734732010-03-02 02:41:08 +00001340 }
1341
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001342 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1343 return ABI;
Simon Atanasyan5e627792012-06-02 15:06:29 +00001344}
1345
Simon Atanasyandc536f52012-07-05 18:51:43 +00001346static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001347 std::vector<const char *> &Features,
1348 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +00001349 StringRef FeatureName) {
1350 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +00001351 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001352 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001353 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001354 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001355 }
1356}
1357
Stephen Hines176edba2014-12-01 14:53:08 -08001358static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1359 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001360 std::vector<const char *> &Features) {
Stephen Hines176edba2014-12-01 14:53:08 -08001361 StringRef CPUName;
1362 StringRef ABIName;
1363 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1364 ABIName = getGnuCompatibleMipsABIName(ABIName);
1365
Stephen Hines176edba2014-12-01 14:53:08 -08001366 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1367 options::OPT_mabicalls, "noabicalls");
1368
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001369 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1370 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001371 // FIXME: Note, this is a hack. We need to pass the selected float
1372 // mode to the MipsTargetInfoBase to define appropriate macros there.
1373 // Now it is the only method.
1374 Features.push_back("+soft-float");
1375 }
1376
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001377 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001378 StringRef Val = StringRef(A->getValue());
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001379 if (Val == "2008") {
1380 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1381 Features.push_back("+nan2008");
1382 else {
1383 Features.push_back("-nan2008");
1384 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1385 }
1386 } else if (Val == "legacy") {
1387 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1388 Features.push_back("-nan2008");
1389 else {
1390 Features.push_back("+nan2008");
1391 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1392 }
1393 } else
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001394 D.Diag(diag::err_drv_unsupported_option_argument)
1395 << A->getOption().getName() << Val;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001396 }
1397
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001398 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1399 options::OPT_mdouble_float, "single-float");
1400 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1401 "mips16");
1402 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1403 options::OPT_mno_micromips, "micromips");
1404 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1405 "dsp");
1406 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1407 "dspr2");
1408 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1409 "msa");
Stephen Hines176edba2014-12-01 14:53:08 -08001410
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001411 // Add the last -mfp32/-mfpxx/-mfp64, if none are given and the ABI is O32
1412 // pass -mfpxx, or if none are given and fp64a is default, pass fp64 and
1413 // nooddspreg.
Stephen Hines176edba2014-12-01 14:53:08 -08001414 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1415 options::OPT_mfp64)) {
1416 if (A->getOption().matches(options::OPT_mfp32))
1417 Features.push_back(Args.MakeArgString("-fp64"));
1418 else if (A->getOption().matches(options::OPT_mfpxx)) {
1419 Features.push_back(Args.MakeArgString("+fpxx"));
1420 Features.push_back(Args.MakeArgString("+nooddspreg"));
1421 } else
1422 Features.push_back(Args.MakeArgString("+fp64"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001423 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Stephen Hines176edba2014-12-01 14:53:08 -08001424 Features.push_back(Args.MakeArgString("+fpxx"));
1425 Features.push_back(Args.MakeArgString("+nooddspreg"));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001426 } else if (mips::isFP64ADefault(Triple, CPUName)) {
1427 Features.push_back(Args.MakeArgString("+fp64"));
1428 Features.push_back(Args.MakeArgString("+nooddspreg"));
Stephen Hines176edba2014-12-01 14:53:08 -08001429 }
1430
Stephen Hinesef822542014-07-21 00:47:37 -07001431 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1432 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001433}
1434
Simon Atanasyan5e627792012-06-02 15:06:29 +00001435void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001436 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001437 const Driver &D = getToolChain().getDriver();
1438 StringRef CPUName;
1439 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001440 const llvm::Triple &Triple = getToolChain().getTriple();
Stephen Hines176edba2014-12-01 14:53:08 -08001441 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001442
1443 CmdArgs.push_back("-target-abi");
1444 CmdArgs.push_back(ABIName.data());
1445
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001446 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1447 if (ABI == mips::FloatABI::Soft) {
Eric Christophered734732010-03-02 02:41:08 +00001448 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001449 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001450 CmdArgs.push_back("-mfloat-abi");
1451 CmdArgs.push_back("soft");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001452 } else {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001453 // Floating point operations and argument passing are hard.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001454 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001455 CmdArgs.push_back("-mfloat-abi");
1456 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001457 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001458
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001459 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1460 if (A->getOption().matches(options::OPT_mxgot)) {
1461 CmdArgs.push_back("-mllvm");
1462 CmdArgs.push_back("-mxgot");
1463 }
1464 }
1465
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001466 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1467 options::OPT_mno_ldc1_sdc1)) {
1468 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1469 CmdArgs.push_back("-mllvm");
1470 CmdArgs.push_back("-mno-ldc1-sdc1");
1471 }
1472 }
1473
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001474 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1475 options::OPT_mno_check_zero_division)) {
1476 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1477 CmdArgs.push_back("-mllvm");
1478 CmdArgs.push_back("-mno-check-zero-division");
1479 }
1480 }
1481
Simon Atanasyan9804b762012-08-27 20:55:56 +00001482 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001483 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001484 CmdArgs.push_back("-mllvm");
1485 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1486 A->claim();
1487 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001488
1489 if (Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) {
1490 StringRef Val = StringRef(A->getValue());
1491 if (mips::hasCompactBranches(CPUName)) {
1492 if (Val == "never" || Val == "always" || Val == "optimal") {
1493 CmdArgs.push_back("-mllvm");
1494 CmdArgs.push_back(Args.MakeArgString("-mips-compact-branches=" + Val));
1495 } else
1496 D.Diag(diag::err_drv_unsupported_option_argument)
1497 << A->getOption().getName() << Val;
1498 } else
1499 D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName;
1500 }
Eric Christophered734732010-03-02 02:41:08 +00001501}
1502
Hal Finkel02a84272012-06-11 22:35:19 +00001503/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1504static std::string getPPCTargetCPU(const ArgList &Args) {
1505 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001506 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001507
1508 if (CPUName == "native") {
1509 std::string CPU = llvm::sys::getHostCPUName();
1510 if (!CPU.empty() && CPU != "generic")
1511 return CPU;
1512 else
1513 return "";
1514 }
1515
1516 return llvm::StringSwitch<const char *>(CPUName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001517 .Case("common", "generic")
1518 .Case("440", "440")
1519 .Case("440fp", "440")
1520 .Case("450", "450")
1521 .Case("601", "601")
1522 .Case("602", "602")
1523 .Case("603", "603")
1524 .Case("603e", "603e")
1525 .Case("603ev", "603ev")
1526 .Case("604", "604")
1527 .Case("604e", "604e")
1528 .Case("620", "620")
1529 .Case("630", "pwr3")
1530 .Case("G3", "g3")
1531 .Case("7400", "7400")
1532 .Case("G4", "g4")
1533 .Case("7450", "7450")
1534 .Case("G4+", "g4+")
1535 .Case("750", "750")
1536 .Case("970", "970")
1537 .Case("G5", "g5")
1538 .Case("a2", "a2")
1539 .Case("a2q", "a2q")
1540 .Case("e500mc", "e500mc")
1541 .Case("e5500", "e5500")
1542 .Case("power3", "pwr3")
1543 .Case("power4", "pwr4")
1544 .Case("power5", "pwr5")
1545 .Case("power5x", "pwr5x")
1546 .Case("power6", "pwr6")
1547 .Case("power6x", "pwr6x")
1548 .Case("power7", "pwr7")
1549 .Case("power8", "pwr8")
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001550 .Case("power9", "pwr9")
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001551 .Case("pwr3", "pwr3")
1552 .Case("pwr4", "pwr4")
1553 .Case("pwr5", "pwr5")
1554 .Case("pwr5x", "pwr5x")
1555 .Case("pwr6", "pwr6")
1556 .Case("pwr6x", "pwr6x")
1557 .Case("pwr7", "pwr7")
1558 .Case("pwr8", "pwr8")
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001559 .Case("pwr9", "pwr9")
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001560 .Case("powerpc", "ppc")
1561 .Case("powerpc64", "ppc64")
1562 .Case("powerpc64le", "ppc64le")
1563 .Default("");
Hal Finkel02a84272012-06-11 22:35:19 +00001564 }
1565
1566 return "";
1567}
1568
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001569static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1570 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001571 std::vector<const char *> &Features) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001572 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001573
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001574 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1575 if (FloatABI == ppc::FloatABI::Soft &&
1576 !(Triple.getArch() == llvm::Triple::ppc64 ||
1577 Triple.getArch() == llvm::Triple::ppc64le))
1578 Features.push_back("+soft-float");
1579 else if (FloatABI == ppc::FloatABI::Soft &&
1580 (Triple.getArch() == llvm::Triple::ppc64 ||
1581 Triple.getArch() == llvm::Triple::ppc64le))
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001582 D.Diag(diag::err_drv_invalid_mfloat_abi)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001583 << "soft float is not supported for ppc64";
1584
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001585 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001586 AddTargetFeature(Args, Features, options::OPT_faltivec,
1587 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001588}
1589
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001590ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1591 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1592 if (Arg *A =
1593 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1594 options::OPT_mfloat_abi_EQ)) {
1595 if (A->getOption().matches(options::OPT_msoft_float))
1596 ABI = ppc::FloatABI::Soft;
1597 else if (A->getOption().matches(options::OPT_mhard_float))
1598 ABI = ppc::FloatABI::Hard;
1599 else {
1600 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1601 .Case("soft", ppc::FloatABI::Soft)
1602 .Case("hard", ppc::FloatABI::Hard)
1603 .Default(ppc::FloatABI::Invalid);
1604 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1605 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1606 ABI = ppc::FloatABI::Hard;
1607 }
1608 }
1609 }
1610
1611 // If unspecified, choose the default based on the platform.
1612 if (ABI == ppc::FloatABI::Invalid) {
1613 ABI = ppc::FloatABI::Hard;
1614 }
1615
1616 return ABI;
1617}
1618
Stephen Hines176edba2014-12-01 14:53:08 -08001619void Clang::AddPPCTargetArgs(const ArgList &Args,
1620 ArgStringList &CmdArgs) const {
1621 // Select the ABI to use.
1622 const char *ABIName = nullptr;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001623 if (getToolChain().getTriple().isOSLinux())
1624 switch (getToolChain().getArch()) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001625 case llvm::Triple::ppc64: {
1626 // When targeting a processor that supports QPX, or if QPX is
1627 // specifically enabled, default to using the ABI that supports QPX (so
1628 // long as it is not specifically disabled).
1629 bool HasQPX = false;
1630 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1631 HasQPX = A->getValue() == StringRef("a2q");
1632 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1633 if (HasQPX) {
1634 ABIName = "elfv1-qpx";
1635 break;
1636 }
1637
Stephen Hines176edba2014-12-01 14:53:08 -08001638 ABIName = "elfv1";
1639 break;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001640 }
Stephen Hines176edba2014-12-01 14:53:08 -08001641 case llvm::Triple::ppc64le:
1642 ABIName = "elfv2";
1643 break;
1644 default:
1645 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001646 }
1647
1648 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1649 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1650 // the option if given as we don't have backend support for any targets
1651 // that don't use the altivec abi.
1652 if (StringRef(A->getValue()) != "altivec")
1653 ABIName = A->getValue();
1654
1655 ppc::FloatABI FloatABI =
1656 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1657
1658 if (FloatABI == ppc::FloatABI::Soft) {
1659 // Floating point operations and argument passing are soft.
1660 CmdArgs.push_back("-msoft-float");
1661 CmdArgs.push_back("-mfloat-abi");
1662 CmdArgs.push_back("soft");
1663 } else {
1664 // Floating point operations and argument passing are hard.
1665 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1666 CmdArgs.push_back("-mfloat-abi");
1667 CmdArgs.push_back("hard");
Stephen Hines176edba2014-12-01 14:53:08 -08001668 }
1669
1670 if (ABIName) {
1671 CmdArgs.push_back("-target-abi");
1672 CmdArgs.push_back(ABIName);
1673 }
1674}
1675
1676bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1677 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1678 return A && (A->getValue() == StringRef(Value));
1679}
1680
Tom Stellarde25d2f62013-04-01 20:56:53 +00001681/// Get the (LLVM) name of the R600 gpu we are targeting.
1682static std::string getR600TargetGPU(const ArgList &Args) {
1683 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001684 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001685 return llvm::StringSwitch<const char *>(GPUName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001686 .Cases("rv630", "rv635", "r600")
1687 .Cases("rv610", "rv620", "rs780", "rs880")
1688 .Case("rv740", "rv770")
1689 .Case("palm", "cedar")
1690 .Cases("sumo", "sumo2", "sumo")
1691 .Case("hemlock", "cypress")
1692 .Case("aruba", "cayman")
1693 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001694 }
1695 return "";
1696}
1697
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001698static std::string getLanaiTargetCPU(const ArgList &Args) {
1699 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1700 return A->getValue();
1701 }
1702 return "";
1703}
1704
1705sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
1706 const ArgList &Args) {
1707 sparc::FloatABI ABI = sparc::FloatABI::Invalid;
1708 if (Arg *A =
1709 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1710 options::OPT_mfloat_abi_EQ)) {
1711 if (A->getOption().matches(options::OPT_msoft_float))
1712 ABI = sparc::FloatABI::Soft;
1713 else if (A->getOption().matches(options::OPT_mhard_float))
1714 ABI = sparc::FloatABI::Hard;
1715 else {
1716 ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue())
1717 .Case("soft", sparc::FloatABI::Soft)
1718 .Case("hard", sparc::FloatABI::Hard)
1719 .Default(sparc::FloatABI::Invalid);
1720 if (ABI == sparc::FloatABI::Invalid &&
1721 !StringRef(A->getValue()).empty()) {
1722 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1723 ABI = sparc::FloatABI::Hard;
1724 }
1725 }
1726 }
1727
1728 // If unspecified, choose the default based on the platform.
1729 // Only the hard-float ABI on Sparc is standardized, and it is the
1730 // default. GCC also supports a nonstandard soft-float ABI mode, also
1731 // implemented in LLVM. However as this is not standard we set the default
1732 // to be hard-float.
1733 if (ABI == sparc::FloatABI::Invalid) {
1734 ABI = sparc::FloatABI::Hard;
1735 }
1736
1737 return ABI;
1738}
1739
1740static void getSparcTargetFeatures(const Driver &D, const ArgList &Args,
1741 std::vector<const char *> &Features) {
1742 sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args);
1743 if (FloatABI == sparc::FloatABI::Soft)
1744 Features.push_back("+soft-float");
1745}
1746
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001747void Clang::AddSparcTargetArgs(const ArgList &Args,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001748 ArgStringList &CmdArgs) const {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001749 sparc::FloatABI FloatABI =
1750 sparc::getSparcFloatABI(getToolChain().getDriver(), Args);
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001751
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001752 if (FloatABI == sparc::FloatABI::Soft) {
1753 // Floating point operations and argument passing are soft.
1754 CmdArgs.push_back("-msoft-float");
1755 CmdArgs.push_back("-mfloat-abi");
1756 CmdArgs.push_back("soft");
1757 } else {
1758 // Floating point operations and argument passing are hard.
1759 assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!");
1760 CmdArgs.push_back("-mfloat-abi");
1761 CmdArgs.push_back("hard");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001762 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001763}
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001764
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001765void Clang::AddSystemZTargetArgs(const ArgList &Args,
1766 ArgStringList &CmdArgs) const {
1767 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false))
1768 CmdArgs.push_back("-mbackchain");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001769}
1770
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001771static const char *getSystemZTargetCPU(const ArgList &Args) {
1772 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1773 return A->getValue();
1774 return "z10";
1775}
1776
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001777static void getSystemZTargetFeatures(const ArgList &Args,
1778 std::vector<const char *> &Features) {
1779 // -m(no-)htm overrides use of the transactional-execution facility.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001780 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001781 if (A->getOption().matches(options::OPT_mhtm))
1782 Features.push_back("+transactional-execution");
1783 else
1784 Features.push_back("-transactional-execution");
1785 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001786 // -m(no-)vx overrides use of the vector facility.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001787 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001788 if (A->getOption().matches(options::OPT_mvx))
1789 Features.push_back("+vector");
1790 else
1791 Features.push_back("-vector");
1792 }
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001793}
1794
Chandler Carruth700d4e42013-01-13 11:46:33 +00001795static const char *getX86TargetCPU(const ArgList &Args,
1796 const llvm::Triple &Triple) {
1797 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001798 if (StringRef(A->getValue()) != "native") {
1799 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1800 return "core-avx2";
1801
Chandler Carruth700d4e42013-01-13 11:46:33 +00001802 return A->getValue();
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001803 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001804
1805 // FIXME: Reject attempts to use -march=native unless the target matches
1806 // the host.
1807 //
1808 // FIXME: We should also incorporate the detected target features for use
1809 // with -native.
1810 std::string CPU = llvm::sys::getHostCPUName();
1811 if (!CPU.empty() && CPU != "generic")
1812 return Args.MakeArgString(CPU);
1813 }
1814
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001815 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1816 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1817 StringRef Arch = A->getValue();
1818 const char *CPU;
1819 if (Triple.getArch() == llvm::Triple::x86) {
1820 CPU = llvm::StringSwitch<const char *>(Arch)
1821 .Case("IA32", "i386")
1822 .Case("SSE", "pentium3")
1823 .Case("SSE2", "pentium4")
1824 .Case("AVX", "sandybridge")
1825 .Case("AVX2", "haswell")
1826 .Default(nullptr);
1827 } else {
1828 CPU = llvm::StringSwitch<const char *>(Arch)
1829 .Case("AVX", "sandybridge")
1830 .Case("AVX2", "haswell")
1831 .Default(nullptr);
1832 }
1833 if (CPU)
1834 return CPU;
1835 }
1836
Chandler Carruth700d4e42013-01-13 11:46:33 +00001837 // Select the default CPU if none was given (or detection failed).
1838
1839 if (Triple.getArch() != llvm::Triple::x86_64 &&
1840 Triple.getArch() != llvm::Triple::x86)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001841 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth700d4e42013-01-13 11:46:33 +00001842
1843 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1844
1845 // FIXME: Need target hooks.
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001846 if (Triple.isOSDarwin()) {
1847 if (Triple.getArchName() == "x86_64h")
1848 return "core-avx2";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001849 return Is64Bit ? "core2" : "yonah";
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001850 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001851
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001852 // Set up default CPU name for PS4 compilers.
1853 if (Triple.isPS4CPU())
1854 return "btver2";
1855
Stephen Hines651f13c2014-04-23 16:59:28 -07001856 // On Android use targets compatible with gcc
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001857 if (Triple.isAndroid())
Stephen Hines651f13c2014-04-23 16:59:28 -07001858 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001859
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001860 // Everything else goes to x86-64 in 64-bit mode.
1861 if (Is64Bit)
1862 return "x86-64";
1863
1864 switch (Triple.getOS()) {
1865 case llvm::Triple::FreeBSD:
1866 case llvm::Triple::NetBSD:
1867 case llvm::Triple::OpenBSD:
1868 return "i486";
1869 case llvm::Triple::Haiku:
1870 return "i586";
1871 case llvm::Triple::Bitrig:
1872 return "i686";
1873 default:
1874 // Fallback to p4.
1875 return "pentium4";
1876 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001877}
1878
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001879/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1880static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1881 // If we have -mcpu=, use that.
1882 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1883 StringRef CPU = A->getValue();
1884
1885#ifdef __wasm__
1886 // Handle "native" by examining the host. "native" isn't meaningful when
1887 // cross compiling, so only support this when the host is also WebAssembly.
1888 if (CPU == "native")
1889 return llvm::sys::getHostCPUName();
1890#endif
1891
1892 return CPU;
1893 }
1894
1895 return "generic";
1896}
1897
1898static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1899 bool FromAs = false) {
1900 switch (T.getArch()) {
Rafael Espindolab330e402013-08-20 22:12:08 +00001901 default:
1902 return "";
1903
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001904 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07001905 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001906 return getAArch64TargetCPU(Args);
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001907
Rafael Espindolab330e402013-08-20 22:12:08 +00001908 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07001909 case llvm::Triple::armeb:
Rafael Espindolab330e402013-08-20 22:12:08 +00001910 case llvm::Triple::thumb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001911 case llvm::Triple::thumbeb: {
1912 StringRef MArch, MCPU;
1913 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
1914 return arm::getARMTargetCPU(MCPU, MArch, T);
1915 }
Rafael Espindolab330e402013-08-20 22:12:08 +00001916 case llvm::Triple::mips:
1917 case llvm::Triple::mipsel:
1918 case llvm::Triple::mips64:
1919 case llvm::Triple::mips64el: {
1920 StringRef CPUName;
1921 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08001922 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindolab330e402013-08-20 22:12:08 +00001923 return CPUName;
1924 }
1925
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001926 case llvm::Triple::nvptx:
1927 case llvm::Triple::nvptx64:
1928 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1929 return A->getValue();
1930 return "";
1931
Rafael Espindolab330e402013-08-20 22:12:08 +00001932 case llvm::Triple::ppc:
1933 case llvm::Triple::ppc64:
1934 case llvm::Triple::ppc64le: {
1935 std::string TargetCPUName = getPPCTargetCPU(Args);
1936 // LLVM may default to generating code for the native CPU,
1937 // but, like gcc, we default to a more generic option for
1938 // each architecture. (except on Darwin)
1939 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1940 if (T.getArch() == llvm::Triple::ppc64)
1941 TargetCPUName = "ppc64";
1942 else if (T.getArch() == llvm::Triple::ppc64le)
1943 TargetCPUName = "ppc64le";
1944 else
1945 TargetCPUName = "ppc";
1946 }
1947 return TargetCPUName;
1948 }
1949
1950 case llvm::Triple::sparc:
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001951 case llvm::Triple::sparcel:
Stephen Hines651f13c2014-04-23 16:59:28 -07001952 case llvm::Triple::sparcv9:
1953 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindolab330e402013-08-20 22:12:08 +00001954 return A->getValue();
1955 return "";
1956
1957 case llvm::Triple::x86:
1958 case llvm::Triple::x86_64:
1959 return getX86TargetCPU(Args, T);
1960
1961 case llvm::Triple::hexagon:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001962 return "hexagon" +
1963 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindolab330e402013-08-20 22:12:08 +00001964
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07001965 case llvm::Triple::lanai:
1966 return getLanaiTargetCPU(Args);
1967
Rafael Espindolab330e402013-08-20 22:12:08 +00001968 case llvm::Triple::systemz:
1969 return getSystemZTargetCPU(Args);
1970
1971 case llvm::Triple::r600:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001972 case llvm::Triple::amdgcn:
Rafael Espindolab330e402013-08-20 22:12:08 +00001973 return getR600TargetGPU(Args);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001974
1975 case llvm::Triple::wasm32:
1976 case llvm::Triple::wasm64:
1977 return getWebAssemblyTargetCPU(Args);
Rafael Espindolab330e402013-08-20 22:12:08 +00001978 }
1979}
1980
Stephen Hines651f13c2014-04-23 16:59:28 -07001981static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001982 ArgStringList &CmdArgs, bool IsThinLTO) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001983 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1984 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1985 // forward.
1986 CmdArgs.push_back("-plugin");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001987 std::string Plugin =
1988 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Stephen Hines651f13c2014-04-23 16:59:28 -07001989 CmdArgs.push_back(Args.MakeArgString(Plugin));
1990
1991 // Try to pass driver level flags relevant to LTO code generation down to
1992 // the plugin.
1993
1994 // Handle flags for selecting CPU variants.
1995 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1996 if (!CPU.empty())
1997 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001998
1999 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2000 StringRef OOpt;
2001 if (A->getOption().matches(options::OPT_O4) ||
2002 A->getOption().matches(options::OPT_Ofast))
2003 OOpt = "3";
2004 else if (A->getOption().matches(options::OPT_O))
2005 OOpt = A->getValue();
2006 else if (A->getOption().matches(options::OPT_O0))
2007 OOpt = "0";
2008 if (!OOpt.empty())
2009 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
2010 }
2011
2012 if (IsThinLTO)
2013 CmdArgs.push_back("-plugin-opt=thinlto");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002014
2015 // If an explicit debugger tuning argument appeared, pass it along.
2016 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
2017 options::OPT_ggdbN_Group)) {
2018 if (A->getOption().matches(options::OPT_glldb))
2019 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
2020 else if (A->getOption().matches(options::OPT_gsce))
2021 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
2022 else
2023 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
2024 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002025}
2026
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002027/// This is a helper function for validating the optional refinement step
2028/// parameter in reciprocal argument strings. Return false if there is an error
2029/// parsing the refinement step. Otherwise, return true and set the Position
2030/// of the refinement step in the input string.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002031static bool getRefinementStep(StringRef In, const Driver &D,
2032 const Arg &A, size_t &Position) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002033 const char RefinementStepToken = ':';
2034 Position = In.find(RefinementStepToken);
2035 if (Position != StringRef::npos) {
2036 StringRef Option = A.getOption().getName();
2037 StringRef RefStep = In.substr(Position + 1);
2038 // Allow exactly one numeric character for the additional refinement
2039 // step parameter. This is reasonable for all currently-supported
2040 // operations and architectures because we would expect that a larger value
2041 // of refinement steps would cause the estimate "optimization" to
2042 // under-perform the native operation. Also, if the estimate does not
2043 // converge quickly, it probably will not ever converge, so further
2044 // refinement steps will not produce a better answer.
2045 if (RefStep.size() != 1) {
2046 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2047 return false;
2048 }
2049 char RefStepChar = RefStep[0];
2050 if (RefStepChar < '0' || RefStepChar > '9') {
2051 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2052 return false;
2053 }
2054 }
2055 return true;
2056}
2057
2058/// The -mrecip flag requires processing of many optional parameters.
2059static void ParseMRecip(const Driver &D, const ArgList &Args,
2060 ArgStringList &OutStrings) {
2061 StringRef DisabledPrefixIn = "!";
2062 StringRef DisabledPrefixOut = "!";
2063 StringRef EnabledPrefixOut = "";
2064 StringRef Out = "-mrecip=";
2065
2066 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
2067 if (!A)
2068 return;
2069
2070 unsigned NumOptions = A->getNumValues();
2071 if (NumOptions == 0) {
2072 // No option is the same as "all".
2073 OutStrings.push_back(Args.MakeArgString(Out + "all"));
2074 return;
2075 }
2076
2077 // Pass through "all", "none", or "default" with an optional refinement step.
2078 if (NumOptions == 1) {
2079 StringRef Val = A->getValue(0);
2080 size_t RefStepLoc;
2081 if (!getRefinementStep(Val, D, *A, RefStepLoc))
2082 return;
2083 StringRef ValBase = Val.slice(0, RefStepLoc);
2084 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
2085 OutStrings.push_back(Args.MakeArgString(Out + Val));
2086 return;
2087 }
2088 }
2089
2090 // Each reciprocal type may be enabled or disabled individually.
2091 // Check each input value for validity, concatenate them all back together,
2092 // and pass through.
2093
2094 llvm::StringMap<bool> OptionStrings;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002095 OptionStrings.insert(std::make_pair("divd", false));
2096 OptionStrings.insert(std::make_pair("divf", false));
2097 OptionStrings.insert(std::make_pair("vec-divd", false));
2098 OptionStrings.insert(std::make_pair("vec-divf", false));
2099 OptionStrings.insert(std::make_pair("sqrtd", false));
2100 OptionStrings.insert(std::make_pair("sqrtf", false));
2101 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
2102 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002103
2104 for (unsigned i = 0; i != NumOptions; ++i) {
2105 StringRef Val = A->getValue(i);
2106
2107 bool IsDisabled = Val.startswith(DisabledPrefixIn);
2108 // Ignore the disablement token for string matching.
2109 if (IsDisabled)
2110 Val = Val.substr(1);
2111
2112 size_t RefStep;
2113 if (!getRefinementStep(Val, D, *A, RefStep))
2114 return;
2115
2116 StringRef ValBase = Val.slice(0, RefStep);
2117 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2118 if (OptionIter == OptionStrings.end()) {
2119 // Try again specifying float suffix.
2120 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2121 if (OptionIter == OptionStrings.end()) {
2122 // The input name did not match any known option string.
2123 D.Diag(diag::err_drv_unknown_argument) << Val;
2124 return;
2125 }
2126 // The option was specified without a float or double suffix.
2127 // Make sure that the double entry was not already specified.
2128 // The float entry will be checked below.
2129 if (OptionStrings[ValBase.str() + 'd']) {
2130 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2131 return;
2132 }
2133 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002134
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002135 if (OptionIter->second == true) {
2136 // Duplicate option specified.
2137 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2138 return;
2139 }
2140
2141 // Mark the matched option as found. Do not allow duplicate specifiers.
2142 OptionIter->second = true;
2143
2144 // If the precision was not specified, also mark the double entry as found.
2145 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2146 OptionStrings[ValBase.str() + 'd'] = true;
2147
2148 // Build the output string.
2149 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2150 Out = Args.MakeArgString(Out + Prefix + Val);
2151 if (i != NumOptions - 1)
2152 Out = Args.MakeArgString(Out + ",");
2153 }
2154
2155 OutStrings.push_back(Args.MakeArgString(Out));
2156}
2157
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002158static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach32ca73e2013-11-16 00:53:35 +00002159 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002160 std::vector<const char *> &Features) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002161 // If -march=native, autodetect the feature list.
2162 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2163 if (StringRef(A->getValue()) == "native") {
2164 llvm::StringMap<bool> HostFeatures;
2165 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2166 for (auto &F : HostFeatures)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002167 Features.push_back(
2168 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002169 }
2170 }
2171
Jim Grosbach32ca73e2013-11-16 00:53:35 +00002172 if (Triple.getArchName() == "x86_64h") {
2173 // x86_64h implies quite a few of the more modern subtarget features
2174 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2175 Features.push_back("-rdrnd");
2176 Features.push_back("-aes");
2177 Features.push_back("-pclmul");
2178 Features.push_back("-rtm");
2179 Features.push_back("-hle");
2180 Features.push_back("-fsgsbase");
2181 }
2182
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002183 const llvm::Triple::ArchType ArchType = Triple.getArch();
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002184 // Add features to be compatible with gcc for Android.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002185 if (Triple.isAndroid()) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002186 if (ArchType == llvm::Triple::x86_64) {
Stephen Hinesef822542014-07-21 00:47:37 -07002187 Features.push_back("+sse4.2");
2188 Features.push_back("+popcnt");
2189 } else
2190 Features.push_back("+ssse3");
Stephen Hines651f13c2014-04-23 16:59:28 -07002191 }
2192
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002193 // Set features according to the -arch flag on MSVC.
Stephen Hines176edba2014-12-01 14:53:08 -08002194 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2195 StringRef Arch = A->getValue();
2196 bool ArchUsed = false;
2197 // First, look for flags that are shared in x86 and x86-64.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002198 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Stephen Hines176edba2014-12-01 14:53:08 -08002199 if (Arch == "AVX" || Arch == "AVX2") {
2200 ArchUsed = true;
2201 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2202 }
2203 }
2204 // Then, look for x86-specific flags.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002205 if (ArchType == llvm::Triple::x86) {
Stephen Hines176edba2014-12-01 14:53:08 -08002206 if (Arch == "IA32") {
2207 ArchUsed = true;
2208 } else if (Arch == "SSE" || Arch == "SSE2") {
2209 ArchUsed = true;
2210 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2211 }
2212 }
2213 if (!ArchUsed)
2214 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2215 }
2216
Jim Grosbach32ca73e2013-11-16 00:53:35 +00002217 // Now add any that the user explicitly requested on the command line,
2218 // which may override the defaults.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002219 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002220}
2221
Daniel Dunbar6acda162009-09-09 22:33:08 +00002222void Clang::AddX86TargetArgs(const ArgList &Args,
2223 ArgStringList &CmdArgs) const {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002224 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00002225 Args.hasArg(options::OPT_mkernel) ||
2226 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002227 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00002228
Bob Wilsonf0c54562013-02-10 16:01:41 +00002229 // Default to avoid implicit floating-point for kernel/kext code, but allow
2230 // that to be overridden with -mno-soft-float.
2231 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2232 Args.hasArg(options::OPT_fapple_kext));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002233 if (Arg *A = Args.getLastArg(
2234 options::OPT_msoft_float, options::OPT_mno_soft_float,
2235 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilsonf0c54562013-02-10 16:01:41 +00002236 const Option &O = A->getOption();
2237 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2238 O.matches(options::OPT_msoft_float));
2239 }
2240 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00002241 CmdArgs.push_back("-no-implicit-float");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002242
2243 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2244 StringRef Value = A->getValue();
2245 if (Value == "intel" || Value == "att") {
2246 CmdArgs.push_back("-mllvm");
2247 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2248 } else {
2249 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2250 << A->getOption().getName() << Value;
2251 }
2252 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002253
2254 // Set flags to support MCU ABI.
2255 if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) {
2256 CmdArgs.push_back("-mfloat-abi");
2257 CmdArgs.push_back("soft");
2258 CmdArgs.push_back("-mstack-alignment=4");
2259 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00002260}
2261
Tony Linthicum96319392011-12-12 21:14:55 +00002262void Clang::AddHexagonTargetArgs(const ArgList &Args,
2263 ArgStringList &CmdArgs) const {
Matthew Curtis1dbaef52012-12-07 13:52:44 +00002264 CmdArgs.push_back("-mqdsp6-compat");
2265 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00002266
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002267 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2268 std::string N = llvm::utostr(G.getValue());
2269 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
2270 CmdArgs.push_back("-mllvm");
2271 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum96319392011-12-12 21:14:55 +00002272 }
2273
Sirish Pande5f9688b2012-05-10 20:19:54 +00002274 if (!Args.hasArg(options::OPT_fno_short_enums))
2275 CmdArgs.push_back("-fshort-enums");
2276 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002277 CmdArgs.push_back("-mllvm");
2278 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande5f9688b2012-05-10 20:19:54 +00002279 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002280 CmdArgs.push_back("-mllvm");
2281 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum96319392011-12-12 21:14:55 +00002282}
2283
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002284void Clang::AddLanaiTargetArgs(const ArgList &Args,
2285 ArgStringList &CmdArgs) const {
2286 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2287 StringRef CPUName = A->getValue();
2288
2289 CmdArgs.push_back("-target-cpu");
2290 CmdArgs.push_back(Args.MakeArgString(CPUName));
2291 }
2292 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2293 StringRef Value = A->getValue();
2294 // Only support mregparm=4 to support old usage. Report error for all other
2295 // cases.
2296 int Mregparm;
2297 if (Value.getAsInteger(10, Mregparm)) {
2298 if (Mregparm != 4) {
2299 getToolChain().getDriver().Diag(
2300 diag::err_drv_unsupported_option_argument)
2301 << A->getOption().getName() << Value;
2302 }
2303 }
2304 }
2305}
2306
2307void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2308 ArgStringList &CmdArgs) const {
2309 // Default to "hidden" visibility.
2310 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2311 options::OPT_fvisibility_ms_compat)) {
2312 CmdArgs.push_back("-fvisibility");
2313 CmdArgs.push_back("hidden");
2314 }
2315}
2316
Stephen Hines176edba2014-12-01 14:53:08 -08002317// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
2318static bool DecodeAArch64Features(const Driver &D, StringRef text,
2319 std::vector<const char *> &Features) {
2320 SmallVector<StringRef, 8> Split;
2321 text.split(Split, StringRef("+"), -1, false);
2322
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002323 for (StringRef Feature : Split) {
2324 const char *result = llvm::StringSwitch<const char *>(Feature)
Stephen Hines176edba2014-12-01 14:53:08 -08002325 .Case("fp", "+fp-armv8")
2326 .Case("simd", "+neon")
2327 .Case("crc", "+crc")
2328 .Case("crypto", "+crypto")
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002329 .Case("fp16", "+fullfp16")
2330 .Case("profile", "+spe")
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002331 .Case("ras", "+ras")
Stephen Hines176edba2014-12-01 14:53:08 -08002332 .Case("nofp", "-fp-armv8")
2333 .Case("nosimd", "-neon")
2334 .Case("nocrc", "-crc")
2335 .Case("nocrypto", "-crypto")
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002336 .Case("nofp16", "-fullfp16")
2337 .Case("noprofile", "-spe")
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002338 .Case("noras", "-ras")
Stephen Hines176edba2014-12-01 14:53:08 -08002339 .Default(nullptr);
2340 if (result)
2341 Features.push_back(result);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002342 else if (Feature == "neon" || Feature == "noneon")
Stephen Hines176edba2014-12-01 14:53:08 -08002343 D.Diag(diag::err_drv_no_neon_modifier);
2344 else
2345 return false;
2346 }
2347 return true;
2348}
2349
2350// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2351// decode CPU and feature.
2352static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2353 std::vector<const char *> &Features) {
2354 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2355 CPU = Split.first;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002356 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
2357 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2358 CPU == "kryo" || CPU == "cortex-a73" || CPU == "vulcan") {
Stephen Hines176edba2014-12-01 14:53:08 -08002359 Features.push_back("+neon");
2360 Features.push_back("+crc");
2361 Features.push_back("+crypto");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002362 } else if (CPU == "cyclone") {
2363 Features.push_back("+neon");
2364 Features.push_back("+crypto");
Stephen Hines176edba2014-12-01 14:53:08 -08002365 } else if (CPU == "generic") {
2366 Features.push_back("+neon");
2367 } else {
2368 return false;
2369 }
2370
2371 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2372 return false;
2373
2374 return true;
2375}
2376
2377static bool
2378getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2379 const ArgList &Args,
2380 std::vector<const char *> &Features) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002381 std::string MarchLowerCase = March.lower();
2382 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002383
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002384 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002385 // ok, no additional features.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002386 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002387 Features.push_back("+v8.1a");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002388 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2389 Features.push_back("+v8.2a");
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002390 } else {
Stephen Hines176edba2014-12-01 14:53:08 -08002391 return false;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002392 }
Stephen Hines176edba2014-12-01 14:53:08 -08002393
2394 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2395 return false;
2396
2397 return true;
2398}
2399
2400static bool
2401getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2402 const ArgList &Args,
2403 std::vector<const char *> &Features) {
2404 StringRef CPU;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002405 std::string McpuLowerCase = Mcpu.lower();
2406 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Stephen Hines176edba2014-12-01 14:53:08 -08002407 return false;
2408
2409 return true;
2410}
2411
2412static bool
2413getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2414 const ArgList &Args,
2415 std::vector<const char *> &Features) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002416 std::string MtuneLowerCase = Mtune.lower();
Stephen Hines176edba2014-12-01 14:53:08 -08002417 // Handle CPU name is 'native'.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002418 if (MtuneLowerCase == "native")
2419 MtuneLowerCase = llvm::sys::getHostCPUName();
2420 if (MtuneLowerCase == "cyclone") {
Stephen Hines176edba2014-12-01 14:53:08 -08002421 Features.push_back("+zcm");
2422 Features.push_back("+zcz");
2423 }
2424 return true;
2425}
2426
2427static bool
2428getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2429 const ArgList &Args,
2430 std::vector<const char *> &Features) {
2431 StringRef CPU;
2432 std::vector<const char *> DecodedFeature;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002433 std::string McpuLowerCase = Mcpu.lower();
2434 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Stephen Hines176edba2014-12-01 14:53:08 -08002435 return false;
2436
2437 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2438}
2439
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002440static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
2441 std::vector<const char *> &Features) {
Stephen Hines176edba2014-12-01 14:53:08 -08002442 Arg *A;
2443 bool success = true;
2444 // Enable NEON by default.
2445 Features.push_back("+neon");
2446 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2447 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2448 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2449 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
2450 else if (Args.hasArg(options::OPT_arch))
2451 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2452 Features);
2453
2454 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2455 success =
2456 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2457 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2458 success =
2459 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
2460 else if (Args.hasArg(options::OPT_arch))
2461 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2462 Args, Features);
2463
2464 if (!success)
2465 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07002466
2467 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2468 Features.push_back("-fp-armv8");
2469 Features.push_back("-crypto");
2470 Features.push_back("-neon");
2471 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002472
2473 // En/disable crc
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002474 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002475 if (A->getOption().matches(options::OPT_mcrc))
2476 Features.push_back("+crc");
2477 else
2478 Features.push_back("-crc");
2479 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002480
2481 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2482 options::OPT_munaligned_access))
2483 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2484 Features.push_back("+strict-align");
2485
2486 if (Args.hasArg(options::OPT_ffixed_x18))
2487 Features.push_back("+reserve-x18");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002488}
2489
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002490static void getHexagonTargetFeatures(const ArgList &Args,
2491 std::vector<const char *> &Features) {
2492 bool HasHVX = false, HasHVXD = false;
2493
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002494 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2495 // doing dependent option handling here rather than in initFeatureMap or a
2496 // similar handler.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002497 for (auto &A : Args) {
2498 auto &Opt = A->getOption();
2499 if (Opt.matches(options::OPT_mhexagon_hvx))
2500 HasHVX = true;
2501 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2502 HasHVXD = HasHVX = false;
2503 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2504 HasHVXD = HasHVX = true;
2505 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2506 HasHVXD = false;
2507 else
2508 continue;
2509 A->claim();
2510 }
2511
2512 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2513 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2514}
2515
2516static void getWebAssemblyTargetFeatures(const ArgList &Args,
2517 std::vector<const char *> &Features) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002518 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
2519}
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002520
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002521static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2522 std::vector<const char *> &Features) {
2523 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2524 StringRef value = dAbi->getValue();
2525 if (value == "1.0") {
2526 Features.push_back("+amdgpu-debugger-insert-nops");
2527 Features.push_back("+amdgpu-debugger-reserve-regs");
2528 Features.push_back("+amdgpu-debugger-emit-prologue");
2529 } else {
2530 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2531 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002532 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002533
2534 handleTargetFeaturesGroup(
2535 Args, Features, options::OPT_m_amdgpu_Features_Group);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002536}
2537
2538static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Stephen Hines651f13c2014-04-23 16:59:28 -07002539 const ArgList &Args, ArgStringList &CmdArgs,
2540 bool ForAS) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002541 const Driver &D = TC.getDriver();
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002542 std::vector<const char *> Features;
2543 switch (Triple.getArch()) {
2544 default:
2545 break;
2546 case llvm::Triple::mips:
2547 case llvm::Triple::mipsel:
2548 case llvm::Triple::mips64:
2549 case llvm::Triple::mips64el:
Stephen Hines176edba2014-12-01 14:53:08 -08002550 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002551 break;
2552
2553 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07002554 case llvm::Triple::armeb:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002555 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07002556 case llvm::Triple::thumbeb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002557 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002558 break;
2559
2560 case llvm::Triple::ppc:
2561 case llvm::Triple::ppc64:
2562 case llvm::Triple::ppc64le:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002563 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002564 break;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002565 case llvm::Triple::systemz:
2566 getSystemZTargetFeatures(Args, Features);
2567 break;
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002568 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07002569 case llvm::Triple::aarch64_be:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002570 getAArch64TargetFeatures(D, Args, Features);
2571 break;
2572 case llvm::Triple::x86:
2573 case llvm::Triple::x86_64:
Stephen Hines176edba2014-12-01 14:53:08 -08002574 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002575 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002576 case llvm::Triple::hexagon:
2577 getHexagonTargetFeatures(Args, Features);
2578 break;
2579 case llvm::Triple::wasm32:
2580 case llvm::Triple::wasm64:
2581 getWebAssemblyTargetFeatures(Args, Features);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002582 break;
2583 case llvm::Triple::sparc:
2584 case llvm::Triple::sparcel:
2585 case llvm::Triple::sparcv9:
2586 getSparcTargetFeatures(D, Args, Features);
2587 break;
2588 case llvm::Triple::r600:
2589 case llvm::Triple::amdgcn:
2590 getAMDGPUTargetFeatures(D, Args, Features);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002591 break;
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002592 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00002593
2594 // Find the last of each feature.
2595 llvm::StringMap<unsigned> LastOpt;
2596 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2597 const char *Name = Features[I];
2598 assert(Name[0] == '-' || Name[0] == '+');
2599 LastOpt[Name + 1] = I;
2600 }
2601
2602 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2603 // If this feature was overridden, ignore it.
2604 const char *Name = Features[I];
2605 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2606 assert(LastI != LastOpt.end());
2607 unsigned Last = LastI->second;
2608 if (Last != I)
2609 continue;
2610
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002611 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00002612 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002613 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00002614}
2615
Eric Christopher88b7cf02011-08-19 00:30:14 +00002616static bool
John McCall260611a2012-06-20 06:18:46 +00002617shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00002618 const llvm::Triple &Triple) {
2619 // We use the zero-cost exception tables for Objective-C if the non-fragile
2620 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2621 // later.
John McCall260611a2012-06-20 06:18:46 +00002622 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00002623 return true;
2624
Stephen Hines651f13c2014-04-23 16:59:28 -07002625 if (!Triple.isMacOSX())
Anders Carlsson525544d2011-02-28 00:44:51 +00002626 return false;
2627
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002628 return (!Triple.isMacOSXVersionLT(10, 5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00002629 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00002630 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00002631}
2632
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002633/// Adds exception related arguments to the driver command arguments. There's a
2634/// master flag, -fexceptions and also language specific flags to enable/disable
2635/// C++ and Objective-C exceptions. This makes it possible to for example
2636/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlsson15348ae2011-02-28 02:27:16 +00002637static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002638 const ToolChain &TC, bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00002639 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00002640 ArgStringList &CmdArgs) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002641 const Driver &D = TC.getDriver();
2642 const llvm::Triple &Triple = TC.getTriple();
2643
Chad Rosierafc4baa2012-03-26 22:04:46 +00002644 if (KernelOrKext) {
2645 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2646 // arguments now to avoid warnings about unused arguments.
2647 Args.ClaimAllArgs(options::OPT_fexceptions);
2648 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2649 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2650 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2651 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2652 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002653 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00002654 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00002655
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002656 // See if the user explicitly enabled exceptions.
2657 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2658 false);
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00002659
Daniel Dunbard47ea692011-03-17 23:28:31 +00002660 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2661 // is not necessarily sensible, but follows GCC.
2662 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00002663 Args.hasFlag(options::OPT_fobjc_exceptions,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002664 options::OPT_fno_objc_exceptions, true)) {
Daniel Dunbard47ea692011-03-17 23:28:31 +00002665 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00002666
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002667 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002668 }
2669
2670 if (types::isCXX(InputType)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002671 // Disable C++ EH by default on XCore and PS4.
2672 bool CXXExceptionsEnabled =
2673 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002674 Arg *ExceptionArg = Args.getLastArg(
2675 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2676 options::OPT_fexceptions, options::OPT_fno_exceptions);
2677 if (ExceptionArg)
2678 CXXExceptionsEnabled =
2679 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2680 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002681
2682 if (CXXExceptionsEnabled) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002683 if (Triple.isPS4CPU()) {
2684 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2685 assert(ExceptionArg &&
2686 "On the PS4 exceptions should only be enabled if passing "
2687 "an argument");
2688 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2689 const Arg *RTTIArg = TC.getRTTIArg();
2690 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2691 D.Diag(diag::err_drv_argument_not_allowed_with)
2692 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2693 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2694 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2695 } else
2696 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2697
Anders Carlsson15348ae2011-02-28 02:27:16 +00002698 CmdArgs.push_back("-fcxx-exceptions");
2699
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002700 EH = true;
Anders Carlsson15348ae2011-02-28 02:27:16 +00002701 }
2702 }
2703
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002704 if (EH)
Anders Carlsson15348ae2011-02-28 02:27:16 +00002705 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00002706}
2707
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002708static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbarf4910132013-04-16 18:21:19 +00002709 bool Default = true;
2710 if (TC.getTriple().isOSDarwin()) {
2711 // The native darwin assembler doesn't support the linker_option directives,
2712 // so we disable them if we think the .s file will be passed to it.
2713 Default = TC.useIntegratedAs();
2714 }
2715 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2716 Default);
2717}
2718
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00002719static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2720 const ToolChain &TC) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002721 bool UseDwarfDirectory =
2722 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2723 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00002724 return !UseDwarfDirectory;
2725}
2726
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002727/// \brief Check whether the given input tree contains any compilation actions.
2728static bool ContainsCompileAction(const Action *A) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002729 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002730 return true;
2731
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002732 for (const auto &AI : A->inputs())
2733 if (ContainsCompileAction(AI))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002734 return true;
2735
2736 return false;
2737}
2738
2739/// \brief Check if -relax-all should be passed to the internal assembler.
2740/// This is done by default when compiling non-assembler source with -O0.
2741static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2742 bool RelaxDefault = true;
2743
2744 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2745 RelaxDefault = A->getOption().matches(options::OPT_O0);
2746
2747 if (RelaxDefault) {
2748 RelaxDefault = false;
Stephen Hinesef822542014-07-21 00:47:37 -07002749 for (const auto &Act : C.getActions()) {
2750 if (ContainsCompileAction(Act)) {
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002751 RelaxDefault = true;
2752 break;
2753 }
2754 }
2755 }
2756
2757 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002758 RelaxDefault);
2759}
2760
2761// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2762// to the corresponding DebugInfoKind.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002763static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002764 assert(A.getOption().matches(options::OPT_gN_Group) &&
2765 "Not a -g option that specifies a debug-info level");
2766 if (A.getOption().matches(options::OPT_g0) ||
2767 A.getOption().matches(options::OPT_ggdb0))
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002768 return codegenoptions::NoDebugInfo;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002769 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2770 A.getOption().matches(options::OPT_ggdb1))
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002771 return codegenoptions::DebugLineTablesOnly;
2772 return codegenoptions::LimitedDebugInfo;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002773}
2774
2775// Extract the integer N from a string spelled "-dwarf-N", returning 0
2776// on mismatch. The StringRef input (rather than an Arg) allows
2777// for use by the "-Xassembler" option parser.
2778static unsigned DwarfVersionNum(StringRef ArgValue) {
2779 return llvm::StringSwitch<unsigned>(ArgValue)
2780 .Case("-gdwarf-2", 2)
2781 .Case("-gdwarf-3", 3)
2782 .Case("-gdwarf-4", 4)
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002783 .Case("-gdwarf-5", 5)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002784 .Default(0);
2785}
2786
2787static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002788 codegenoptions::DebugInfoKind DebugInfoKind,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002789 unsigned DwarfVersion,
2790 llvm::DebuggerKind DebuggerTuning) {
2791 switch (DebugInfoKind) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002792 case codegenoptions::DebugLineTablesOnly:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002793 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2794 break;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002795 case codegenoptions::LimitedDebugInfo:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002796 CmdArgs.push_back("-debug-info-kind=limited");
2797 break;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002798 case codegenoptions::FullDebugInfo:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002799 CmdArgs.push_back("-debug-info-kind=standalone");
2800 break;
2801 default:
2802 break;
2803 }
2804 if (DwarfVersion > 0)
2805 CmdArgs.push_back(
2806 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
2807 switch (DebuggerTuning) {
2808 case llvm::DebuggerKind::GDB:
2809 CmdArgs.push_back("-debugger-tuning=gdb");
2810 break;
2811 case llvm::DebuggerKind::LLDB:
2812 CmdArgs.push_back("-debugger-tuning=lldb");
2813 break;
2814 case llvm::DebuggerKind::SCE:
2815 CmdArgs.push_back("-debugger-tuning=sce");
2816 break;
2817 default:
2818 break;
2819 }
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002820}
2821
David Blaikie73168db2013-07-25 21:19:01 +00002822static void CollectArgsForIntegratedAssembler(Compilation &C,
2823 const ArgList &Args,
2824 ArgStringList &CmdArgs,
2825 const Driver &D) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002826 if (UseRelaxAll(C, Args))
2827 CmdArgs.push_back("-mrelax-all");
David Blaikie73168db2013-07-25 21:19:01 +00002828
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002829 // Only default to -mincremental-linker-compatible if we think we are
2830 // targeting the MSVC linker.
2831 bool DefaultIncrementalLinkerCompatible =
2832 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2833 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2834 options::OPT_mno_incremental_linker_compatible,
2835 DefaultIncrementalLinkerCompatible))
2836 CmdArgs.push_back("-mincremental-linker-compatible");
David Peixotto4ca9eae2013-11-14 22:52:58 +00002837
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002838 // When passing -I arguments to the assembler we sometimes need to
2839 // unconditionally take the next argument. For example, when parsing
2840 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2841 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2842 // arg after parsing the '-I' arg.
2843 bool TakeNextArg = false;
David Blaikie73168db2013-07-25 21:19:01 +00002844
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002845 // When using an integrated assembler, translate -Wa, and -Xassembler
2846 // options.
2847 bool CompressDebugSections = false;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002848
2849 bool UseRelaxRelocations = ENABLE_X86_RELAX_RELOCATIONS;
2850 const char *MipsTargetFeature = nullptr;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002851 for (const Arg *A :
2852 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2853 A->claim();
2854
2855 for (StringRef Value : A->getValues()) {
2856 if (TakeNextArg) {
2857 CmdArgs.push_back(Value.data());
2858 TakeNextArg = false;
2859 continue;
2860 }
2861
2862 switch (C.getDefaultToolChain().getArch()) {
2863 default:
2864 break;
2865 case llvm::Triple::mips:
2866 case llvm::Triple::mipsel:
2867 case llvm::Triple::mips64:
2868 case llvm::Triple::mips64el:
2869 if (Value == "--trap") {
2870 CmdArgs.push_back("-target-feature");
2871 CmdArgs.push_back("+use-tcc-in-div");
David Peixotto4ca9eae2013-11-14 22:52:58 +00002872 continue;
2873 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002874 if (Value == "--break") {
2875 CmdArgs.push_back("-target-feature");
2876 CmdArgs.push_back("-use-tcc-in-div");
2877 continue;
2878 }
2879 if (Value.startswith("-msoft-float")) {
2880 CmdArgs.push_back("-target-feature");
2881 CmdArgs.push_back("+soft-float");
2882 continue;
2883 }
2884 if (Value.startswith("-mhard-float")) {
2885 CmdArgs.push_back("-target-feature");
2886 CmdArgs.push_back("-soft-float");
2887 continue;
2888 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002889
2890 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2891 .Case("-mips1", "+mips1")
2892 .Case("-mips2", "+mips2")
2893 .Case("-mips3", "+mips3")
2894 .Case("-mips4", "+mips4")
2895 .Case("-mips5", "+mips5")
2896 .Case("-mips32", "+mips32")
2897 .Case("-mips32r2", "+mips32r2")
2898 .Case("-mips32r3", "+mips32r3")
2899 .Case("-mips32r5", "+mips32r5")
2900 .Case("-mips32r6", "+mips32r6")
2901 .Case("-mips64", "+mips64")
2902 .Case("-mips64r2", "+mips64r2")
2903 .Case("-mips64r3", "+mips64r3")
2904 .Case("-mips64r5", "+mips64r5")
2905 .Case("-mips64r6", "+mips64r6")
2906 .Default(nullptr);
2907 if (MipsTargetFeature)
2908 continue;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002909 }
David Blaikie73168db2013-07-25 21:19:01 +00002910
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002911 if (Value == "-force_cpusubtype_ALL") {
2912 // Do nothing, this is the default and we don't support anything else.
2913 } else if (Value == "-L") {
2914 CmdArgs.push_back("-msave-temp-labels");
2915 } else if (Value == "--fatal-warnings") {
2916 CmdArgs.push_back("-massembler-fatal-warnings");
2917 } else if (Value == "--noexecstack") {
2918 CmdArgs.push_back("-mnoexecstack");
2919 } else if (Value == "-compress-debug-sections" ||
2920 Value == "--compress-debug-sections") {
2921 CompressDebugSections = true;
2922 } else if (Value == "-nocompress-debug-sections" ||
2923 Value == "--nocompress-debug-sections") {
2924 CompressDebugSections = false;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002925 } else if (Value == "-mrelax-relocations=yes" ||
2926 Value == "--mrelax-relocations=yes") {
2927 UseRelaxRelocations = true;
2928 } else if (Value == "-mrelax-relocations=no" ||
2929 Value == "--mrelax-relocations=no") {
2930 UseRelaxRelocations = false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002931 } else if (Value.startswith("-I")) {
2932 CmdArgs.push_back(Value.data());
2933 // We need to consume the next argument if the current arg is a plain
2934 // -I. The next arg will be the include directory.
2935 if (Value == "-I")
2936 TakeNextArg = true;
2937 } else if (Value.startswith("-gdwarf-")) {
2938 // "-gdwarf-N" options are not cc1as options.
2939 unsigned DwarfVersion = DwarfVersionNum(Value);
2940 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002941 CmdArgs.push_back(Value.data());
David Blaikie73168db2013-07-25 21:19:01 +00002942 } else {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002943 RenderDebugEnablingArgs(Args, CmdArgs,
2944 codegenoptions::LimitedDebugInfo,
2945 DwarfVersion, llvm::DebuggerKind::Default);
David Blaikie73168db2013-07-25 21:19:01 +00002946 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002947 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2948 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2949 // Do nothing, we'll validate it later.
2950 } else {
2951 D.Diag(diag::err_drv_unsupported_option_argument)
2952 << A->getOption().getName() << Value;
David Blaikie73168db2013-07-25 21:19:01 +00002953 }
2954 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002955 }
2956 if (CompressDebugSections) {
2957 if (llvm::zlib::isAvailable())
2958 CmdArgs.push_back("-compress-debug-sections");
2959 else
2960 D.Diag(diag::warn_debug_compression_unavailable);
2961 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07002962 if (UseRelaxRelocations)
2963 CmdArgs.push_back("--mrelax-relocations");
2964 if (MipsTargetFeature != nullptr) {
2965 CmdArgs.push_back("-target-feature");
2966 CmdArgs.push_back(MipsTargetFeature);
2967 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002968}
2969
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002970// This adds the static libclang_rt.builtins-arch.a directly to the command line
Stephen Hines651f13c2014-04-23 16:59:28 -07002971// FIXME: Make sure we can also emit shared objects if they're requested
2972// and available, check for possible errors, etc.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002973static void addClangRT(const ToolChain &TC, const ArgList &Args,
2974 ArgStringList &CmdArgs) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002975 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Stephen Hines651f13c2014-04-23 16:59:28 -07002976}
2977
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002978namespace {
2979enum OpenMPRuntimeKind {
2980 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2981 /// without knowing what runtime to target.
2982 OMPRT_Unknown,
2983
2984 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2985 /// the default for Clang.
2986 OMPRT_OMP,
2987
2988 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2989 /// this runtime but can swallow the pragmas, and find and link against the
2990 /// runtime library itself.
2991 OMPRT_GOMP,
2992
2993 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
2994 /// OpenMP runtime. We support this mode for users with existing dependencies
2995 /// on this runtime library name.
2996 OMPRT_IOMP5
2997};
2998}
2999
3000/// Compute the desired OpenMP runtime from the flag provided.
3001static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
3002 const ArgList &Args) {
3003 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
3004
3005 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
3006 if (A)
3007 RuntimeName = A->getValue();
3008
3009 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003010 .Case("libomp", OMPRT_OMP)
3011 .Case("libgomp", OMPRT_GOMP)
3012 .Case("libiomp5", OMPRT_IOMP5)
3013 .Default(OMPRT_Unknown);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003014
3015 if (RT == OMPRT_Unknown) {
3016 if (A)
3017 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003018 << A->getOption().getName() << A->getValue();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003019 else
3020 // FIXME: We could use a nicer diagnostic here.
3021 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
3022 }
3023
3024 return RT;
3025}
3026
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003027static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
3028 const ArgList &Args) {
3029 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3030 options::OPT_fno_openmp, false))
3031 return;
3032
3033 switch (getOpenMPRuntime(TC, Args)) {
3034 case OMPRT_OMP:
3035 CmdArgs.push_back("-lomp");
3036 break;
3037 case OMPRT_GOMP:
3038 CmdArgs.push_back("-lgomp");
3039 break;
3040 case OMPRT_IOMP5:
3041 CmdArgs.push_back("-liomp5");
3042 break;
3043 case OMPRT_Unknown:
3044 // Already diagnosed.
3045 break;
3046 }
3047}
3048
Stephen Hines176edba2014-12-01 14:53:08 -08003049static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
3050 ArgStringList &CmdArgs, StringRef Sanitizer,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003051 bool IsShared, bool IsWhole) {
3052 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournebf548552013-10-20 21:29:13 +00003053 // whole-archive.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003054 if (IsWhole) CmdArgs.push_back("-whole-archive");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003055 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003056 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonov86143042013-02-27 11:14:55 +00003057}
3058
Stephen Hines176edba2014-12-01 14:53:08 -08003059// Tries to use a file with the list of dynamic symbols that need to be exported
3060// from the runtime library. Returns true if the file was found.
3061static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
3062 ArgStringList &CmdArgs,
3063 StringRef Sanitizer) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003064 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003065 if (llvm::sys::fs::exists(SanRT + ".syms")) {
3066 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Stephen Hines176edba2014-12-01 14:53:08 -08003067 return true;
3068 }
3069 return false;
3070}
3071
3072static void linkSanitizerRuntimeDeps(const ToolChain &TC,
3073 ArgStringList &CmdArgs) {
3074 // Force linking against the system libraries sanitizers depends on
3075 // (see PR15823 why this is necessary).
3076 CmdArgs.push_back("--no-as-needed");
3077 CmdArgs.push_back("-lpthread");
3078 CmdArgs.push_back("-lrt");
3079 CmdArgs.push_back("-lm");
3080 // There's no libdl on FreeBSD.
3081 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3082 CmdArgs.push_back("-ldl");
3083}
3084
3085static void
3086collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
3087 SmallVectorImpl<StringRef> &SharedRuntimes,
3088 SmallVectorImpl<StringRef> &StaticRuntimes,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003089 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
3090 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
3091 SmallVectorImpl<StringRef> &RequiredSymbols) {
Stephen Hines176edba2014-12-01 14:53:08 -08003092 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
3093 // Collect shared runtimes.
3094 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
3095 SharedRuntimes.push_back("asan");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00003096 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003097 // The stats_client library is also statically linked into DSOs.
3098 if (SanArgs.needsStatsRt())
3099 StaticRuntimes.push_back("stats_client");
Stephen Hines651f13c2014-04-23 16:59:28 -07003100
Stephen Hines176edba2014-12-01 14:53:08 -08003101 // Collect static runtimes.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003102 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Stephen Hines176edba2014-12-01 14:53:08 -08003103 // Don't link static runtimes into DSOs or if compiling for Android.
Stephen Hines651f13c2014-04-23 16:59:28 -07003104 return;
Stephen Hines176edba2014-12-01 14:53:08 -08003105 }
3106 if (SanArgs.needsAsanRt()) {
3107 if (SanArgs.needsSharedAsanRt()) {
3108 HelperStaticRuntimes.push_back("asan-preinit");
3109 } else {
3110 StaticRuntimes.push_back("asan");
3111 if (SanArgs.linkCXXRuntimes())
3112 StaticRuntimes.push_back("asan_cxx");
3113 }
3114 }
3115 if (SanArgs.needsDfsanRt())
3116 StaticRuntimes.push_back("dfsan");
3117 if (SanArgs.needsLsanRt())
3118 StaticRuntimes.push_back("lsan");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003119 if (SanArgs.needsMsanRt()) {
Stephen Hines176edba2014-12-01 14:53:08 -08003120 StaticRuntimes.push_back("msan");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003121 if (SanArgs.linkCXXRuntimes())
3122 StaticRuntimes.push_back("msan_cxx");
3123 }
3124 if (SanArgs.needsTsanRt()) {
Stephen Hines176edba2014-12-01 14:53:08 -08003125 StaticRuntimes.push_back("tsan");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003126 if (SanArgs.linkCXXRuntimes())
3127 StaticRuntimes.push_back("tsan_cxx");
3128 }
Stephen Hines176edba2014-12-01 14:53:08 -08003129 if (SanArgs.needsUbsanRt()) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07003130 StaticRuntimes.push_back("ubsan_standalone");
3131 if (SanArgs.linkCXXRuntimes())
3132 StaticRuntimes.push_back("ubsan_standalone_cxx");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003133 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003134 if (SanArgs.needsSafeStackRt())
3135 StaticRuntimes.push_back("safestack");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003136 if (SanArgs.needsCfiRt())
3137 StaticRuntimes.push_back("cfi");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003138 if (SanArgs.needsCfiDiagRt()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003139 StaticRuntimes.push_back("cfi_diag");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003140 if (SanArgs.linkCXXRuntimes())
3141 StaticRuntimes.push_back("ubsan_standalone_cxx");
3142 }
3143 if (SanArgs.needsStatsRt()) {
3144 NonWholeStaticRuntimes.push_back("stats");
3145 RequiredSymbols.push_back("__sanitizer_stats_register");
3146 }
3147 if (SanArgs.needsEsanRt())
3148 StaticRuntimes.push_back("esan");
Kostya Serebryanydff466c2011-11-30 01:39:16 +00003149}
3150
Stephen Hines176edba2014-12-01 14:53:08 -08003151// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3152// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3153static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Stephen Hines651f13c2014-04-23 16:59:28 -07003154 ArgStringList &CmdArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08003155 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003156 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Stephen Hines176edba2014-12-01 14:53:08 -08003157 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003158 NonWholeStaticRuntimes, HelperStaticRuntimes,
3159 RequiredSymbols);
Stephen Hines176edba2014-12-01 14:53:08 -08003160 for (auto RT : SharedRuntimes)
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003161 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Stephen Hines176edba2014-12-01 14:53:08 -08003162 for (auto RT : HelperStaticRuntimes)
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003163 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Stephen Hines176edba2014-12-01 14:53:08 -08003164 bool AddExportDynamic = false;
3165 for (auto RT : StaticRuntimes) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003166 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Stephen Hines176edba2014-12-01 14:53:08 -08003167 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3168 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003169 for (auto RT : NonWholeStaticRuntimes) {
3170 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3171 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3172 }
3173 for (auto S : RequiredSymbols) {
3174 CmdArgs.push_back("-u");
3175 CmdArgs.push_back(Args.MakeArgString(S));
3176 }
Stephen Hines176edba2014-12-01 14:53:08 -08003177 // If there is a static runtime with no dynamic list, force all the symbols
3178 // to be dynamic to be sure we export sanitizer interface functions.
3179 if (AddExportDynamic)
3180 CmdArgs.push_back("-export-dynamic");
3181 return !StaticRuntimes.empty();
Peter Collingbourne2eeed712013-08-07 22:47:34 +00003182}
3183
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003184static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args,
3185 ArgStringList &CmdArgs) {
3186 if (Args.hasFlag(options::OPT_fxray_instrument,
3187 options::OPT_fnoxray_instrument, false)) {
3188 CmdArgs.push_back("-whole-archive");
3189 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false));
3190 CmdArgs.push_back("-no-whole-archive");
3191 return true;
3192 }
3193 return false;
3194}
3195
3196static void linkXRayRuntimeDeps(const ToolChain &TC, const ArgList &Args,
3197 ArgStringList &CmdArgs) {
3198 CmdArgs.push_back("--no-as-needed");
3199 CmdArgs.push_back("-lpthread");
3200 CmdArgs.push_back("-lrt");
3201 CmdArgs.push_back("-lm");
3202 CmdArgs.push_back("-latomic");
3203 if (TC.GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3204 CmdArgs.push_back("-lc++");
3205 else
3206 CmdArgs.push_back("-lstdc++");
3207 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3208 CmdArgs.push_back("-ldl");
3209}
3210
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003211static bool areOptimizationsEnabled(const ArgList &Args) {
3212 // Find the last -O arg and see if it is non-zero.
3213 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3214 return !A->getOption().matches(options::OPT_O0);
3215 // Defaults to -O0.
3216 return false;
3217}
3218
Benjamin Kramer5322a552013-10-16 17:42:39 +00003219static bool shouldUseFramePointerForTarget(const ArgList &Args,
3220 const llvm::Triple &Triple) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003221 switch (Triple.getArch()) {
3222 case llvm::Triple::xcore:
3223 case llvm::Triple::wasm32:
3224 case llvm::Triple::wasm64:
3225 // XCore never wants frame pointers, regardless of OS.
3226 // WebAssembly never wants frame pointers.
Benjamin Kramer5322a552013-10-16 17:42:39 +00003227 return false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003228 default:
3229 break;
Benjamin Kramer5322a552013-10-16 17:42:39 +00003230 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003231
3232 if (Triple.isOSLinux()) {
3233 switch (Triple.getArch()) {
3234 // Don't use a frame pointer on linux if optimizing for certain targets.
3235 case llvm::Triple::mips64:
3236 case llvm::Triple::mips64el:
3237 case llvm::Triple::mips:
3238 case llvm::Triple::mipsel:
3239 case llvm::Triple::systemz:
3240 case llvm::Triple::x86:
3241 case llvm::Triple::x86_64:
3242 return !areOptimizationsEnabled(Args);
3243 default:
3244 return true;
3245 }
3246 }
3247
3248 if (Triple.isOSWindows()) {
3249 switch (Triple.getArch()) {
3250 case llvm::Triple::x86:
3251 return !areOptimizationsEnabled(Args);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003252 case llvm::Triple::x86_64:
3253 return Triple.isOSBinFormatMachO();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003254 case llvm::Triple::arm:
3255 case llvm::Triple::thumb:
3256 // Windows on ARM builds with FPO disabled to aid fast stack walking
3257 return true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003258 default:
3259 // All other supported Windows ISAs use xdata unwind information, so frame
3260 // pointers are not generally useful.
3261 return false;
3262 }
3263 }
3264
3265 return true;
Benjamin Kramer5322a552013-10-16 17:42:39 +00003266}
3267
Rafael Espindola6af27ec2011-12-14 21:02:23 +00003268static bool shouldUseFramePointer(const ArgList &Args,
3269 const llvm::Triple &Triple) {
3270 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3271 options::OPT_fomit_frame_pointer))
3272 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003273 if (Args.hasArg(options::OPT_pg))
3274 return true;
Rafael Espindola6af27ec2011-12-14 21:02:23 +00003275
Benjamin Kramer5322a552013-10-16 17:42:39 +00003276 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00003277}
3278
Eric Christopherd3e22df2013-04-03 01:58:53 +00003279static bool shouldUseLeafFramePointer(const ArgList &Args,
3280 const llvm::Triple &Triple) {
3281 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3282 options::OPT_momit_leaf_frame_pointer))
3283 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003284 if (Args.hasArg(options::OPT_pg))
3285 return true;
Eric Christopherd3e22df2013-04-03 01:58:53 +00003286
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003287 if (Triple.isPS4CPU())
3288 return false;
3289
Benjamin Kramer5322a552013-10-16 17:42:39 +00003290 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00003291}
3292
Rafael Espindolaa2148242013-08-10 01:40:10 +00003293/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00003294static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00003295 SmallString<128> cwd;
3296 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00003297 CmdArgs.push_back("-fdebug-compilation-dir");
3298 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00003299 }
3300}
3301
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003302static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopher80190392013-02-22 20:12:52 +00003303 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3304 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3305 SmallString<128> T(FinalOutput->getValue());
3306 llvm::sys::path::replace_extension(T, "dwo");
3307 return Args.MakeArgString(T);
3308 } else {
3309 // Use the compilation dir.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003310 SmallString<128> T(
3311 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003312 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopher80190392013-02-22 20:12:52 +00003313 llvm::sys::path::replace_extension(F, "dwo");
3314 T += F;
3315 return Args.MakeArgString(F);
3316 }
3317}
3318
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003319static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3320 const JobAction &JA, const ArgList &Args,
3321 const InputInfo &Output, const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00003322 ArgStringList ExtractArgs;
3323 ExtractArgs.push_back("--extract-dwo");
3324
3325 ArgStringList StripArgs;
3326 StripArgs.push_back("--strip-dwo");
3327
3328 // Grabbing the output of the earlier compile step.
3329 StripArgs.push_back(Output.getFilename());
3330 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00003331 ExtractArgs.push_back(OutFile);
3332
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003333 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003334 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00003335
3336 // First extract the dwo sections.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003337 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher59320e72013-02-21 22:35:01 +00003338
3339 // Then remove them from the original .o file.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003340 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher59320e72013-02-21 22:35:01 +00003341}
3342
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003343/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003344/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3345static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003346 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00003347 if (A->getOption().matches(options::OPT_O4) ||
3348 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003349 return true;
3350
3351 if (A->getOption().matches(options::OPT_O0))
3352 return false;
3353
3354 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3355
Rafael Espindola168de192013-08-26 14:05:41 +00003356 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003357 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00003358 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003359 return true;
3360
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003361 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003362 if (S == "z")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003363 return isSlpVec;
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003364
3365 unsigned OptLevel = 0;
3366 if (S.getAsInteger(10, OptLevel))
3367 return false;
3368
3369 return OptLevel > 1;
3370 }
3371
3372 return false;
3373}
3374
Stephen Hines651f13c2014-04-23 16:59:28 -07003375/// Add -x lang to \p CmdArgs for \p Input.
3376static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3377 ArgStringList &CmdArgs) {
3378 // When using -verify-pch, we don't want to provide the type
3379 // 'precompiled-header' if it was inferred from the file extension
3380 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3381 return;
3382
3383 CmdArgs.push_back("-x");
3384 if (Args.hasArg(options::OPT_rewrite_objc))
3385 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3386 else
3387 CmdArgs.push_back(types::getTypeName(Input.getType()));
3388}
3389
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003390static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Stephen Hines176edba2014-12-01 14:53:08 -08003391 if (Version < 100)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003392 return VersionTuple(Version);
Stephen Hines176edba2014-12-01 14:53:08 -08003393
3394 if (Version < 10000)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003395 return VersionTuple(Version / 100, Version % 100);
Stephen Hines176edba2014-12-01 14:53:08 -08003396
3397 unsigned Build = 0, Factor = 1;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003398 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Stephen Hines176edba2014-12-01 14:53:08 -08003399 Build = Build + (Version % 10) * Factor;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003400 return VersionTuple(Version / 100, Version % 100, Build);
Stephen Hines176edba2014-12-01 14:53:08 -08003401}
3402
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003403// Claim options we don't want to warn if they are unused. We do this for
3404// options that build systems might add but are unused when assembling or only
3405// running the preprocessor for example.
3406static void claimNoWarnArgs(const ArgList &Args) {
3407 // Don't warn about unused -f(no-)?lto. This can happen when we're
3408 // preprocessing, precompiling or assembling.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003409 Args.ClaimAllArgs(options::OPT_flto_EQ);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003410 Args.ClaimAllArgs(options::OPT_flto);
3411 Args.ClaimAllArgs(options::OPT_fno_lto);
3412}
3413
3414static void appendUserToPath(SmallVectorImpl<char> &Result) {
3415#ifdef LLVM_ON_UNIX
3416 const char *Username = getenv("LOGNAME");
3417#else
3418 const char *Username = getenv("USERNAME");
3419#endif
3420 if (Username) {
3421 // Validate that LoginName can be used in a path, and get its length.
3422 size_t Len = 0;
3423 for (const char *P = Username; *P; ++P, ++Len) {
3424 if (!isAlphanumeric(*P) && *P != '_') {
3425 Username = nullptr;
3426 break;
3427 }
3428 }
3429
3430 if (Username && Len > 0) {
3431 Result.append(Username, Username + Len);
3432 return;
3433 }
3434 }
3435
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003436// Fallback to user id.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003437#ifdef LLVM_ON_UNIX
3438 std::string UID = llvm::utostr(getuid());
3439#else
3440 // FIXME: Windows seems to have an 'SID' that might work.
3441 std::string UID = "9999";
3442#endif
3443 Result.append(UID.begin(), UID.end());
3444}
3445
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003446VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003447 const llvm::Triple &Triple,
3448 const llvm::opt::ArgList &Args,
3449 bool IsWindowsMSVC) {
3450 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3451 IsWindowsMSVC) ||
3452 Args.hasArg(options::OPT_fmsc_version) ||
3453 Args.hasArg(options::OPT_fms_compatibility_version)) {
3454 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3455 const Arg *MSCompatibilityVersion =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003456 Args.getLastArg(options::OPT_fms_compatibility_version);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003457
3458 if (MSCVersion && MSCompatibilityVersion) {
3459 if (D)
3460 D->Diag(diag::err_drv_argument_not_allowed_with)
3461 << MSCVersion->getAsString(Args)
3462 << MSCompatibilityVersion->getAsString(Args);
3463 return VersionTuple();
3464 }
3465
3466 if (MSCompatibilityVersion) {
3467 VersionTuple MSVT;
3468 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3469 D->Diag(diag::err_drv_invalid_value)
3470 << MSCompatibilityVersion->getAsString(Args)
3471 << MSCompatibilityVersion->getValue();
3472 return MSVT;
3473 }
3474
3475 if (MSCVersion) {
3476 unsigned Version = 0;
3477 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3478 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3479 << MSCVersion->getValue();
3480 return getMSCompatibilityVersion(Version);
3481 }
3482
3483 unsigned Major, Minor, Micro;
3484 Triple.getEnvironmentVersion(Major, Minor, Micro);
3485 if (Major || Minor || Micro)
3486 return VersionTuple(Major, Minor, Micro);
3487
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003488 if (IsWindowsMSVC) {
3489 VersionTuple MSVT = TC.getMSVCVersionFromExe();
3490 if (!MSVT.empty())
3491 return MSVT;
3492
3493 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
3494 return VersionTuple(18);
3495 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003496 }
3497 return VersionTuple();
3498}
3499
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003500static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3501 const InputInfo &Output, const ArgList &Args,
3502 ArgStringList &CmdArgs) {
3503 auto *ProfileGenerateArg = Args.getLastArg(
3504 options::OPT_fprofile_instr_generate,
3505 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
3506 options::OPT_fprofile_generate_EQ,
3507 options::OPT_fno_profile_instr_generate);
3508 if (ProfileGenerateArg &&
3509 ProfileGenerateArg->getOption().matches(
3510 options::OPT_fno_profile_instr_generate))
3511 ProfileGenerateArg = nullptr;
3512
3513 auto *ProfileUseArg = Args.getLastArg(
3514 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
3515 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3516 options::OPT_fno_profile_instr_use);
3517 if (ProfileUseArg &&
3518 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3519 ProfileUseArg = nullptr;
3520
3521 if (ProfileGenerateArg && ProfileUseArg)
3522 D.Diag(diag::err_drv_argument_not_allowed_with)
3523 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
3524
3525 if (ProfileGenerateArg) {
3526 if (ProfileGenerateArg->getOption().matches(
3527 options::OPT_fprofile_instr_generate_EQ))
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003528 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3529 ProfileGenerateArg->getValue()));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003530 else if (ProfileGenerateArg->getOption().matches(
3531 options::OPT_fprofile_generate_EQ)) {
3532 SmallString<128> Path(ProfileGenerateArg->getValue());
3533 llvm::sys::path::append(Path, "default.profraw");
3534 CmdArgs.push_back(
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003535 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3536 }
3537 // The default is to use Clang Instrumentation.
3538 CmdArgs.push_back("-fprofile-instrument=clang");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003539 }
3540
3541 if (ProfileUseArg) {
3542 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003543 CmdArgs.push_back(Args.MakeArgString(
3544 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003545 else if ((ProfileUseArg->getOption().matches(
3546 options::OPT_fprofile_use_EQ) ||
3547 ProfileUseArg->getOption().matches(
3548 options::OPT_fprofile_instr_use))) {
3549 SmallString<128> Path(
3550 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3551 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3552 llvm::sys::path::append(Path, "default.profdata");
3553 CmdArgs.push_back(
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003554 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003555 }
3556 }
3557
3558 if (Args.hasArg(options::OPT_ftest_coverage) ||
3559 Args.hasArg(options::OPT_coverage))
3560 CmdArgs.push_back("-femit-coverage-notes");
3561 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3562 false) ||
3563 Args.hasArg(options::OPT_coverage))
3564 CmdArgs.push_back("-femit-coverage-data");
3565
3566 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3567 options::OPT_fno_coverage_mapping, false) &&
3568 !ProfileGenerateArg)
3569 D.Diag(diag::err_drv_argument_only_allowed_with)
3570 << "-fcoverage-mapping"
3571 << "-fprofile-instr-generate";
3572
3573 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3574 options::OPT_fno_coverage_mapping, false))
3575 CmdArgs.push_back("-fcoverage-mapping");
3576
3577 if (C.getArgs().hasArg(options::OPT_c) ||
3578 C.getArgs().hasArg(options::OPT_S)) {
3579 if (Output.isFilename()) {
3580 CmdArgs.push_back("-coverage-file");
3581 SmallString<128> CoverageFilename;
3582 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3583 CoverageFilename = FinalOutput->getValue();
3584 } else {
3585 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3586 }
3587 if (llvm::sys::path::is_relative(CoverageFilename)) {
3588 SmallString<128> Pwd;
3589 if (!llvm::sys::fs::current_path(Pwd)) {
3590 llvm::sys::path::append(Pwd, CoverageFilename);
3591 CoverageFilename.swap(Pwd);
3592 }
3593 }
3594 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3595 }
3596 }
3597}
3598
3599static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3600 ArgStringList &CmdArgs) {
3601 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3602 false) ||
3603 Args.hasFlag(options::OPT_fprofile_generate,
3604 options::OPT_fno_profile_instr_generate, false) ||
3605 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3606 options::OPT_fno_profile_instr_generate, false) ||
3607 Args.hasFlag(options::OPT_fprofile_instr_generate,
3608 options::OPT_fno_profile_instr_generate, false) ||
3609 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3610 options::OPT_fno_profile_instr_generate, false) ||
3611 Args.hasArg(options::OPT_fcreate_profile) ||
3612 Args.hasArg(options::OPT_coverage)))
3613 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3614}
3615
3616/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3617/// smooshes them together with platform defaults, to decide whether
3618/// this compile should be using PIC mode or not. Returns a tuple of
3619/// (RelocationModel, PICLevel, IsPIE).
3620static std::tuple<llvm::Reloc::Model, unsigned, bool>
3621ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3622 const ArgList &Args) {
3623 // FIXME: why does this code...and so much everywhere else, use both
3624 // ToolChain.getTriple() and Triple?
3625 bool PIE = ToolChain.isPIEDefault();
3626 bool PIC = PIE || ToolChain.isPICDefault();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003627 // The Darwin/MachO default to use PIC does not apply when using -static.
3628 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3629 Args.hasArg(options::OPT_static))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003630 PIE = PIC = false;
3631 bool IsPICLevelTwo = PIC;
3632
3633 bool KernelOrKext =
3634 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3635
3636 // Android-specific defaults for PIC/PIE
3637 if (ToolChain.getTriple().isAndroid()) {
3638 switch (ToolChain.getArch()) {
3639 case llvm::Triple::arm:
3640 case llvm::Triple::armeb:
3641 case llvm::Triple::thumb:
3642 case llvm::Triple::thumbeb:
3643 case llvm::Triple::aarch64:
3644 case llvm::Triple::mips:
3645 case llvm::Triple::mipsel:
3646 case llvm::Triple::mips64:
3647 case llvm::Triple::mips64el:
3648 PIC = true; // "-fpic"
3649 break;
3650
3651 case llvm::Triple::x86:
3652 case llvm::Triple::x86_64:
3653 PIC = true; // "-fPIC"
3654 IsPICLevelTwo = true;
3655 break;
3656
3657 default:
3658 break;
3659 }
3660 }
3661
3662 // OpenBSD-specific defaults for PIE
3663 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3664 switch (ToolChain.getArch()) {
3665 case llvm::Triple::mips64:
3666 case llvm::Triple::mips64el:
3667 case llvm::Triple::sparcel:
3668 case llvm::Triple::x86:
3669 case llvm::Triple::x86_64:
3670 IsPICLevelTwo = false; // "-fpie"
3671 break;
3672
3673 case llvm::Triple::ppc:
3674 case llvm::Triple::sparc:
3675 case llvm::Triple::sparcv9:
3676 IsPICLevelTwo = true; // "-fPIE"
3677 break;
3678
3679 default:
3680 break;
3681 }
3682 }
3683
3684 // The last argument relating to either PIC or PIE wins, and no
3685 // other argument is used. If the last argument is any flavor of the
3686 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3687 // option implicitly enables PIC at the same level.
3688 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3689 options::OPT_fpic, options::OPT_fno_pic,
3690 options::OPT_fPIE, options::OPT_fno_PIE,
3691 options::OPT_fpie, options::OPT_fno_pie);
3692 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3693 // is forced, then neither PIC nor PIE flags will have no effect.
3694 if (!ToolChain.isPICDefaultForced()) {
3695 if (LastPICArg) {
3696 Option O = LastPICArg->getOption();
3697 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3698 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3699 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3700 PIC =
3701 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3702 IsPICLevelTwo =
3703 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3704 } else {
3705 PIE = PIC = false;
3706 if (Triple.isPS4CPU()) {
3707 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3708 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3709 if (Model != "kernel") {
3710 PIC = true;
3711 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3712 << LastPICArg->getSpelling();
3713 }
3714 }
3715 }
3716 }
3717 }
3718
3719 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3720 // PIC level would've been set to level 1, force it back to level 2 PIC
3721 // instead.
3722 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
3723 IsPICLevelTwo |= ToolChain.isPICDefault();
3724
3725 // This kernel flags are a trump-card: they will disable PIC/PIE
3726 // generation, independent of the argument order.
3727 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3728 !Triple.isWatchOS()))
3729 PIC = PIE = false;
3730
3731 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3732 // This is a very special mode. It trumps the other modes, almost no one
3733 // uses it, and it isn't even valid on any OS but Darwin.
3734 if (!ToolChain.getTriple().isOSDarwin())
3735 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3736 << A->getSpelling() << ToolChain.getTriple().str();
3737
3738 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3739
3740 // Only a forced PIC mode can cause the actual compile to have PIC defines
3741 // etc., no flags are sufficient. This behavior was selected to closely
3742 // match that of llvm-gcc and Apple GCC before that.
3743 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3744
3745 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3746 }
3747
3748 if (PIC)
3749 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3750
3751 return std::make_tuple(llvm::Reloc::Static, 0, false);
3752}
3753
3754static const char *RelocationModelName(llvm::Reloc::Model Model) {
3755 switch (Model) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003756 case llvm::Reloc::Static:
3757 return "static";
3758 case llvm::Reloc::PIC_:
3759 return "pic";
3760 case llvm::Reloc::DynamicNoPIC:
3761 return "dynamic-no-pic";
3762 }
3763 llvm_unreachable("Unknown Reloc::Model kind");
3764}
3765
3766static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3767 ArgStringList &CmdArgs) {
3768 llvm::Reloc::Model RelocationModel;
3769 unsigned PICLevel;
3770 bool IsPIE;
3771 std::tie(RelocationModel, PICLevel, IsPIE) =
3772 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3773
3774 if (RelocationModel != llvm::Reloc::Static)
3775 CmdArgs.push_back("-KPIC");
3776}
3777
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003778void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003779 const InputInfo &Output, const InputInfoList &Inputs,
3780 const ArgList &Args, const char *LinkingOutput) const {
3781 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3782 const llvm::Triple Triple(TripleStr);
3783
3784 bool KernelOrKext =
3785 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00003786 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003787 ArgStringList CmdArgs;
3788
Stephen Hines651f13c2014-04-23 16:59:28 -07003789 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003790 bool IsWindowsCygnus =
3791 getToolChain().getTriple().isWindowsCygwinEnvironment();
Stephen Hines651f13c2014-04-23 16:59:28 -07003792 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003793 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003794 bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
Stephen Hines651f13c2014-04-23 16:59:28 -07003795
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003796 // Check number of inputs for sanity. We need at least one input.
3797 assert(Inputs.size() >= 1 && "Must have at least one input.");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003798 const InputInfo &Input = Inputs[0];
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003799 // CUDA compilation may have multiple inputs (source file + results of
3800 // device-side compilations). All other jobs are expected to have exactly one
3801 // input.
3802 bool IsCuda = types::isCuda(Input.getType());
3803 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00003804
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003805 // C++ is not supported for IAMCU.
3806 if (IsIAMCU && types::isCXX(Input.getType()))
3807 D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU";
3808
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003809 // Invoke ourselves in -cc1 mode.
3810 //
3811 // FIXME: Implement custom jobs for internal actions.
3812 CmdArgs.push_back("-cc1");
3813
Daniel Dunbardd4fe002009-10-30 18:12:20 +00003814 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00003815 CmdArgs.push_back("-triple");
Daniel Dunbardd4fe002009-10-30 18:12:20 +00003816 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00003817
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003818 const ToolChain *AuxToolChain = nullptr;
3819 if (IsCuda) {
3820 // FIXME: We need a (better) way to pass information about
3821 // particular compilation pass we're constructing here. For now we
3822 // can check which toolchain we're using and pick the other one to
3823 // extract the triple.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003824 if (&getToolChain() == C.getSingleOffloadToolChain<Action::OFK_Cuda>())
3825 AuxToolChain = C.getOffloadingHostToolChain();
3826 else if (&getToolChain() == C.getOffloadingHostToolChain())
3827 AuxToolChain = C.getSingleOffloadToolChain<Action::OFK_Cuda>();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003828 else
3829 llvm_unreachable("Can't figure out CUDA compilation mode.");
3830 assert(AuxToolChain != nullptr && "No aux toolchain.");
3831 CmdArgs.push_back("-aux-triple");
3832 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003833 }
3834
3835 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3836 Triple.getArch() == llvm::Triple::thumb)) {
3837 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003838 unsigned Version;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003839 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003840 if (Version < 7)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003841 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003842 << TripleStr;
3843 }
3844
Stephen Hines651f13c2014-04-23 16:59:28 -07003845 // Push all default warning arguments that are specific to
3846 // the given target. These come before user provided warning options
3847 // are provided.
3848 getToolChain().addClangWarningOptions(CmdArgs);
3849
Daniel Dunbardd4fe002009-10-30 18:12:20 +00003850 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00003851 RewriteKind rewriteKind = RK_None;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003852
Daniel Dunbar1d460332009-03-18 10:01:51 +00003853 if (isa<AnalyzeJobAction>(JA)) {
3854 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3855 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00003856 } else if (isa<MigrateJobAction>(JA)) {
3857 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003858 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003859 if (Output.getType() == types::TY_Dependencies)
3860 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00003861 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003862 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00003863 if (Args.hasArg(options::OPT_rewrite_objc) &&
3864 !Args.hasArg(options::OPT_g_Group))
3865 CmdArgs.push_back("-P");
3866 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00003867 } else if (isa<AssembleJobAction>(JA)) {
3868 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00003869
David Blaikie73168db2013-07-25 21:19:01 +00003870 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00003871
3872 // Also ignore explicit -force_cpusubtype_ALL option.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003873 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003874 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00003875 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00003876 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00003877
Aaron Ballman761322b2012-07-31 01:21:00 +00003878 if (JA.getType() == types::TY_Nothing)
3879 CmdArgs.push_back("-fsyntax-only");
3880 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00003881 CmdArgs.push_back("-emit-pch");
3882 else
3883 CmdArgs.push_back("-emit-pth");
Stephen Hines651f13c2014-04-23 16:59:28 -07003884 } else if (isa<VerifyPCHJobAction>(JA)) {
3885 CmdArgs.push_back("-verify-pch");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003886 } else {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003887 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3888 "Invalid action for clang tool.");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003889 if (JA.getType() == types::TY_Nothing) {
3890 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003891 } else if (JA.getType() == types::TY_LLVM_IR ||
3892 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00003893 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003894 } else if (JA.getType() == types::TY_LLVM_BC ||
3895 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00003896 CmdArgs.push_back("-emit-llvm-bc");
3897 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00003898 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003899 } else if (JA.getType() == types::TY_AST) {
3900 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00003901 } else if (JA.getType() == types::TY_ModuleFile) {
3902 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00003903 } else if (JA.getType() == types::TY_RewrittenObjC) {
3904 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00003905 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00003906 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3907 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00003908 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00003909 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003910 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003911 }
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07003912
3913 // Preserve use-list order by default when emitting bitcode, so that
3914 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3915 // same result as running passes here. For LTO, we don't need to preserve
3916 // the use-list order, since serialization to bitcode is part of the flow.
3917 if (JA.getType() == types::TY_LLVM_BC)
3918 CmdArgs.push_back("-emit-llvm-uselists");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003919
3920 if (D.isUsingLTO())
3921 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
3922 }
3923
3924 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3925 if (!types::isLLVMIR(Input.getType()))
3926 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3927 << "-x ir";
3928 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003929 }
3930
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003931 // Embed-bitcode option.
3932 if (C.getDriver().embedBitcodeEnabled() &&
3933 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3934 // Add flags implied by -fembed-bitcode.
3935 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
3936 // Disable all llvm IR level optimizations.
3937 CmdArgs.push_back("-disable-llvm-optzns");
3938 }
3939 if (C.getDriver().embedBitcodeMarkerOnly())
3940 CmdArgs.push_back("-fembed-bitcode=marker");
3941
Stephen Hinesef822542014-07-21 00:47:37 -07003942 // We normally speed up the clang process a bit by skipping destructors at
3943 // exit, but when we're generating diagnostics we can rely on some of the
3944 // cleanup.
3945 if (!C.isForDiagnostics())
3946 CmdArgs.push_back("-disable-free");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003947
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003948// Disable the verification pass in -asserts builds.
John McCallb689afb2010-02-13 03:50:24 +00003949#ifdef NDEBUG
3950 CmdArgs.push_back("-disable-llvm-verifier");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003951 // Discard LLVM value names in -asserts builds.
3952 CmdArgs.push_back("-discard-value-names");
John McCallb689afb2010-02-13 03:50:24 +00003953#endif
3954
Daniel Dunbarc9abc042009-04-08 05:11:16 +00003955 // Set the main file name, so that debug info works even with
3956 // -save-temps.
3957 CmdArgs.push_back("-main-file-name");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003958 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00003959
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00003960 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00003961 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00003962 if (Args.hasArg(options::OPT_static))
3963 CmdArgs.push_back("-static-define");
3964
Daniel Dunbar1d460332009-03-18 10:01:51 +00003965 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00003966 // Enable region store model by default.
3967 CmdArgs.push_back("-analyzer-store=region");
3968
Ted Kremenekb40d06d2009-12-07 22:26:14 +00003969 // Treat blocks as analysis entry points.
3970 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3971
Ted Kremenek51885072011-03-24 00:28:47 +00003972 CmdArgs.push_back("-analyzer-eagerly-assume");
3973
Daniel Dunbar1d460332009-03-18 10:01:51 +00003974 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00003975 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00003976 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00003977
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07003978 if (!IsWindowsMSVC) {
3979 CmdArgs.push_back("-analyzer-checker=unix");
3980 } else {
3981 // Enable "unix" checkers that also work on Windows.
3982 CmdArgs.push_back("-analyzer-checker=unix.API");
3983 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3984 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3985 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3986 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3987 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3988 }
3989
3990 // Disable some unix checkers for PS4.
3991 if (IsPS4CPU) {
3992 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3993 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3994 }
Ted Kremenek51885072011-03-24 00:28:47 +00003995
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00003996 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00003997 CmdArgs.push_back("-analyzer-checker=osx");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003998
Ted Kremeneka8180e52012-01-20 06:00:17 +00003999 CmdArgs.push_back("-analyzer-checker=deadcode");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004000
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004001 if (types::isCXX(Input.getType()))
Jordan Rosee449edc2013-04-05 17:55:07 +00004002 CmdArgs.push_back("-analyzer-checker=cplusplus");
4003
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004004 if (!IsPS4CPU) {
4005 CmdArgs.push_back(
4006 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
4007 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
4008 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
4009 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
4010 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
4011 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
4012 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004013
4014 // Default nullability checks.
4015 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
4016 CmdArgs.push_back(
4017 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00004018 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004019
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00004020 // Set the output format. The default is plist, for (lame) historical
4021 // reasons.
4022 CmdArgs.push_back("-analyzer-output");
4023 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00004024 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00004025 else
4026 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00004027
Ted Kremenek0647a7b2010-03-22 22:32:05 +00004028 // Disable the presentation of standard compiler warnings when
4029 // using --analyze. We only want to show static analyzer diagnostics
4030 // or frontend errors.
4031 CmdArgs.push_back("-w");
4032
Daniel Dunbar1d460332009-03-18 10:01:51 +00004033 // Add -Xanalyzer arguments when running as analyzer.
4034 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00004035 }
4036
Daniel Dunbare2fd6642009-09-10 01:21:12 +00004037 CheckCodeGenerationOptions(D, Args);
4038
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004039 llvm::Reloc::Model RelocationModel;
4040 unsigned PICLevel;
4041 bool IsPIE;
4042 std::tie(RelocationModel, PICLevel, IsPIE) =
4043 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00004044
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004045 const char *RMName = RelocationModelName(RelocationModel);
4046 if (RMName) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004047 CmdArgs.push_back("-mrelocation-model");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004048 CmdArgs.push_back(RMName);
4049 }
4050 if (PICLevel > 0) {
4051 CmdArgs.push_back("-pic-level");
4052 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004053 if (IsPIE)
4054 CmdArgs.push_back("-pic-is-pie");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004055 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00004056
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004057 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
4058 CmdArgs.push_back("-meabi");
4059 CmdArgs.push_back(A->getValue());
Daniel Dunbarbc85be82009-04-29 18:32:25 +00004060 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00004061
Stephen Hines176edba2014-12-01 14:53:08 -08004062 CmdArgs.push_back("-mthread-model");
4063 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
4064 CmdArgs.push_back(A->getValue());
4065 else
4066 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
4067
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004068 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
4069
Tanya Lattner59876c22009-11-04 01:18:09 +00004070 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
4071 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00004072 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00004073
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004074 // LLVM Code Generator Options.
4075
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004076 if (Args.hasArg(options::OPT_frewrite_map_file) ||
4077 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004078 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
4079 options::OPT_frewrite_map_file_EQ)) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004080 CmdArgs.push_back("-frewrite-map-file");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004081 CmdArgs.push_back(A->getValue());
4082 A->claim();
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004083 }
4084 }
4085
Stephen Hinesef822542014-07-21 00:47:37 -07004086 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
4087 StringRef v = A->getValue();
4088 CmdArgs.push_back("-mllvm");
4089 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
4090 A->claim();
4091 }
4092
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004093 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
4094 true))
4095 CmdArgs.push_back("-fno-jump-tables");
4096
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00004097 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
4098 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00004099 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00004100 }
4101
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00004102 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
4103 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004104 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00004105 D.Diag(diag::err_drv_unsupported_opt_for_target)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004106 << A->getSpelling() << getToolChain().getTriple().str();
John McCallb8b52972013-06-18 02:46:29 +00004107 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
4108 CmdArgs.push_back("-fpcc-struct-return");
4109 } else {
4110 assert(A->getOption().matches(options::OPT_freg_struct_return));
4111 CmdArgs.push_back("-freg-struct-return");
4112 }
4113 }
4114
Roman Divackycfe9af22011-03-01 17:40:53 +00004115 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004116 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
Roman Divackycfe9af22011-03-01 17:40:53 +00004117
Rafael Espindola6af27ec2011-12-14 21:02:23 +00004118 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004119 CmdArgs.push_back("-mdisable-fp-elim");
4120 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
4121 options::OPT_fno_zero_initialized_in_bss))
4122 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00004123
4124 bool OFastEnabled = isOptimizationLevelFast(Args);
4125 // If -Ofast is the optimization level, then -fstrict-aliasing should be
4126 // enabled. This alias option is being used to simplify the hasFlag logic.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004127 OptSpecifier StrictAliasingAliasOption =
4128 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004129 // We turn strict aliasing off by default if we're in CL mode, since MSVC
4130 // doesn't do any TBAA.
4131 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb82e1172013-04-24 18:09:54 +00004132 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004133 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman4d5625e2010-10-14 22:36:56 +00004134 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00004135 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
4136 options::OPT_fno_struct_path_tbaa))
4137 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00004138 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
4139 false))
4140 CmdArgs.push_back("-fstrict-enums");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004141 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
4142 options::OPT_fno_strict_vtable_pointers,
4143 false))
4144 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1db772b2012-01-23 08:29:12 +00004145 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
4146 options::OPT_fno_optimize_sibling_calls))
4147 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00004148
Eric Christopher31056272013-04-04 06:29:47 +00004149 // Handle segmented stacks.
4150 if (Args.hasArg(options::OPT_fsplit_stack))
4151 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00004152
4153 // If -Ofast is the optimization level, then -ffast-math should be enabled.
4154 // This alias option is being used to simplify the getLastArg logic.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004155 OptSpecifier FastMathAliasOption =
4156 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
4157
Chandler Carruthabf07a72012-01-02 14:19:45 +00004158 // Handle various floating point optimization flags, mapping them to the
4159 // appropriate LLVM code generation flags. The pattern for all of these is to
4160 // default off the codegen optimizations, and if any flag enables them and no
4161 // flag disables them after the flag enabling them, enable the codegen
4162 // optimization. This is complicated by several "umbrella" flags.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004163 if (Arg *A = Args.getLastArg(
4164 options::OPT_ffast_math, FastMathAliasOption,
4165 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4166 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4167 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004168 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4169 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00004170 A->getOption().getID() != options::OPT_fhonor_infinities)
4171 CmdArgs.push_back("-menable-no-infs");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004172 if (Arg *A = Args.getLastArg(
4173 options::OPT_ffast_math, FastMathAliasOption,
4174 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4175 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4176 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004177 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4178 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00004179 A->getOption().getID() != options::OPT_fhonor_nans)
4180 CmdArgs.push_back("-menable-no-nans");
4181
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00004182 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4183 bool MathErrno = getToolChain().IsMathErrnoDefault();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004184 if (Arg *A =
4185 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4186 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4187 options::OPT_fno_math_errno)) {
Chandler Carruthb69557e2013-05-18 20:47:36 +00004188 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4189 // However, turning *off* -ffast_math merely restores the toolchain default
4190 // (which may be false).
4191 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4192 A->getOption().getID() == options::OPT_ffast_math ||
4193 A->getOption().getID() == options::OPT_Ofast)
4194 MathErrno = false;
4195 else if (A->getOption().getID() == options::OPT_fmath_errno)
4196 MathErrno = true;
4197 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00004198 if (MathErrno)
4199 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00004200
4201 // There are several flags which require disabling very specific
4202 // optimizations. Any of these being disabled forces us to turn off the
4203 // entire set of LLVM optimizations, so collect them through all the flag
4204 // madness.
4205 bool AssociativeMath = false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004206 if (Arg *A = Args.getLastArg(
4207 options::OPT_ffast_math, FastMathAliasOption,
4208 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4209 options::OPT_fno_unsafe_math_optimizations,
4210 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004211 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4212 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00004213 A->getOption().getID() != options::OPT_fno_associative_math)
4214 AssociativeMath = true;
4215 bool ReciprocalMath = false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004216 if (Arg *A = Args.getLastArg(
4217 options::OPT_ffast_math, FastMathAliasOption,
4218 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4219 options::OPT_fno_unsafe_math_optimizations,
4220 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004221 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4222 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00004223 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4224 ReciprocalMath = true;
4225 bool SignedZeros = true;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004226 if (Arg *A = Args.getLastArg(
4227 options::OPT_ffast_math, FastMathAliasOption,
4228 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4229 options::OPT_fno_unsafe_math_optimizations,
4230 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004231 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4232 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00004233 A->getOption().getID() != options::OPT_fsigned_zeros)
4234 SignedZeros = false;
4235 bool TrappingMath = true;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004236 if (Arg *A = Args.getLastArg(
4237 options::OPT_ffast_math, FastMathAliasOption,
4238 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4239 options::OPT_fno_unsafe_math_optimizations,
4240 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004241 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4242 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00004243 A->getOption().getID() != options::OPT_ftrapping_math)
4244 TrappingMath = false;
4245 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4246 !TrappingMath)
4247 CmdArgs.push_back("-menable-unsafe-fp-math");
4248
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004249 if (!SignedZeros)
4250 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesc9686712012-07-06 00:59:19 +00004251
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07004252 if (ReciprocalMath)
4253 CmdArgs.push_back("-freciprocal-math");
4254
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004255 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00004256 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004257 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00004258 options::OPT_ffp_contract)) {
4259 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004260 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00004261 if (Val == "fast" || Val == "on" || Val == "off") {
4262 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4263 } else {
4264 D.Diag(diag::err_drv_unsupported_option_argument)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004265 << A->getOption().getName() << Val;
Lang Hamesc9686712012-07-06 00:59:19 +00004266 }
Chad Rosierb82e1172013-04-24 18:09:54 +00004267 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4268 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00004269 // If fast-math is set then set the fp-contract mode to fast.
4270 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4271 }
4272 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004273
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004274 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesc9686712012-07-06 00:59:19 +00004275
Bob Wilson455e72e2012-07-19 03:52:53 +00004276 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4277 // and if we find them, tell the frontend to provide the appropriate
4278 // preprocessor macros. This is distinct from enabling any optimizations as
4279 // these options induce language changes which must survive serialization
4280 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00004281 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4282 options::OPT_fno_fast_math))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004283 if (!A->getOption().matches(options::OPT_fno_fast_math))
4284 CmdArgs.push_back("-ffast-math");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004285 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4286 options::OPT_fno_fast_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00004287 if (A->getOption().matches(options::OPT_ffinite_math_only))
4288 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00004289
Daniel Dunbar1b718482010-05-14 22:00:22 +00004290 // Decide whether to use verbose asm. Verbose assembly is the default on
4291 // toolchains which have the integrated assembler on by default.
Stephen Hines651f13c2014-04-23 16:59:28 -07004292 bool IsIntegratedAssemblerDefault =
4293 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar1b718482010-05-14 22:00:22 +00004294 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Stephen Hines651f13c2014-04-23 16:59:28 -07004295 IsIntegratedAssemblerDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00004296 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004297 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00004298
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004299 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4300 IsIntegratedAssemblerDefault))
Stephen Hines651f13c2014-04-23 16:59:28 -07004301 CmdArgs.push_back("-no-integrated-as");
4302
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004303 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4304 CmdArgs.push_back("-mdebug-pass");
4305 CmdArgs.push_back("Structure");
4306 }
4307 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4308 CmdArgs.push_back("-mdebug-pass");
4309 CmdArgs.push_back("Arguments");
4310 }
4311
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004312 // Enable -mconstructor-aliases except on darwin, where we have to work around
4313 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4314 // aliases aren't supported.
4315 if (!getToolChain().getTriple().isOSDarwin() &&
4316 !getToolChain().getTriple().isNVPTX())
John McCalld0c2ec42010-02-19 02:45:38 +00004317 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00004318
John McCall32096692011-03-18 02:56:14 +00004319 // Darwin's kernel doesn't support guard variables; just die if we
4320 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00004321 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00004322 CmdArgs.push_back("-fforbid-guard-variables");
4323
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004324 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4325 false)) {
Douglas Gregor6f755502011-02-01 15:15:22 +00004326 CmdArgs.push_back("-mms-bitfields");
4327 }
John McCalld0c2ec42010-02-19 02:45:38 +00004328
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00004329 // This is a coarse approximation of what llvm-gcc actually does, both
4330 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4331 // complicated ways.
4332 bool AsynchronousUnwindTables =
Stephen Hines651f13c2014-04-23 16:59:28 -07004333 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4334 options::OPT_fno_asynchronous_unwind_tables,
4335 (getToolChain().IsUnwindTablesDefault() ||
4336 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4337 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00004338 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4339 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004340 CmdArgs.push_back("-munwind-tables");
4341
Chandler Carrutha6b25812012-11-21 23:40:23 +00004342 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00004343
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004344 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4345 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00004346 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004347 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00004348
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00004349 // FIXME: Handle -mtune=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004350 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00004351
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00004352 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00004353 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00004354 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00004355 }
4356
Rafael Espindolab330e402013-08-20 22:12:08 +00004357 // Add the target cpu
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004358 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindolab330e402013-08-20 22:12:08 +00004359 if (!CPU.empty()) {
4360 CmdArgs.push_back("-target-cpu");
4361 CmdArgs.push_back(Args.MakeArgString(CPU));
4362 }
4363
Rafael Espindola5389b842013-08-21 21:59:03 +00004364 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4365 CmdArgs.push_back("-mfpmath");
4366 CmdArgs.push_back(A->getValue());
4367 }
4368
Rafael Espindola146dbbf2013-08-21 16:39:20 +00004369 // Add the target features
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004370 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00004371
Rafael Espindolab330e402013-08-20 22:12:08 +00004372 // Add target specific flags.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004373 switch (getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00004374 default:
4375 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00004376
Daniel Dunbarb163ef72009-09-10 04:57:17 +00004377 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07004378 case llvm::Triple::armeb:
Daniel Dunbarb163ef72009-09-10 04:57:17 +00004379 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07004380 case llvm::Triple::thumbeb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004381 // Use the effective triple, which takes into account the deployment target.
4382 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00004383 break;
4384
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004385 case llvm::Triple::aarch64:
4386 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004387 AddAArch64TargetArgs(Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07004388 break;
4389
Eric Christophered734732010-03-02 02:41:08 +00004390 case llvm::Triple::mips:
4391 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00004392 case llvm::Triple::mips64:
4393 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00004394 AddMIPSTargetArgs(Args, CmdArgs);
4395 break;
4396
Stephen Hines176edba2014-12-01 14:53:08 -08004397 case llvm::Triple::ppc:
4398 case llvm::Triple::ppc64:
4399 case llvm::Triple::ppc64le:
4400 AddPPCTargetArgs(Args, CmdArgs);
4401 break;
4402
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004403 case llvm::Triple::sparc:
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004404 case llvm::Triple::sparcel:
Stephen Hines176edba2014-12-01 14:53:08 -08004405 case llvm::Triple::sparcv9:
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004406 AddSparcTargetArgs(Args, CmdArgs);
4407 break;
4408
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004409 case llvm::Triple::systemz:
4410 AddSystemZTargetArgs(Args, CmdArgs);
4411 break;
4412
Daniel Dunbar6acda162009-09-09 22:33:08 +00004413 case llvm::Triple::x86:
4414 case llvm::Triple::x86_64:
4415 AddX86TargetArgs(Args, CmdArgs);
4416 break;
Tony Linthicum96319392011-12-12 21:14:55 +00004417
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004418 case llvm::Triple::lanai:
4419 AddLanaiTargetArgs(Args, CmdArgs);
4420 break;
4421
Tony Linthicum96319392011-12-12 21:14:55 +00004422 case llvm::Triple::hexagon:
4423 AddHexagonTargetArgs(Args, CmdArgs);
4424 break;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004425
4426 case llvm::Triple::wasm32:
4427 case llvm::Triple::wasm64:
4428 AddWebAssemblyTargetArgs(Args, CmdArgs);
4429 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00004430 }
4431
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004432 // The 'g' groups options involve a somewhat intricate sequence of decisions
4433 // about what to pass from the driver to the frontend, but by the time they
4434 // reach cc1 they've been factored into three well-defined orthogonal choices:
4435 // * what level of debug info to generate
4436 // * what dwarf version to write
4437 // * what debugger tuning to use
4438 // This avoids having to monkey around further in cc1 other than to disable
4439 // codeview if not running in a Windows environment. Perhaps even that
4440 // decision should be made in the driver as well though.
4441 unsigned DwarfVersion = 0;
4442 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4443 // These two are potentially updated by AddClangCLArgs.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004444 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004445 bool EmitCodeView = false;
4446
Hans Wennborgb3574792013-08-08 00:17:41 +00004447 // Add clang-cl arguments.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004448 types::ID InputType = Input.getType();
Hans Wennborgb3574792013-08-08 00:17:41 +00004449 if (getToolChain().getDriver().IsCLMode())
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004450 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborgb3574792013-08-08 00:17:41 +00004451
Daniel Dunbarc176bc62010-08-11 23:07:47 +00004452 // Pass the linker version in use.
4453 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4454 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00004455 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00004456 }
4457
Eric Christopherd3e22df2013-04-03 01:58:53 +00004458 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00004459 CmdArgs.push_back("-momit-leaf-frame-pointer");
4460
Daniel Dunbarb30575c2010-05-12 18:19:58 +00004461 // Explicitly error on some things we know we don't support and can't just
4462 // ignore.
Daniel Dunbare94db472010-09-24 19:39:37 +00004463 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4464 Arg *Unsupported;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004465 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004466 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00004467 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4468 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004469 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004470 << Unsupported->getOption().getName();
Daniel Dunbare94db472010-09-24 19:39:37 +00004471 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00004472 }
4473
Daniel Dunbar1d460332009-03-18 10:01:51 +00004474 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00004475 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00004476 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00004477 CmdArgs.push_back("-header-include-file");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004478 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4479 : "-");
Daniel Dunbar322c29f2011-02-02 21:11:35 +00004480 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004481 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00004482 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004483
Chad Rosier2b819102011-08-02 17:58:04 +00004484 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00004485 CmdArgs.push_back("-diagnostic-log-file");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004486 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4487 : "-");
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00004488 }
4489
Rafael Espindola18f36d92010-03-07 04:46:18 +00004490 Args.ClaimAllArgs(options::OPT_g_Group);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004491 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00004492 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004493 // If the last option explicitly specified a debug-info level, use it.
4494 if (A->getOption().matches(options::OPT_gN_Group)) {
4495 DebugInfoKind = DebugLevelToInfoKind(*A);
4496 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4497 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4498 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004499 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004500 A->getIndex() > SplitDwarfArg->getIndex())
4501 SplitDwarfArg = nullptr;
4502 } else
4503 // For any other 'g' option, use Limited.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004504 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004505 }
4506
4507 // If a debugger tuning argument appeared, remember it.
4508 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4509 options::OPT_ggdbN_Group)) {
4510 if (A->getOption().matches(options::OPT_glldb))
4511 DebuggerTuning = llvm::DebuggerKind::LLDB;
4512 else if (A->getOption().matches(options::OPT_gsce))
4513 DebuggerTuning = llvm::DebuggerKind::SCE;
4514 else
4515 DebuggerTuning = llvm::DebuggerKind::GDB;
4516 }
4517
4518 // If a -gdwarf argument appeared, remember it.
4519 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004520 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004521 DwarfVersion = DwarfVersionNum(A->getSpelling());
4522
4523 // Forward -gcodeview.
4524 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4525 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4526 // DwarfVersion remains at 0 if no explicit choice was made.
4527 CmdArgs.push_back("-gcodeview");
4528 } else if (DwarfVersion == 0 &&
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004529 DebugInfoKind != codegenoptions::NoDebugInfo) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004530 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00004531 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004532
Alexey Samsonov7f326072012-06-21 08:22:39 +00004533 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4534 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004535
4536 // PS4 defaults to no column info
Stephen Hines176edba2014-12-01 14:53:08 -08004537 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004538 /*Default=*/ !IsPS4CPU))
Eric Christopherda3301e2012-10-18 21:52:18 +00004539 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00004540
Eric Christopher0f43a6d2013-09-13 22:37:55 +00004541 // FIXME: Move backend command line options to the module.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004542 if (Args.hasArg(options::OPT_gmodules)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004543 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004544 CmdArgs.push_back("-dwarf-ext-refs");
4545 CmdArgs.push_back("-fmodule-format=obj");
4546 }
4547
Eric Christopherc706c8e2013-02-05 07:29:57 +00004548 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4549 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00004550 // FIXME: Currently only works on Linux.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004551 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004552 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopherc706c8e2013-02-05 07:29:57 +00004553 CmdArgs.push_back("-backend-option");
4554 CmdArgs.push_back("-split-dwarf=Enable");
4555 }
4556
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004557 // After we've dealt with all combinations of things that could
4558 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4559 // figure out if we need to "upgrade" it to standalone debug info.
4560 // We parse these two '-f' options whether or not they will be used,
4561 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4562 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4563 options::OPT_fno_standalone_debug,
4564 getToolChain().GetDefaultStandaloneDebug());
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004565 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4566 DebugInfoKind = codegenoptions::FullDebugInfo;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004567 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4568 DebuggerTuning);
4569
Eric Christopher0f43a6d2013-09-13 22:37:55 +00004570 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4571 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4572 CmdArgs.push_back("-backend-option");
4573 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4574 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00004575
Stephen Hines651f13c2014-04-23 16:59:28 -07004576 // -gdwarf-aranges turns on the emission of the aranges section in the
4577 // backend.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004578 // Always enabled on the PS4.
4579 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004580 CmdArgs.push_back("-backend-option");
4581 CmdArgs.push_back("-generate-arange-section");
4582 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00004583
Stephen Hines651f13c2014-04-23 16:59:28 -07004584 if (Args.hasFlag(options::OPT_fdebug_types_section,
4585 options::OPT_fno_debug_types_section, false)) {
4586 CmdArgs.push_back("-backend-option");
4587 CmdArgs.push_back("-generate-type-units");
4588 }
4589
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004590 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4591 // default.
4592 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4593 Triple.getArch() == llvm::Triple::wasm32 ||
4594 Triple.getArch() == llvm::Triple::wasm64;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004595
Stephen Hines651f13c2014-04-23 16:59:28 -07004596 if (Args.hasFlag(options::OPT_ffunction_sections,
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004597 options::OPT_fno_function_sections, UseSeparateSections)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004598 CmdArgs.push_back("-ffunction-sections");
4599 }
4600
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004601 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4602 UseSeparateSections)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004603 CmdArgs.push_back("-fdata-sections");
4604 }
Rafael Espindola9cf933a2010-05-06 21:06:04 +00004605
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004606 if (!Args.hasFlag(options::OPT_funique_section_names,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004607 options::OPT_fno_unique_section_names, true))
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004608 CmdArgs.push_back("-fno-unique-section-names");
4609
Chris Lattner7255a2d2010-06-22 00:03:40 +00004610 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4611
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004612 if (Args.hasFlag(options::OPT_fxray_instrument,
4613 options::OPT_fnoxray_instrument, false)) {
4614 CmdArgs.push_back("-fxray-instrument");
4615 if (Arg *A = Args.getLastArg(options::OPT_fxray_instruction_threshold_,
4616 options::OPT_fxray_instruction_threshold_EQ)) {
4617 CmdArgs.push_back("-fxray-instruction-threshold");
4618 CmdArgs.push_back(A->getValue());
4619 }
4620 }
4621
4622 if (Args.hasFlag(options::OPT_fxray_instrument,
4623 options::OPT_fnoxray_instrument, false)) {
4624 CmdArgs.push_back("-fxray-instrument");
4625 if (const Arg *A =
4626 Args.getLastArg(options::OPT_fxray_instruction_threshold_,
4627 options::OPT_fxray_instruction_threshold_EQ)) {
4628 CmdArgs.push_back("-fxray-instruction-threshold");
4629 CmdArgs.push_back(A->getValue());
4630 }
4631 }
4632
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004633 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07004634
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004635 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4636 if (getToolChain().getTriple().isPS4CPU())
4637 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
Nick Lewycky5ea4f442011-05-04 20:46:58 +00004638
Daniel Dunbara268fc02011-10-11 18:20:10 +00004639 // Pass options for controlling the default header search paths.
4640 if (Args.hasArg(options::OPT_nostdinc)) {
4641 CmdArgs.push_back("-nostdsysteminc");
4642 CmdArgs.push_back("-nobuiltininc");
4643 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00004644 if (Args.hasArg(options::OPT_nostdlibinc))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004645 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00004646 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4647 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4648 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004649
Daniel Dunbar5f122322009-12-15 01:02:52 +00004650 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00004651 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00004652 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00004653
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00004654 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4655
Ted Kremenek30660a82012-03-06 20:06:33 +00004656 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00004657 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00004658 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00004659 options::OPT_ccc_arcmt_modify,
4660 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00004661 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00004662 switch (A->getOption().getID()) {
4663 default:
4664 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00004665 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00004666 CmdArgs.push_back("-arcmt-check");
4667 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00004668 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00004669 CmdArgs.push_back("-arcmt-modify");
4670 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00004671 case options::OPT_ccc_arcmt_migrate:
4672 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00004673 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00004674 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00004675
4676 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4677 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00004678 break;
John McCall8f0e8d22011-06-15 23:25:17 +00004679 }
4680 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00004681 } else {
4682 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4683 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4684 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00004685 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00004686
Ted Kremenek30660a82012-03-06 20:06:33 +00004687 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4688 if (ARCMTEnabled) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004689 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4690 << "-ccc-arcmt-migrate";
Ted Kremenek30660a82012-03-06 20:06:33 +00004691 }
4692 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00004693 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00004694
4695 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00004696 options::OPT_objcmt_migrate_subscripting,
4697 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00004698 // None specified, means enable them all.
4699 CmdArgs.push_back("-objcmt-migrate-literals");
4700 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00004701 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00004702 } else {
4703 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4704 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00004705 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00004706 }
Argyrios Kyrtzidis17c384c2013-11-13 23:38:20 +00004707 } else {
4708 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4709 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4710 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4711 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4712 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4713 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004714 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis17c384c2013-11-13 23:38:20 +00004715 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4716 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4717 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4718 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4719 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4720 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4721 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Stephen Hines651f13c2014-04-23 16:59:28 -07004722 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
4723 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenek30660a82012-03-06 20:06:33 +00004724 }
4725
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004726 // Add preprocessing options like -I, -D, etc. if we are using the
4727 // preprocessor.
4728 //
4729 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004730 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004731 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4732 AuxToolChain);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004733
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00004734 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4735 // that "The compiler can only warn and ignore the option if not recognized".
4736 // When building with ccache, it will pass -D options to clang even on
4737 // preprocessed inputs and configure concludes that -fPIC is not supported.
4738 Args.ClaimAllArgs(options::OPT_D);
4739
Alp Tokere22017e2013-11-15 20:40:58 +00004740 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00004741 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4742 if (A->getOption().matches(options::OPT_O4)) {
4743 CmdArgs.push_back("-O3");
4744 D.Diag(diag::warn_O4_is_O3);
4745 } else {
4746 A->render(Args, CmdArgs);
4747 }
4748 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004749
Stephen Hines176edba2014-12-01 14:53:08 -08004750 // Warn about ignored options to clang.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004751 for (const Arg *A :
4752 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4753 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004754 A->claim();
Stephen Hines176edba2014-12-01 14:53:08 -08004755 }
4756
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004757 claimNoWarnArgs(Args);
Chad Rosierb2c08872012-12-12 20:06:31 +00004758
Stephen Hines176edba2014-12-01 14:53:08 -08004759 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00004760 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00004761 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4762 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00004763 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004764 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00004765
4766 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00004767 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00004768 //
4769 // If a std is supplied, only add -trigraphs if it follows the
4770 // option.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004771 bool ImplyVCPPCXXVer = false;
Daniel Dunbard573d262009-04-07 22:13:21 +00004772 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4773 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00004774 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00004775 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00004776 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00004777 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00004778 else
4779 Std->render(Args, CmdArgs);
4780
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004781 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar0e100312010-06-14 21:23:08 +00004782 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004783 options::OPT_ftrigraphs,
4784 options::OPT_fno_trigraphs))
Daniel Dunbar0e100312010-06-14 21:23:08 +00004785 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00004786 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00004787 } else {
4788 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00004789 //
4790 // FIXME: Clang doesn't correctly handle -std= when the input language
4791 // doesn't match. For the time being just ignore this for C++ inputs;
4792 // eventually we want to do all the standard defaulting here instead of
4793 // splitting it between the driver and clang -cc1.
4794 if (!types::isCXX(InputType))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004795 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4796 /*Joined=*/true);
Stephen Hines651f13c2014-04-23 16:59:28 -07004797 else if (IsWindowsMSVC)
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004798 ImplyVCPPCXXVer = true;
Nico Weber50f88b92012-08-30 02:08:31 +00004799
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004800 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4801 options::OPT_fno_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00004802 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004803
Richard Smithe9813b32013-09-04 22:50:31 +00004804 // GCC's behavior for -Wwrite-strings is a bit strange:
4805 // * In C, this "warning flag" changes the types of string literals from
4806 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4807 // for the discarded qualifier.
4808 // * In C++, this is just a normal warning flag.
4809 //
4810 // Implementing this warning correctly in C is hard, so we follow GCC's
4811 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4812 // a non-const char* in C, rather than using this crude hack.
4813 if (!types::isCXX(InputType)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004814 // FIXME: This should behave just like a warning flag, and thus should also
4815 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4816 Arg *WriteStrings =
4817 Args.getLastArg(options::OPT_Wwrite_strings,
4818 options::OPT_Wno_write_strings, options::OPT_w);
4819 if (WriteStrings &&
4820 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smithe9813b32013-09-04 22:50:31 +00004821 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00004822 }
4823
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00004824 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00004825 // during C++ compilation, which it is by default. GCC keeps this define even
4826 // in the presence of '-w', match this behavior bug-for-bug.
4827 if (types::isCXX(InputType) &&
4828 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4829 true)) {
4830 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00004831 }
4832
Chandler Carruthc304ba32010-05-22 02:21:53 +00004833 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4834 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4835 if (Asm->getOption().matches(options::OPT_fasm))
4836 CmdArgs.push_back("-fgnu-keywords");
4837 else
4838 CmdArgs.push_back("-fno-gnu-keywords");
4839 }
4840
Nick Lewyckyea523d72011-10-17 23:05:52 +00004841 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4842 CmdArgs.push_back("-fno-dwarf-directory-asm");
4843
Daniel Dunbarf4910132013-04-16 18:21:19 +00004844 if (ShouldDisableAutolink(Args, getToolChain()))
4845 CmdArgs.push_back("-fno-autolink");
4846
Chandler Carruthd566df62012-12-17 21:40:04 +00004847 // Add in -fdebug-compilation-dir if necessary.
4848 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00004849
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004850 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4851 StringRef Map = A->getValue();
4852 if (Map.find('=') == StringRef::npos)
4853 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4854 else
4855 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4856 A->claim();
4857 }
4858
Richard Smithc18c4232011-11-21 19:36:32 +00004859 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4860 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00004861 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00004862 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00004863 }
4864
Richard Smith195dd7c2013-11-06 19:31:51 +00004865 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4866 CmdArgs.push_back("-foperator-arrow-depth");
4867 CmdArgs.push_back(A->getValue());
4868 }
4869
Richard Smithc18c4232011-11-21 19:36:32 +00004870 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4871 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00004872 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00004873 }
4874
Richard Smithe7565632013-05-08 02:12:03 +00004875 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4876 CmdArgs.push_back("-fconstexpr-steps");
4877 CmdArgs.push_back(A->getValue());
4878 }
4879
Richard Smith9e738cc2013-02-22 01:59:51 +00004880 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4881 CmdArgs.push_back("-fbracket-depth");
4882 CmdArgs.push_back(A->getValue());
4883 }
4884
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00004885 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4886 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00004887 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004888 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00004889 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4890 } else
4891 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00004892 }
4893
Michael J. Spencerc6357102012-10-22 22:13:48 +00004894 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00004895 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00004896
Daniel Dunbar294691e2009-11-04 06:24:38 +00004897 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4898 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00004899 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00004900 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00004901
Chris Lattner124fca52010-01-09 21:54:33 +00004902 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4903 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00004904 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00004905 }
4906
Chris Lattner0f0c9632010-04-07 20:49:23 +00004907 CmdArgs.push_back("-ferror-limit");
4908 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00004909 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00004910 else
4911 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00004912
Chandler Carruthc40f73c2010-05-06 04:55:18 +00004913 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4914 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00004915 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00004916 }
4917
4918 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4919 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00004920 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00004921 }
4922
Richard Smith08d6e032011-12-16 19:06:07 +00004923 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4924 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00004925 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00004926 }
4927
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004928 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4929 CmdArgs.push_back("-fspell-checking-limit");
4930 CmdArgs.push_back(A->getValue());
4931 }
4932
Daniel Dunbar55efe142009-11-04 06:24:47 +00004933 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00004934 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00004935 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004936 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00004937 } else {
4938 // If -fmessage-length=N was not specified, determine whether this is a
4939 // terminal and, if so, implicitly define -fmessage-length appropriately.
4940 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00004941 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00004942 }
4943
John McCalla880b192013-02-19 01:57:35 +00004944 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4945 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4946 options::OPT_fvisibility_ms_compat)) {
4947 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4948 CmdArgs.push_back("-fvisibility");
4949 CmdArgs.push_back(A->getValue());
4950 } else {
4951 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4952 CmdArgs.push_back("-fvisibility");
4953 CmdArgs.push_back("hidden");
4954 CmdArgs.push_back("-ftype-visibility");
4955 CmdArgs.push_back("default");
4956 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00004957 }
4958
Douglas Gregor7cf84d62010-06-15 17:05:35 +00004959 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00004960
Hans Wennborgde981f32012-06-28 08:01:44 +00004961 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4962
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00004963 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00004964 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4965 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00004966 CmdArgs.push_back("-ffreestanding");
4967
Daniel Dunbarba8d8612009-12-03 18:42:11 +00004968 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00004969 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00004970 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christophere88c4512011-10-25 07:13:06 +00004971 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004972 // Emulated TLS is enabled by default on Android, and can be enabled manually
4973 // with -femulated-tls.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004974 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004975 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4976 EmulatedTLSDefault))
4977 CmdArgs.push_back("-femulated-tls");
4978 // AltiVec-like language extensions aren't relevant for assembling.
4979 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidt9e0b6472013-07-03 15:36:02 +00004980 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004981 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4982 }
Richard Trieu246b6aa2012-06-26 18:18:47 +00004983 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4984 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00004985
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004986 // Forward flags for OpenMP
4987 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07004988 options::OPT_fno_openmp, false)) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004989 switch (getOpenMPRuntime(getToolChain(), Args)) {
4990 case OMPRT_OMP:
4991 case OMPRT_IOMP5:
4992 // Clang can generate useful OpenMP code for these two runtime libraries.
4993 CmdArgs.push_back("-fopenmp");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004994
4995 // If no option regarding the use of TLS in OpenMP codegeneration is
4996 // given, decide a default based on the target. Otherwise rely on the
4997 // options and pass the right information to the frontend.
4998 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4999 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
5000 CmdArgs.push_back("-fnoopenmp-use-tls");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005001 Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005002 break;
5003 default:
5004 // By default, if Clang doesn't know how to generate useful OpenMP code
5005 // for a specific runtime library, we just don't pass the '-fopenmp' flag
5006 // down to the actual compilation.
5007 // FIXME: It would be better to have a mode which *only* omits IR
5008 // generation based on the OpenMP support so that we get consistent
5009 // semantic analysis, etc.
5010 break;
5011 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005012 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005013
Peter Collingbournec6911a22013-11-01 18:16:25 +00005014 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005015 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smithc4dabad2012-11-05 22:04:41 +00005016
Eric Christopher98654c92013-02-19 06:16:53 +00005017 // Report an error for -faltivec on anything other than PowerPC.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005018 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
5019 const llvm::Triple::ArchType Arch = getToolChain().getArch();
5020 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
5021 Arch == llvm::Triple::ppc64le))
5022 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
5023 << "ppc/ppc64/ppc64le";
5024 }
Chad Rosier4574c3d2012-03-13 23:45:51 +00005025
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005026 // -fzvector is incompatible with -faltivec.
5027 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
5028 if (Args.hasArg(options::OPT_faltivec))
5029 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
5030 << "-faltivec";
5031
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00005032 if (getToolChain().SupportsProfiling())
5033 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00005034
5035 // -flax-vector-conversions is default.
5036 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
5037 options::OPT_fno_lax_vector_conversions))
5038 CmdArgs.push_back("-fno-lax-vector-conversions");
5039
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005040 if (Args.getLastArg(options::OPT_fapple_kext) ||
5041 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00005042 CmdArgs.push_back("-fapple-kext");
5043
Fariborz Jahanian34e65772009-05-22 20:17:16 +00005044 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00005045 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00005046 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00005047 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
5048 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00005049
5050 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
5051 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00005052 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00005053 }
5054
Bob Wilson71fd6cc2012-02-03 06:27:22 +00005055 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00005056
Chandler Carruth5adb5a82011-03-27 00:04:55 +00005057 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
5058 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005059 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth5adb5a82011-03-27 00:04:55 +00005060 if (A->getOption().matches(options::OPT_fwrapv))
5061 CmdArgs.push_back("-fwrapv");
5062 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
5063 options::OPT_fno_strict_overflow)) {
5064 if (A->getOption().matches(options::OPT_fno_strict_overflow))
5065 CmdArgs.push_back("-fwrapv");
5066 }
Hal Finkelce5b5f12013-11-17 16:03:29 +00005067
5068 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
5069 options::OPT_fno_reroll_loops))
5070 if (A->getOption().matches(options::OPT_freroll_loops))
5071 CmdArgs.push_back("-freroll-loops");
5072
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00005073 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00005074 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
5075 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00005076
Daniel Dunbar5345c392009-09-03 04:54:28 +00005077 Args.AddLastArg(CmdArgs, options::OPT_pthread);
5078
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00005079 // -stack-protector=0 is default.
5080 unsigned StackProtectorLevel = 0;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005081 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
5082 options::OPT_fstack_protector_all,
5083 options::OPT_fstack_protector_strong,
5084 options::OPT_fstack_protector)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005085 if (A->getOption().matches(options::OPT_fstack_protector)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005086 StackProtectorLevel = std::max<unsigned>(
5087 LangOptions::SSPOn,
5088 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005089 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Stephen Hines651f13c2014-04-23 16:59:28 -07005090 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00005091 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Stephen Hines651f13c2014-04-23 16:59:28 -07005092 StackProtectorLevel = LangOptions::SSPReq;
Nico Weber2fef1112011-08-23 07:38:27 +00005093 } else {
5094 StackProtectorLevel =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005095 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weber2fef1112011-08-23 07:38:27 +00005096 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00005097 if (StackProtectorLevel) {
5098 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00005099 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00005100 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00005101
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00005102 // --param ssp-buffer-size=
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005103 for (const Arg *A : Args.filtered(options::OPT__param)) {
5104 StringRef Str(A->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00005105 if (Str.startswith("ssp-buffer-size=")) {
5106 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00005107 CmdArgs.push_back("-stack-protector-buffer-size");
5108 // FIXME: Verify the argument is a valid integer.
5109 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00005110 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005111 A->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00005112 }
Bill Wendling45483f72009-06-28 07:36:13 +00005113 }
5114
Nick Lewycky4e785c92011-12-06 03:33:03 +00005115 // Translate -mstackrealign
5116 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005117 false))
Nick Lewycky4e785c92011-12-06 03:33:03 +00005118 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewycky4e785c92011-12-06 03:33:03 +00005119
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00005120 if (Args.hasArg(options::OPT_mstack_alignment)) {
5121 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
5122 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00005123 }
Stephen Hines176edba2014-12-01 14:53:08 -08005124
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005125 if (Args.hasArg(options::OPT_mstack_probe_size)) {
5126 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
5127
5128 if (!Size.empty())
5129 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
5130 else
5131 CmdArgs.push_back("-mstack-probe-size=0");
5132 }
5133
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005134 switch (getToolChain().getArch()) {
5135 case llvm::Triple::aarch64:
5136 case llvm::Triple::aarch64_be:
5137 case llvm::Triple::arm:
5138 case llvm::Triple::armeb:
5139 case llvm::Triple::thumb:
5140 case llvm::Triple::thumbeb:
Stephen Hines176edba2014-12-01 14:53:08 -08005141 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005142 break;
5143
5144 default:
5145 break;
5146 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00005147
Weiming Zhao7792fde2013-11-13 18:31:23 +00005148 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
5149 options::OPT_mno_restrict_it)) {
5150 if (A->getOption().matches(options::OPT_mrestrict_it)) {
5151 CmdArgs.push_back("-backend-option");
5152 CmdArgs.push_back("-arm-restrict-it");
5153 } else {
5154 CmdArgs.push_back("-backend-option");
5155 CmdArgs.push_back("-arm-no-restrict-it");
5156 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005157 } else if (Triple.isOSWindows() &&
5158 (Triple.getArch() == llvm::Triple::arm ||
5159 Triple.getArch() == llvm::Triple::thumb)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005160 // Windows on ARM expects restricted IT blocks
5161 CmdArgs.push_back("-backend-option");
5162 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao7792fde2013-11-13 18:31:23 +00005163 }
5164
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005165 // Forward -cl options to -cc1
5166 if (Args.getLastArg(options::OPT_cl_opt_disable)) {
5167 CmdArgs.push_back("-cl-opt-disable");
5168 }
5169 if (Args.getLastArg(options::OPT_cl_strict_aliasing)) {
5170 CmdArgs.push_back("-cl-strict-aliasing");
5171 }
5172 if (Args.getLastArg(options::OPT_cl_single_precision_constant)) {
5173 CmdArgs.push_back("-cl-single-precision-constant");
5174 }
5175 if (Args.getLastArg(options::OPT_cl_finite_math_only)) {
5176 CmdArgs.push_back("-cl-finite-math-only");
5177 }
5178 if (Args.getLastArg(options::OPT_cl_kernel_arg_info)) {
5179 CmdArgs.push_back("-cl-kernel-arg-info");
5180 }
5181 if (Args.getLastArg(options::OPT_cl_unsafe_math_optimizations)) {
5182 CmdArgs.push_back("-cl-unsafe-math-optimizations");
5183 }
5184 if (Args.getLastArg(options::OPT_cl_fast_relaxed_math)) {
5185 CmdArgs.push_back("-cl-fast-relaxed-math");
5186 }
5187 if (Args.getLastArg(options::OPT_cl_mad_enable)) {
5188 CmdArgs.push_back("-cl-mad-enable");
5189 }
5190 if (Args.getLastArg(options::OPT_cl_no_signed_zeros)) {
5191 CmdArgs.push_back("-cl-no-signed-zeros");
5192 }
5193 if (Arg *A = Args.getLastArg(options::OPT_cl_std_EQ)) {
5194 std::string CLStdStr = "-cl-std=";
5195 CLStdStr += A->getValue();
5196 CmdArgs.push_back(Args.MakeArgString(CLStdStr));
5197 }
5198 if (Args.getLastArg(options::OPT_cl_denorms_are_zero)) {
5199 CmdArgs.push_back("-cl-denorms-are-zero");
5200 }
5201
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005202 // Forward -f options with positive and negative forms; we translate
5203 // these by hand.
Diego Novillob85a9ec2013-11-13 12:22:39 +00005204 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5205 StringRef fname = A->getValue();
5206 if (!llvm::sys::fs::exists(fname))
5207 D.Diag(diag::err_drv_no_such_file) << fname;
5208 else
5209 A->render(Args, CmdArgs);
5210 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005211
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005212 // -fbuiltin is default unless -mkernel is used.
5213 bool UseBuiltins =
5214 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5215 !Args.hasArg(options::OPT_mkernel));
5216 if (!UseBuiltins)
Daniel Dunbar53e84842009-11-19 04:55:23 +00005217 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005218
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005219 // -ffreestanding implies -fno-builtin.
5220 if (Args.hasArg(options::OPT_ffreestanding))
5221 UseBuiltins = false;
5222
5223 // Process the -fno-builtin-* options.
5224 for (const auto &Arg : Args) {
5225 const Option &O = Arg->getOption();
5226 if (!O.matches(options::OPT_fno_builtin_))
5227 continue;
5228
5229 Arg->claim();
5230 // If -fno-builtin is specified, then there's no need to pass the option to
5231 // the frontend.
5232 if (!UseBuiltins)
5233 continue;
5234
5235 StringRef FuncName = Arg->getValue();
5236 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5237 }
5238
Nuno Lopesfc284482009-12-16 16:59:22 +00005239 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5240 options::OPT_fno_assume_sane_operator_new))
5241 CmdArgs.push_back("-fno-assume-sane-operator-new");
5242
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00005243 // -fblocks=0 is default.
5244 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00005245 getToolChain().IsBlocksDefault()) ||
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005246 (Args.hasArg(options::OPT_fgnu_runtime) &&
5247 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5248 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00005249 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00005250
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005251 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall13db5cf2011-09-09 20:41:01 +00005252 !getToolChain().hasBlocksRuntime())
5253 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00005254 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005255
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005256 // -fmodules enables the use of precompiled modules (off by default).
Stephen Hines176edba2014-12-01 14:53:08 -08005257 // Users can pass -fno-cxx-modules to turn off modules support for
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005258 // C++/Objective-C++ programs.
Douglas Gregorf43b7212013-01-16 01:23:41 +00005259 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00005260 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005261 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5262 options::OPT_fno_cxx_modules, true);
Douglas Gregorf43b7212013-01-16 01:23:41 +00005263 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00005264 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00005265 HaveModules = true;
5266 }
5267 }
5268
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005269 // -fmodule-maps enables implicit reading of module map files. By default,
5270 // this is enabled if we are using precompiled modules.
5271 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5272 options::OPT_fno_implicit_module_maps, HaveModules)) {
5273 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper056ec122013-08-05 20:26:17 +00005274 }
5275
Daniel Jasper95411412013-10-21 06:34:34 +00005276 // -fmodules-decluse checks that modules used are declared so (off by
5277 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00005278 if (Args.hasFlag(options::OPT_fmodules_decluse,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005279 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00005280 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00005281 }
5282
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005283 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5284 // all #included headers are part of modules.
5285 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005286 options::OPT_fno_modules_strict_decluse, false)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005287 CmdArgs.push_back("-fmodules-strict-decluse");
5288 }
5289
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005290 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5291 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5292 options::OPT_fno_implicit_modules)) {
5293 CmdArgs.push_back("-fno-implicit-modules");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005294 } else if (HaveModules) {
5295 // -fmodule-cache-path specifies where our implicitly-built module files
5296 // should be written.
5297 SmallString<128> Path;
5298 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5299 Path = A->getValue();
Stephen Hinesef822542014-07-21 00:47:37 -07005300 if (C.isForDiagnostics()) {
5301 // When generating crash reports, we want to emit the modules along with
5302 // the reproduction sources, so we ignore any provided module path.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005303 Path = Output.getFilename();
5304 llvm::sys::path::replace_extension(Path, ".cache");
5305 llvm::sys::path::append(Path, "modules");
5306 } else if (Path.empty()) {
Stephen Hinesef822542014-07-21 00:47:37 -07005307 // No module path was provided: use the default.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005308 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
5309 llvm::sys::path::append(Path, "org.llvm.clang.");
5310 appendUserToPath(Path);
5311 llvm::sys::path::append(Path, "ModuleCache");
Douglas Gregor953a61f2013-02-07 19:01:24 +00005312 }
Douglas Gregor250172a2013-02-07 22:59:12 +00005313 const char Arg[] = "-fmodules-cache-path=";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005314 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5315 CmdArgs.push_back(Args.MakeArgString(Path));
Douglas Gregor953a61f2013-02-07 19:01:24 +00005316 }
5317
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005318 // -fmodule-name specifies the module that is currently being built (or
5319 // used for header checking by -fmodule-maps).
5320 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5321
5322 // -fmodule-map-file can be used to specify files containing module
5323 // definitions.
5324 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5325
5326 // -fmodule-file can be used to specify files containing precompiled modules.
5327 if (HaveModules)
5328 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5329 else
5330 Args.ClaimAllArgs(options::OPT_fmodule_file);
5331
Stephen Hinesef822542014-07-21 00:47:37 -07005332 // When building modules and generating crashdumps, we need to dump a module
5333 // dependency VFS alongside the output.
5334 if (HaveModules && C.isForDiagnostics()) {
5335 SmallString<128> VFSDir(Output.getFilename());
5336 llvm::sys::path::replace_extension(VFSDir, ".cache");
Stephen Hines176edba2014-12-01 14:53:08 -08005337 // Add the cache directory as a temp so the crash diagnostics pick it up.
5338 C.addTempFile(Args.MakeArgString(VFSDir));
5339
Stephen Hinesef822542014-07-21 00:47:37 -07005340 llvm::sys::path::append(VFSDir, "vfs");
5341 CmdArgs.push_back("-module-dependency-dir");
5342 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Stephen Hines651f13c2014-04-23 16:59:28 -07005343 }
5344
Stephen Hines176edba2014-12-01 14:53:08 -08005345 if (HaveModules)
5346 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Stephen Hinesef822542014-07-21 00:47:37 -07005347
Douglas Gregor953a61f2013-02-07 19:01:24 +00005348 // Pass through all -fmodules-ignore-macro arguments.
5349 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00005350 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5351 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00005352
Stephen Hines651f13c2014-04-23 16:59:28 -07005353 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5354
Stephen Hines176edba2014-12-01 14:53:08 -08005355 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5356 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5357 D.Diag(diag::err_drv_argument_not_allowed_with)
5358 << A->getAsString(Args) << "-fbuild-session-timestamp";
5359
5360 llvm::sys::fs::file_status Status;
5361 if (llvm::sys::fs::status(A->getValue(), Status))
5362 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005363 CmdArgs.push_back(Args.MakeArgString(
5364 "-fbuild-session-timestamp=" +
5365 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Stephen Hines176edba2014-12-01 14:53:08 -08005366 }
5367
Stephen Hines651f13c2014-04-23 16:59:28 -07005368 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Stephen Hines176edba2014-12-01 14:53:08 -08005369 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5370 options::OPT_fbuild_session_file))
Stephen Hines651f13c2014-04-23 16:59:28 -07005371 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5372
5373 Args.AddLastArg(CmdArgs,
5374 options::OPT_fmodules_validate_once_per_build_session);
5375 }
5376
5377 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5378
John McCall32579cf2010-04-09 19:12:06 +00005379 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00005380 if (Args.hasFlag(options::OPT_fno_access_control,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005381 options::OPT_faccess_control, false))
John McCall7002f4c2010-04-09 19:03:51 +00005382 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00005383
Anders Carlssona4c24752010-11-21 00:09:52 +00005384 // -felide-constructors is the default.
5385 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005386 options::OPT_felide_constructors, false))
Anders Carlssona4c24752010-11-21 00:09:52 +00005387 CmdArgs.push_back("-fno-elide-constructors");
5388
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005389 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Mike Stump738f8c22009-07-31 23:15:31 +00005390
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005391 if (KernelOrKext || (types::isCXX(InputType) &&
5392 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5393 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005394 CmdArgs.push_back("-fno-rtti");
Richard Smithc4dabad2012-11-05 22:04:41 +00005395
Tony Linthicum96319392011-12-12 21:14:55 +00005396 // -fshort-enums=0 is default for all architectures except Hexagon.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005397 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5398 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00005399 CmdArgs.push_back("-fshort-enums");
5400
Daniel Dunbar1f95e652009-11-17 06:37:03 +00005401 // -fsigned-char is default.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005402 if (Arg *A = Args.getLastArg(
5403 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5404 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5405 if (A->getOption().matches(options::OPT_funsigned_char) ||
5406 A->getOption().matches(options::OPT_fno_signed_char)) {
5407 CmdArgs.push_back("-fno-signed-char");
5408 }
5409 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar76743522009-11-29 02:39:08 +00005410 CmdArgs.push_back("-fno-signed-char");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005411 }
Eli Friedman5a779732009-06-05 07:21:14 +00005412
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00005413 // -fuse-cxa-atexit is default.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005414 if (!Args.hasFlag(
5415 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5416 !IsWindowsCygnus && !IsWindowsGNU &&
5417 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5418 getToolChain().getArch() != llvm::Triple::hexagon &&
5419 getToolChain().getArch() != llvm::Triple::xcore &&
5420 ((getToolChain().getTriple().getVendor() !=
5421 llvm::Triple::MipsTechnologies) ||
5422 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00005423 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00005424 CmdArgs.push_back("-fno-use-cxa-atexit");
5425
Daniel Dunbar0be42c42009-11-17 07:06:20 +00005426 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00005427 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Stephen Hines651f13c2014-04-23 16:59:28 -07005428 IsWindowsMSVC))
Daniel Dunbar0be42c42009-11-17 07:06:20 +00005429 CmdArgs.push_back("-fms-extensions");
5430
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005431 // -fno-use-line-directives is default.
5432 if (Args.hasFlag(options::OPT_fuse_line_directives,
5433 options::OPT_fno_use_line_directives, false))
5434 CmdArgs.push_back("-fuse-line-directives");
5435
Francois Pichetae556082011-09-17 04:32:15 +00005436 // -fms-compatibility=0 is default.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005437 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregorba97b6e2011-10-24 15:49:38 +00005438 options::OPT_fno_ms_compatibility,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005439 (IsWindowsMSVC &&
5440 Args.hasFlag(options::OPT_fms_extensions,
5441 options::OPT_fno_ms_extensions, true))))
Francois Pichetae556082011-09-17 04:32:15 +00005442 CmdArgs.push_back("-fms-compatibility");
5443
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005444 // -fms-compatibility-version=18.00 is default.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005445 VersionTuple MSVT = visualstudio::getMSVCVersion(
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005446 &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005447 if (!MSVT.empty())
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005448 CmdArgs.push_back(
5449 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005450
5451 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5452 if (ImplyVCPPCXXVer) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005453 StringRef LanguageStandard;
5454 if (const Arg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) {
5455 LanguageStandard = llvm::StringSwitch<StringRef>(StdArg->getValue())
5456 .Case("c++14", "-std=c++14")
5457 .Case("c++latest", "-std=c++1z")
5458 .Default("");
5459 if (LanguageStandard.empty())
5460 D.Diag(clang::diag::warn_drv_unused_argument)
5461 << StdArg->getAsString(Args);
5462 }
5463
5464 if (LanguageStandard.empty()) {
5465 if (IsMSVC2015Compatible)
5466 LanguageStandard = "-std=c++14";
5467 else
5468 LanguageStandard = "-std=c++11";
5469 }
5470
5471 CmdArgs.push_back(LanguageStandard.data());
Stephen Hines176edba2014-12-01 14:53:08 -08005472 }
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00005473
Eric Christophercfc01e42013-02-18 00:38:31 +00005474 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00005475 if (Args.hasFlag(options::OPT_fborland_extensions,
5476 options::OPT_fno_borland_extensions, false))
5477 CmdArgs.push_back("-fborland-extensions");
5478
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005479 // -fno-declspec is default, except for PS4.
5480 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5481 getToolChain().getTriple().isPS4()))
5482 CmdArgs.push_back("-fdeclspec");
5483 else if (Args.hasArg(options::OPT_fno_declspec))
5484 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5485
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005486 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5487 // than 19.
5488 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5489 options::OPT_fno_threadsafe_statics,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005490 !IsWindowsMSVC || IsMSVC2015Compatible))
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005491 CmdArgs.push_back("-fno-threadsafe-statics");
5492
Francois Pichet8efcc012011-09-01 16:38:08 +00005493 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5494 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00005495 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Stephen Hines651f13c2014-04-23 16:59:28 -07005496 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet805bc1f2011-08-26 00:22:34 +00005497 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00005498
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00005499 // -fgnu-keywords default varies depending on language; only pass if
5500 // specified.
5501 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00005502 options::OPT_fno_gnu_keywords))
5503 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00005504
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005505 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola01ba8542011-06-02 17:30:53 +00005506 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00005507 CmdArgs.push_back("-fgnu89-inline");
5508
Chad Rosierfc055f92012-03-15 22:31:42 +00005509 if (Args.hasArg(options::OPT_fno_inline))
5510 CmdArgs.push_back("-fno-inline");
5511
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005512 if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
5513 options::OPT_finline_hint_functions,
5514 options::OPT_fno_inline_functions))
5515 InlineArg->render(Args, CmdArgs);
Chad Rosier250008b2012-03-06 18:49:20 +00005516
John McCall260611a2012-06-20 06:18:46 +00005517 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00005518
John McCall260611a2012-06-20 06:18:46 +00005519 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Stephen Hines651f13c2014-04-23 16:59:28 -07005520 // legacy is the default. Except for deployment taget of 10.5,
5521 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5522 // gets ignored silently.
5523 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00005524 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5525 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00005526 objcRuntime.isLegacyDispatchDefaultForArch(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005527 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00005528 if (getToolChain().UseObjCMixedDispatch())
5529 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5530 else
5531 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5532 }
5533 }
Rafael Espindola669496b2013-11-12 04:33:56 +00005534
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00005535 // When ObjectiveC legacy runtime is in effect on MacOSX,
5536 // turn on the option to do Array/Dictionary subscripting
5537 // by default.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005538 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanian08d86e92013-11-12 20:50:26 +00005539 getToolChain().getTriple().isMacOSX() &&
5540 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5541 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00005542 objcRuntime.isNeXTFamily())
5543 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005544
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00005545 // -fencode-extended-block-signature=1 is default.
5546 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5547 CmdArgs.push_back("-fencode-extended-block-signature");
5548 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005549
John McCall9f084a32011-07-06 00:26:06 +00005550 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5551 // NOTE: This logic is duplicated in ToolChains.cpp.
5552 bool ARC = isObjCAutoRefCount(Args);
5553 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00005554 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00005555
John McCall9f084a32011-07-06 00:26:06 +00005556 CmdArgs.push_back("-fobjc-arc");
5557
Chandler Carruth7ffa0322011-11-04 07:34:47 +00005558 // FIXME: It seems like this entire block, and several around it should be
5559 // wrapped in isObjC, but for now we just use it here as this is where it
5560 // was being used previously.
5561 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5562 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5563 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5564 else
5565 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5566 }
5567
John McCall9f084a32011-07-06 00:26:06 +00005568 // Allow the user to enable full exceptions code emission.
5569 // We define off for Objective-CC, on for Objective-C++.
5570 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5571 options::OPT_fno_objc_arc_exceptions,
5572 /*default*/ types::isCXX(InputType)))
5573 CmdArgs.push_back("-fobjc-arc-exceptions");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005574
John McCall9f084a32011-07-06 00:26:06 +00005575 }
5576
5577 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5578 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00005579 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00005580 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005581
John McCall9f084a32011-07-06 00:26:06 +00005582 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5583 // takes precedence.
5584 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5585 if (!GCArg)
5586 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5587 if (GCArg) {
5588 if (ARC) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005589 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall9f084a32011-07-06 00:26:06 +00005590 } else if (getToolChain().SupportsObjCGC()) {
5591 GCArg->render(Args, CmdArgs);
5592 } else {
5593 // FIXME: We should move this to a hard error.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005594 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
5595 }
5596 }
5597
5598 // Pass down -fobjc-weak or -fno-objc-weak if present.
5599 if (types::isObjC(InputType)) {
5600 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5601 options::OPT_fno_objc_weak);
5602 if (!WeakArg) {
5603 // nothing to do
5604 } else if (GCArg) {
5605 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5606 D.Diag(diag::err_objc_weak_with_gc);
5607 } else if (!objcRuntime.allowsWeak()) {
5608 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5609 D.Diag(diag::err_objc_weak_unsupported);
5610 } else {
5611 WeakArg->render(Args, CmdArgs);
John McCall9f084a32011-07-06 00:26:06 +00005612 }
5613 }
5614
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005615 if (Args.hasFlag(options::OPT_fapplication_extension,
5616 options::OPT_fno_application_extension, false))
5617 CmdArgs.push_back("-fapplication-extension");
5618
Stephen Hinesef822542014-07-21 00:47:37 -07005619 // Handle GCC-style exception args.
5620 if (!C.getDriver().IsCLMode())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005621 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5622 CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00005623
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005624 if (Args.hasArg(options::OPT_fsjlj_exceptions) ||
5625 getToolChain().UseSjLjExceptions(Args))
John McCalld71315c2011-06-22 00:53:57 +00005626 CmdArgs.push_back("-fsjlj-exceptions");
5627
5628 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00005629 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5630 options::OPT_fno_assume_sane_operator_new))
5631 CmdArgs.push_back("-fno-assume-sane-operator-new");
5632
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005633 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5634 // most platforms.
5635 if (Args.hasFlag(options::OPT_fsized_deallocation,
5636 options::OPT_fno_sized_deallocation, false))
5637 CmdArgs.push_back("-fsized-deallocation");
5638
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00005639 // -fconstant-cfstrings is default, and may be subject to argument translation
5640 // on Darwin.
5641 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5642 options::OPT_fno_constant_cfstrings) ||
5643 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5644 options::OPT_mno_constant_cfstrings))
5645 CmdArgs.push_back("-fno-constant-cfstrings");
5646
John Thompsona6fda122009-11-05 20:14:16 +00005647 // -fshort-wchar default varies depending on platform; only
5648 // pass if specified.
Stephen Hines651f13c2014-04-23 16:59:28 -07005649 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5650 options::OPT_fno_short_wchar))
Daniel Dunbar1744a352010-04-27 15:35:03 +00005651 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00005652
Hans Wennborgb087a5d2013-07-31 23:39:13 +00005653 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005654 if (Args.hasFlag(options::OPT_fpascal_strings,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005655 options::OPT_fno_pascal_strings, false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005656 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00005657
Daniel Dunbar88934e82011-10-05 21:04:55 +00005658 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5659 // -fno-pack-struct doesn't apply to -fpack-struct=.
5660 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00005661 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00005662 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00005663 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00005664 } else if (Args.hasFlag(options::OPT_fpack_struct,
5665 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00005666 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00005667 }
5668
Stephen Hines176edba2014-12-01 14:53:08 -08005669 // Handle -fmax-type-align=N and -fno-type-align
5670 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5671 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5672 if (!SkipMaxTypeAlign) {
5673 std::string MaxTypeAlignStr = "-fmax-type-align=";
5674 MaxTypeAlignStr += A->getValue();
5675 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5676 }
5677 } else if (getToolChain().getTriple().isOSDarwin()) {
5678 if (!SkipMaxTypeAlign) {
5679 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5680 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5681 }
5682 }
5683
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005684 // -fcommon is the default unless compiling kernel code or the target says so
5685 bool NoCommonDefault =
5686 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5687 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5688 !NoCommonDefault))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005689 CmdArgs.push_back("-fno-common");
5690
Daniel Dunbar70d3c922009-04-15 02:37:43 +00005691 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00005692 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00005693 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00005694 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005695 D.Diag(diag::warn_drv_clang_unsupported)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005696 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar70d3c922009-04-15 02:37:43 +00005697
Daniel Dunbar06205ca2010-10-15 22:30:42 +00005698 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005699 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005700 D.Diag(diag::err_drv_clang_unsupported)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005701 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar06205ca2010-10-15 22:30:42 +00005702
Stephen Hinesef822542014-07-21 00:47:37 -07005703 // -finput_charset=UTF-8 is default. Reject others
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005704 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5705 StringRef value = inputCharset->getValue();
5706 if (value != "UTF-8")
5707 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5708 << value;
Stephen Hinesef822542014-07-21 00:47:37 -07005709 }
5710
Stephen Hines176edba2014-12-01 14:53:08 -08005711 // -fexec_charset=UTF-8 is default. Reject others
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005712 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5713 StringRef value = execCharset->getValue();
5714 if (value != "UTF-8")
5715 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5716 << value;
Stephen Hines176edba2014-12-01 14:53:08 -08005717 }
5718
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00005719 // -fcaret-diagnostics is default.
5720 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5721 options::OPT_fno_caret_diagnostics, true))
5722 CmdArgs.push_back("-fno-caret-diagnostics");
5723
Daniel Dunbar49138fc2009-04-19 21:09:34 +00005724 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00005725 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00005726 options::OPT_fno_diagnostics_fixit_info))
5727 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005728
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00005729 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00005730 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00005731 options::OPT_fno_diagnostics_show_option))
5732 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00005733
Chris Lattner6fbe8392010-05-04 21:55:25 +00005734 if (const Arg *A =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005735 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattner6fbe8392010-05-04 21:55:25 +00005736 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00005737 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00005738 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00005739
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005740 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregorc9471b02011-05-21 17:07:29 +00005741 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00005742 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00005743 }
5744
Chandler Carruthabaca7a2011-03-27 01:50:55 +00005745 if (Arg *A = Args.getLastArg(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005746 options::OPT_fdiagnostics_show_note_include_stack,
5747 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthabaca7a2011-03-27 01:50:55 +00005748 if (A->getOption().matches(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005749 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthabaca7a2011-03-27 01:50:55 +00005750 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5751 else
5752 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5753 }
5754
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005755 // Color diagnostics are parsed by the driver directly from argv
5756 // and later re-parsed to construct this job; claim any possible
5757 // color diagnostic here to avoid warn_drv_unused_argument and
5758 // diagnose bad OPT_fdiagnostics_color_EQ values.
5759 for (Arg *A : Args) {
5760 const Option &O = A->getOption();
Nico Weber9753d462013-04-17 21:52:44 +00005761 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5762 !O.matches(options::OPT_fdiagnostics_color) &&
5763 !O.matches(options::OPT_fno_color_diagnostics) &&
5764 !O.matches(options::OPT_fno_diagnostics_color) &&
5765 !O.matches(options::OPT_fdiagnostics_color_EQ))
5766 continue;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005767 if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
5768 StringRef Value(A->getValue());
5769 if (Value != "always" && Value != "never" && Value != "auto")
Nico Weber9753d462013-04-17 21:52:44 +00005770 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005771 << ("-fdiagnostics-color=" + Value).str();
Nico Weber9753d462013-04-17 21:52:44 +00005772 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005773 A->claim();
Nico Weber9753d462013-04-17 21:52:44 +00005774 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005775 if (D.getDiags().getDiagnosticOptions().ShowColors)
Daniel Dunbar838be482009-11-04 06:24:57 +00005776 CmdArgs.push_back("-fcolor-diagnostics");
5777
Nico Rieck2956ef42013-09-11 00:38:02 +00005778 if (Args.hasArg(options::OPT_fansi_escape_codes))
5779 CmdArgs.push_back("-fansi-escape-codes");
5780
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00005781 if (!Args.hasFlag(options::OPT_fshow_source_location,
5782 options::OPT_fno_show_source_location))
5783 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00005784
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005785 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregorc9471b02011-05-21 17:07:29 +00005786 true))
5787 CmdArgs.push_back("-fno-show-column");
5788
Douglas Gregora0068fc2010-07-09 17:35:33 +00005789 if (!Args.hasFlag(options::OPT_fspell_checking,
5790 options::OPT_fno_spell_checking))
5791 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00005792
Chad Rosier15490fd2012-12-05 21:08:21 +00005793 // -fno-asm-blocks is default.
5794 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5795 false))
5796 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00005797
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005798 // -fgnu-inline-asm is default.
5799 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5800 options::OPT_fno_gnu_inline_asm, true))
5801 CmdArgs.push_back("-fno-gnu-inline-asm");
5802
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00005803 // Enable vectorization per default according to the optimization level
5804 // selected. For optimization levels that want vectorization we use the alias
5805 // option to simplify the hasFlag logic.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005806 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005807 OptSpecifier VectorizeAliasOption =
5808 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00005809 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00005810 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00005811 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00005812
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005813 // -fslp-vectorize is enabled based on the optimization level selected.
5814 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005815 OptSpecifier SLPVectAliasOption =
5816 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005817 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
5818 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem50ea9632013-04-15 04:57:18 +00005819 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00005820
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00005821 // -fno-slp-vectorize-aggressive is default.
5822 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00005823 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00005824 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00005825
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00005826 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5827 A->render(Args, CmdArgs);
5828
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005829 if (Arg *A = Args.getLastArg(
5830 options::OPT_fsanitize_undefined_strip_path_components_EQ))
5831 A->render(Args, CmdArgs);
5832
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005833 // -fdollars-in-identifiers default varies depending on platform and
5834 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00005835 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005836 options::OPT_fno_dollars_in_identifiers)) {
5837 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00005838 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005839 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00005840 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005841 }
5842
Daniel Dunbare027a4b2009-05-22 19:02:20 +00005843 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5844 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00005845 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00005846 options::OPT_fno_unit_at_a_time)) {
5847 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005848 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00005849 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00005850
Eli Friedman19bda3a2011-11-02 01:53:16 +00005851 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5852 options::OPT_fno_apple_pragma_pack, false))
5853 CmdArgs.push_back("-fapple-pragma-pack");
5854
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005855 // le32-specific flags:
Eli Benderskyf3ecf892013-07-24 18:20:14 +00005856 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5857 // by default.
5858 if (getToolChain().getArch() == llvm::Triple::le32) {
5859 CmdArgs.push_back("-fno-math-builtin");
5860 }
5861
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005862// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5863//
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005864// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00005865#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00005866 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00005867 (getToolChain().getArch() == llvm::Triple::arm ||
5868 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00005869 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5870 CmdArgs.push_back("-fno-builtin-strcat");
5871 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5872 CmdArgs.push_back("-fno-builtin-strcpy");
5873 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00005874#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00005875
Stephen Hinesef822542014-07-21 00:47:37 -07005876 // Enable rewrite includes if the user's asked for it or if we're generating
5877 // diagnostics.
5878 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5879 // nice to enable this when doing a crashdump for modules as well.
5880 if (Args.hasFlag(options::OPT_frewrite_includes,
5881 options::OPT_fno_rewrite_includes, false) ||
5882 (C.isForDiagnostics() && !HaveModules))
5883 CmdArgs.push_back("-frewrite-includes");
5884
Daniel Dunbard98750f2011-03-18 21:23:40 +00005885 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00005886 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00005887 options::OPT_traditional_cpp)) {
5888 if (isa<PreprocessJobAction>(JA))
5889 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005890 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00005891 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00005892 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00005893
Daniel Dunbar1d460332009-03-18 10:01:51 +00005894 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00005895 Args.AddLastArg(CmdArgs, options::OPT_dD);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005896
Ted Kremenek36f6e302011-11-11 00:07:43 +00005897 // Handle serialized diagnostics.
5898 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5899 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00005900 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00005901 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00005902
Ted Kremenek127ff2e2012-09-13 06:41:18 +00005903 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5904 CmdArgs.push_back("-fretain-comments-from-system-headers");
5905
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00005906 // Forward -fcomment-block-commands to -cc1.
5907 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00005908 // Forward -fparse-all-comments to -cc1.
5909 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00005910
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005911 // Turn -fplugin=name.so into -load name.so
5912 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5913 CmdArgs.push_back("-load");
5914 CmdArgs.push_back(A->getValue());
5915 A->claim();
5916 }
5917
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005918 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5919 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00005920 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005921 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5922 A->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00005923
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005924 // We translate this by hand to the -cc1 argument, since nightly test uses
5925 // it and developers have been trained to spell it with -mllvm.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005926 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005927 CmdArgs.push_back("-disable-llvm-optzns");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005928 } else
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005929 A->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005930 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00005931
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005932 // With -save-temps, we want to save the unoptimized bitcode output from the
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005933 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5934 // by the frontend.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07005935 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
5936 // has slightly different breakdown between stages.
5937 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
5938 // pristine IR generated by the frontend. Ideally, a new compile action should
5939 // be added so both IR can be captured.
5940 if (C.getDriver().isSaveTempsEnabled() &&
5941 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005942 CmdArgs.push_back("-disable-llvm-passes");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005943
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00005944 if (Output.getType() == types::TY_Dependencies) {
5945 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00005946 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005947 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00005948 CmdArgs.push_back(Output.getFilename());
5949 } else {
5950 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005951 }
5952
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005953 addDashXForInput(Args, Input, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07005954
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005955 if (Input.isFilename())
5956 CmdArgs.push_back(Input.getFilename());
5957 else
5958 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005959
Chris Lattnere6113de2009-11-03 19:50:27 +00005960 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5961
Daniel Dunbara001c1c2010-07-18 21:16:15 +00005962 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005963
5964 // Optionally embed the -cc1 level arguments into the debug info, for build
5965 // analysis.
5966 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00005967 ArgStringList OriginalArgs;
Stephen Hinesef822542014-07-21 00:47:37 -07005968 for (const auto &Arg : Args)
5969 Arg->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00005970
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00005971 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005972 Flags += Exec;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005973 for (const char *OriginalArg : OriginalArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08005974 SmallString<128> EscapedArg;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005975 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005976 Flags += " ";
Stephen Hines176edba2014-12-01 14:53:08 -08005977 Flags += EscapedArg;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005978 }
5979 CmdArgs.push_back("-dwarf-debug-flags");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005980 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005981 }
5982
Eric Christopher80190392013-02-22 20:12:52 +00005983 // Add the split debug info name to the command lines here so we
5984 // can propagate it to the backend.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005985 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
5986 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5987 isa<BackendJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00005988 const char *SplitDwarfOut;
5989 if (SplitDwarf) {
5990 CmdArgs.push_back("-split-dwarf-file");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005991 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopher80190392013-02-22 20:12:52 +00005992 CmdArgs.push_back(SplitDwarfOut);
5993 }
5994
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005995 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5996 // Include them with -fcuda-include-gpubinary.
5997 if (IsCuda && Inputs.size() > 1)
5998 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
5999 CmdArgs.push_back("-fcuda-include-gpubinary");
6000 CmdArgs.push_back(I->getFilename());
6001 }
6002
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006003 bool WholeProgramVTables =
6004 Args.hasFlag(options::OPT_fwhole_program_vtables,
6005 options::OPT_fno_whole_program_vtables, false);
6006 if (WholeProgramVTables) {
6007 if (!D.isUsingLTO())
6008 D.Diag(diag::err_drv_argument_only_allowed_with)
6009 << "-fwhole-program-vtables"
6010 << "-flto";
6011 CmdArgs.push_back("-fwhole-program-vtables");
6012 }
6013
Eric Christopher80190392013-02-22 20:12:52 +00006014 // Finally add the compile command to the compilation.
Stephen Hines651f13c2014-04-23 16:59:28 -07006015 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006016 Output.getType() == types::TY_Object &&
6017 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Stephen Hines176edba2014-12-01 14:53:08 -08006018 auto CLCommand =
6019 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006020 C.addCommand(llvm::make_unique<FallbackCommand>(
6021 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006022 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
6023 isa<PrecompileJobAction>(JA)) {
6024 // In /fallback builds, run the main compilation even if the pch generation
6025 // fails, so that the main compilation's fallback to cl.exe runs.
6026 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
6027 CmdArgs, Inputs));
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006028 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006029 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006030 }
6031
Eric Christopherff971d72013-02-22 23:50:16 +00006032 // Handle the debug info splitting at object creation time if we're
6033 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00006034 // TODO: Currently only works on linux with newer objcopy.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006035 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopher80190392013-02-22 20:12:52 +00006036 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00006037
Roman Divackybe4c8702011-02-10 16:52:03 +00006038 if (Arg *A = Args.getLastArg(options::OPT_pg))
6039 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006040 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
6041 << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00006042
Daniel Dunbar68fb4692009-04-03 20:51:31 +00006043 // Claim some arguments which clang supports automatically.
6044
Daniel Dunbarf4046862010-04-15 06:18:42 +00006045 // -fpch-preprocess is used with gcc to add a special marker in the output to
6046 // include the PCH file. Clang's PTH solution is completely transparent, so we
6047 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00006048 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006049
Daniel Dunbara880db02009-03-23 19:03:36 +00006050 // Claim some arguments which clang doesn't support, but we don't
6051 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00006052 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
6053 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00006054
Rafael Espindola6155fbe2013-09-04 19:37:35 +00006055 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006056 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006057}
6058
John McCall260611a2012-06-20 06:18:46 +00006059/// Add options related to the Objective-C runtime/ABI.
6060///
6061/// Returns true if the runtime is non-fragile.
6062ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
6063 ArgStringList &cmdArgs,
6064 RewriteKind rewriteKind) const {
6065 // Look for the controlling runtime option.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006066 Arg *runtimeArg =
6067 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
6068 options::OPT_fobjc_runtime_EQ);
John McCall260611a2012-06-20 06:18:46 +00006069
6070 // Just forward -fobjc-runtime= to the frontend. This supercedes
6071 // options about fragility.
6072 if (runtimeArg &&
6073 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
6074 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00006075 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00006076 if (runtime.tryParse(value)) {
6077 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006078 << value;
John McCall260611a2012-06-20 06:18:46 +00006079 }
6080
6081 runtimeArg->render(args, cmdArgs);
6082 return runtime;
6083 }
6084
6085 // Otherwise, we'll need the ABI "version". Version numbers are
6086 // slightly confusing for historical reasons:
6087 // 1 - Traditional "fragile" ABI
6088 // 2 - Non-fragile ABI, version 1
6089 // 3 - Non-fragile ABI, version 2
6090 unsigned objcABIVersion = 1;
6091 // If -fobjc-abi-version= is present, use that to set the version.
6092 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00006093 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00006094 if (value == "1")
6095 objcABIVersion = 1;
6096 else if (value == "2")
6097 objcABIVersion = 2;
6098 else if (value == "3")
6099 objcABIVersion = 3;
6100 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006101 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall260611a2012-06-20 06:18:46 +00006102 } else {
6103 // Otherwise, determine if we are using the non-fragile ABI.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006104 bool nonFragileABIIsDefault =
6105 (rewriteKind == RK_NonFragile ||
6106 (rewriteKind == RK_None &&
6107 getToolChain().IsObjCNonFragileABIDefault()));
John McCall260611a2012-06-20 06:18:46 +00006108 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
6109 options::OPT_fno_objc_nonfragile_abi,
6110 nonFragileABIIsDefault)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006111// Determine the non-fragile ABI version to use.
John McCall260611a2012-06-20 06:18:46 +00006112#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
6113 unsigned nonFragileABIVersion = 1;
6114#else
6115 unsigned nonFragileABIVersion = 2;
6116#endif
6117
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006118 if (Arg *abiArg =
6119 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00006120 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00006121 if (value == "1")
6122 nonFragileABIVersion = 1;
6123 else if (value == "2")
6124 nonFragileABIVersion = 2;
6125 else
6126 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006127 << value;
John McCall260611a2012-06-20 06:18:46 +00006128 }
6129
6130 objcABIVersion = 1 + nonFragileABIVersion;
6131 } else {
6132 objcABIVersion = 1;
6133 }
6134 }
6135
6136 // We don't actually care about the ABI version other than whether
6137 // it's non-fragile.
6138 bool isNonFragile = objcABIVersion != 1;
6139
6140 // If we have no runtime argument, ask the toolchain for its default runtime.
6141 // However, the rewriter only really supports the Mac runtime, so assume that.
6142 ObjCRuntime runtime;
6143 if (!runtimeArg) {
6144 switch (rewriteKind) {
6145 case RK_None:
6146 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6147 break;
6148 case RK_Fragile:
6149 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
6150 break;
6151 case RK_NonFragile:
6152 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6153 break;
6154 }
6155
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006156 // -fnext-runtime
John McCall260611a2012-06-20 06:18:46 +00006157 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
6158 // On Darwin, make this use the default behavior for the toolchain.
6159 if (getToolChain().getTriple().isOSDarwin()) {
6160 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6161
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006162 // Otherwise, build for a generic macosx port.
John McCall260611a2012-06-20 06:18:46 +00006163 } else {
6164 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6165 }
6166
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006167 // -fgnu-runtime
John McCall260611a2012-06-20 06:18:46 +00006168 } else {
6169 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006170 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnalla422cd02012-07-04 10:37:03 +00006171 // non-fragile mode or the GCC runtime in fragile mode.
6172 if (isNonFragile)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006173 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnalla422cd02012-07-04 10:37:03 +00006174 else
6175 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00006176 }
6177
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006178 cmdArgs.push_back(
6179 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall260611a2012-06-20 06:18:46 +00006180 return runtime;
6181}
6182
Stephen Hinesef822542014-07-21 00:47:37 -07006183static bool maybeConsumeDash(const std::string &EH, size_t &I) {
6184 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
6185 I += HaveDash;
6186 return !HaveDash;
6187}
6188
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006189namespace {
Stephen Hinesef822542014-07-21 00:47:37 -07006190struct EHFlags {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006191 bool Synch = false;
6192 bool Asynch = false;
6193 bool NoUnwindC = false;
Stephen Hinesef822542014-07-21 00:47:37 -07006194};
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006195} // end anonymous namespace
Stephen Hinesef822542014-07-21 00:47:37 -07006196
6197/// /EH controls whether to run destructor cleanups when exceptions are
6198/// thrown. There are three modifiers:
6199/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
6200/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
6201/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006202/// - c: Assume that extern "C" functions are implicitly nounwind.
Stephen Hinesef822542014-07-21 00:47:37 -07006203/// The default is /EHs-c-, meaning cleanups are disabled.
6204static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
6205 EHFlags EH;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006206
6207 std::vector<std::string> EHArgs =
6208 Args.getAllArgValues(options::OPT__SLASH_EH);
Stephen Hinesef822542014-07-21 00:47:37 -07006209 for (auto EHVal : EHArgs) {
6210 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
6211 switch (EHVal[I]) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006212 case 'a':
6213 EH.Asynch = maybeConsumeDash(EHVal, I);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006214 if (EH.Asynch)
6215 EH.Synch = false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006216 continue;
6217 case 'c':
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006218 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006219 continue;
6220 case 's':
6221 EH.Synch = maybeConsumeDash(EHVal, I);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006222 if (EH.Synch)
6223 EH.Asynch = false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006224 continue;
6225 default:
6226 break;
Stephen Hinesef822542014-07-21 00:47:37 -07006227 }
6228 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6229 break;
6230 }
6231 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006232 // The /GX, /GX- flags are only processed if there are not /EH flags.
6233 // The default is that /GX is not specified.
6234 if (EHArgs.empty() &&
6235 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6236 /*default=*/false)) {
6237 EH.Synch = true;
6238 EH.NoUnwindC = true;
6239 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006240
Stephen Hinesef822542014-07-21 00:47:37 -07006241 return EH;
6242}
6243
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006244void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6245 ArgStringList &CmdArgs,
6246 codegenoptions::DebugInfoKind *DebugInfoKind,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006247 bool *EmitCodeView) const {
Hans Wennborgb3574792013-08-08 00:17:41 +00006248 unsigned RTOptionID = options::OPT__SLASH_MT;
6249
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006250 if (Args.hasArg(options::OPT__SLASH_LDd))
6251 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6252 // but defining _DEBUG is sticky.
6253 RTOptionID = options::OPT__SLASH_MTd;
6254
Hans Wennborg76da1782013-09-18 22:26:39 +00006255 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00006256 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00006257
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006258 StringRef FlagForCRT;
6259 switch (RTOptionID) {
6260 case options::OPT__SLASH_MD:
6261 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborgb3574792013-08-08 00:17:41 +00006262 CmdArgs.push_back("-D_DEBUG");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006263 CmdArgs.push_back("-D_MT");
6264 CmdArgs.push_back("-D_DLL");
6265 FlagForCRT = "--dependent-lib=msvcrt";
6266 break;
6267 case options::OPT__SLASH_MDd:
6268 CmdArgs.push_back("-D_DEBUG");
6269 CmdArgs.push_back("-D_MT");
6270 CmdArgs.push_back("-D_DLL");
6271 FlagForCRT = "--dependent-lib=msvcrtd";
6272 break;
6273 case options::OPT__SLASH_MT:
6274 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborgb3574792013-08-08 00:17:41 +00006275 CmdArgs.push_back("-D_DEBUG");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006276 CmdArgs.push_back("-D_MT");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006277 CmdArgs.push_back("-flto-visibility-public-std");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006278 FlagForCRT = "--dependent-lib=libcmt";
6279 break;
6280 case options::OPT__SLASH_MTd:
6281 CmdArgs.push_back("-D_DEBUG");
6282 CmdArgs.push_back("-D_MT");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006283 CmdArgs.push_back("-flto-visibility-public-std");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006284 FlagForCRT = "--dependent-lib=libcmtd";
6285 break;
6286 default:
6287 llvm_unreachable("Unexpected option ID.");
Hans Wennborgb3574792013-08-08 00:17:41 +00006288 }
6289
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006290 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6291 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6292 } else {
6293 CmdArgs.push_back(FlagForCRT.data());
6294
6295 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6296 // users want. The /Za flag to cl.exe turns this off, but it's not
6297 // implemented in clang.
6298 CmdArgs.push_back("--dependent-lib=oldnames");
6299 }
Hans Wennborgf0f98912013-08-08 19:54:30 +00006300
Stephen Hines176edba2014-12-01 14:53:08 -08006301 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6302 // would produce interleaved output, so ignore /showIncludes in such cases.
6303 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6304 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6305 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00006306
Stephen Hinesef822542014-07-21 00:47:37 -07006307 // This controls whether or not we emit RTTI data for polymorphic types.
6308 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6309 /*default=*/false))
6310 CmdArgs.push_back("-fno-rtti-data");
Stephen Hines651f13c2014-04-23 16:59:28 -07006311
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006312 // This controls whether or not we emit stack-protector instrumentation.
6313 // In MSVC, Buffer Security Check (/GS) is on by default.
6314 if (Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_,
6315 /*default=*/true)) {
6316 CmdArgs.push_back("-stack-protector");
6317 CmdArgs.push_back(Args.MakeArgString(Twine(LangOptions::SSPStrong)));
6318 }
6319
6320 // Emit CodeView if -Z7 or -Zd are present.
6321 if (Arg *DebugInfoArg =
6322 Args.getLastArg(options::OPT__SLASH_Z7, options::OPT__SLASH_Zd)) {
6323 *EmitCodeView = true;
6324 if (DebugInfoArg->getOption().matches(options::OPT__SLASH_Z7))
6325 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
6326 else
6327 *DebugInfoKind = codegenoptions::DebugLineTablesOnly;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006328 CmdArgs.push_back("-gcodeview");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006329 } else {
6330 *EmitCodeView = false;
6331 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006332
Stephen Hines651f13c2014-04-23 16:59:28 -07006333 const Driver &D = getToolChain().getDriver();
Stephen Hinesef822542014-07-21 00:47:37 -07006334 EHFlags EH = parseClangCLEHFlags(D, Args);
Stephen Hinesef822542014-07-21 00:47:37 -07006335 if (EH.Synch || EH.Asynch) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006336 if (types::isCXX(InputType))
6337 CmdArgs.push_back("-fcxx-exceptions");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006338 CmdArgs.push_back("-fexceptions");
Stephen Hinesef822542014-07-21 00:47:37 -07006339 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006340 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6341 CmdArgs.push_back("-fexternc-nounwind");
Stephen Hinesef822542014-07-21 00:47:37 -07006342
6343 // /EP should expand to -E -P.
6344 if (Args.hasArg(options::OPT__SLASH_EP)) {
6345 CmdArgs.push_back("-E");
6346 CmdArgs.push_back("-P");
6347 }
6348
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006349 unsigned VolatileOptionID;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006350 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6351 getToolChain().getArch() == llvm::Triple::x86)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006352 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6353 else
6354 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6355
6356 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6357 VolatileOptionID = A->getOption().getID();
6358
6359 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6360 CmdArgs.push_back("-fms-volatile");
6361
Stephen Hines651f13c2014-04-23 16:59:28 -07006362 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6363 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6364 if (MostGeneralArg && BestCaseArg)
6365 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6366 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6367
6368 if (MostGeneralArg) {
6369 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6370 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6371 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6372
6373 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6374 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6375 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6376 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6377 << FirstConflict->getAsString(Args)
6378 << SecondConflict->getAsString(Args);
6379
6380 if (SingleArg)
6381 CmdArgs.push_back("-fms-memptr-rep=single");
6382 else if (MultipleArg)
6383 CmdArgs.push_back("-fms-memptr-rep=multiple");
6384 else
6385 CmdArgs.push_back("-fms-memptr-rep=virtual");
6386 }
6387
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006388 if (Args.getLastArg(options::OPT__SLASH_Gd))
6389 CmdArgs.push_back("-fdefault-calling-conv=cdecl");
6390 else if (Args.getLastArg(options::OPT__SLASH_Gr))
6391 CmdArgs.push_back("-fdefault-calling-conv=fastcall");
6392 else if (Args.getLastArg(options::OPT__SLASH_Gz))
6393 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
6394 else if (Args.getLastArg(options::OPT__SLASH_Gv))
6395 CmdArgs.push_back("-fdefault-calling-conv=vectorcall");
6396
Stephen Hines651f13c2014-04-23 16:59:28 -07006397 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6398 A->render(Args, CmdArgs);
6399
Hans Wennborgb6475522013-09-10 01:07:07 +00006400 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6401 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00006402 if (Args.hasArg(options::OPT__SLASH_fallback))
6403 CmdArgs.push_back("msvc-fallback");
6404 else
6405 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00006406 }
Hans Wennborgb3574792013-08-08 00:17:41 +00006407}
6408
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006409visualstudio::Compiler *Clang::getCLFallback() const {
Stephen Hinesef822542014-07-21 00:47:37 -07006410 if (!CLFallback)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006411 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Stephen Hinesef822542014-07-21 00:47:37 -07006412 return CLFallback.get();
6413}
6414
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006415void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6416 ArgStringList &CmdArgs) const {
6417 StringRef CPUName;
6418 StringRef ABIName;
6419 const llvm::Triple &Triple = getToolChain().getTriple();
6420 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6421
6422 CmdArgs.push_back("-target-abi");
6423 CmdArgs.push_back(ABIName.data());
6424}
6425
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006426void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006427 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006428 const ArgList &Args,
6429 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006430 ArgStringList CmdArgs;
6431
6432 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6433 const InputInfo &Input = Inputs[0];
6434
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006435 std::string TripleStr =
6436 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6437 const llvm::Triple Triple(TripleStr);
6438
Rafael Espindoladbe80d92010-11-17 22:13:25 +00006439 // Don't warn about "clang -w -c foo.s"
6440 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006441 // and "clang -emit-llvm -c foo.s"
6442 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00006443
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006444 claimNoWarnArgs(Args);
6445
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006446 // Invoke ourselves in -cc1as mode.
6447 //
6448 // FIXME: Implement custom jobs for internal actions.
6449 CmdArgs.push_back("-cc1as");
6450
6451 // Add the "effective" target triple.
6452 CmdArgs.push_back("-triple");
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006453 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6454
6455 // Set the output mode, we currently only expect to be used as a real
6456 // assembler.
6457 CmdArgs.push_back("-filetype");
6458 CmdArgs.push_back("obj");
6459
Eric Christopher27e2b982012-12-18 00:31:10 +00006460 // Set the main file name, so that debug info works even with
6461 // -save-temps or preprocessed assembly.
6462 CmdArgs.push_back("-main-file-name");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006463 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher27e2b982012-12-18 00:31:10 +00006464
Rafael Espindolab330e402013-08-20 22:12:08 +00006465 // Add the target cpu
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006466 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindolab330e402013-08-20 22:12:08 +00006467 if (!CPU.empty()) {
6468 CmdArgs.push_back("-target-cpu");
6469 CmdArgs.push_back(Args.MakeArgString(CPU));
6470 }
6471
Rafael Espindola146dbbf2013-08-21 16:39:20 +00006472 // Add the target features
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006473 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbachfc308292012-02-10 20:37:10 +00006474
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00006475 // Ignore explicit -force_cpusubtype_ALL option.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006476 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
6477
6478 // Pass along any -I options so we get proper .include search paths.
6479 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006480
Eric Christopher8f0a4032012-01-10 00:38:01 +00006481 // Determine the original source input.
6482 const Action *SourceAction = &JA;
6483 while (SourceAction->getKind() != Action::InputClass) {
6484 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6485 SourceAction = SourceAction->getInputs()[0];
6486 }
6487
Chandler Carruthd566df62012-12-17 21:40:04 +00006488 // Forward -g and handle debug info related flags, assuming we are dealing
6489 // with an actual assembly file.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006490 bool WantDebug = false;
6491 unsigned DwarfVersion = 0;
6492 Args.ClaimAllArgs(options::OPT_g_Group);
6493 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6494 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6495 !A->getOption().matches(options::OPT_ggdb0);
6496 if (WantDebug)
6497 DwarfVersion = DwarfVersionNum(A->getSpelling());
6498 }
6499 if (DwarfVersion == 0)
6500 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6501
6502 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6503
Eric Christopher8f0a4032012-01-10 00:38:01 +00006504 if (SourceAction->getType() == types::TY_Asm ||
6505 SourceAction->getType() == types::TY_PP_Asm) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006506 // You might think that it would be ok to set DebugInfoKind outside of
6507 // the guard for source type, however there is a test which asserts
6508 // that some assembler invocation receives no -debug-info-kind,
6509 // and it's not clear whether that test is just overly restrictive.
6510 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6511 : codegenoptions::NoDebugInfo);
Chandler Carruthd566df62012-12-17 21:40:04 +00006512 // Add the -fdebug-compilation-dir flag if needed.
6513 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00006514
6515 // Set the AT_producer to the clang version when using the integrated
6516 // assembler on assembly source files.
6517 CmdArgs.push_back("-dwarf-debug-producer");
6518 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006519
6520 // And pass along -I options
6521 Args.AddAllArgs(CmdArgs, options::OPT_I);
6522 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006523 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6524 llvm::DebuggerKind::Default);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006525
6526 // Handle -fPIC et al -- the relocation-model affects the assembler
6527 // for some targets.
6528 llvm::Reloc::Model RelocationModel;
6529 unsigned PICLevel;
6530 bool IsPIE;
6531 std::tie(RelocationModel, PICLevel, IsPIE) =
6532 ParsePICArgs(getToolChain(), Triple, Args);
6533
6534 const char *RMName = RelocationModelName(RelocationModel);
6535 if (RMName) {
6536 CmdArgs.push_back("-mrelocation-model");
6537 CmdArgs.push_back(RMName);
Eric Christopher8f0a4032012-01-10 00:38:01 +00006538 }
Kevin Enderby567003e2011-12-22 19:31:58 +00006539
6540 // Optionally embed the -cc1as level arguments into the debug info, for build
6541 // analysis.
6542 if (getToolChain().UseDwarfDebugFlags()) {
6543 ArgStringList OriginalArgs;
Stephen Hinesef822542014-07-21 00:47:37 -07006544 for (const auto &Arg : Args)
6545 Arg->render(Args, OriginalArgs);
Kevin Enderby567003e2011-12-22 19:31:58 +00006546
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00006547 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00006548 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6549 Flags += Exec;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006550 for (const char *OriginalArg : OriginalArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08006551 SmallString<128> EscapedArg;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006552 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby567003e2011-12-22 19:31:58 +00006553 Flags += " ";
Stephen Hines176edba2014-12-01 14:53:08 -08006554 Flags += EscapedArg;
Kevin Enderby567003e2011-12-22 19:31:58 +00006555 }
6556 CmdArgs.push_back("-dwarf-debug-flags");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006557 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby567003e2011-12-22 19:31:58 +00006558 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006559
6560 // FIXME: Add -static support, once we have it.
6561
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006562 // Add target specific flags.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006563 switch (getToolChain().getArch()) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006564 default:
6565 break;
6566
6567 case llvm::Triple::mips:
6568 case llvm::Triple::mipsel:
6569 case llvm::Triple::mips64:
6570 case llvm::Triple::mips64el:
6571 AddMIPSTargetArgs(Args, CmdArgs);
6572 break;
6573 }
6574
Stephen Hines651f13c2014-04-23 16:59:28 -07006575 // Consume all the warning flags. Usually this would be handled more
6576 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6577 // doesn't handle that so rather than warning about unused flags that are
6578 // actually used, we'll lie by omission instead.
6579 // FIXME: Stop lying and consume only the appropriate driver flags
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006580 Args.ClaimAllArgs(options::OPT_W_Group);
Stephen Hines651f13c2014-04-23 16:59:28 -07006581
David Blaikie73168db2013-07-25 21:19:01 +00006582 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6583 getToolChain().getDriver());
6584
Daniel Dunbar3df23252011-04-29 17:53:18 +00006585 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006586
6587 assert(Output.isFilename() && "Unexpected lipo output.");
6588 CmdArgs.push_back("-o");
6589 CmdArgs.push_back(Output.getFilename());
6590
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006591 assert(Input.isFilename() && "Invalid input.");
6592 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006593
Daniel Dunbara001c1c2010-07-18 21:16:15 +00006594 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006595 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher708d72a2013-04-10 21:30:40 +00006596
6597 // Handle the debug info splitting at object creation time if we're
6598 // creating an object.
6599 // TODO: Currently only works on linux with newer objcopy.
6600 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006601 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00006602 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006603 SplitDebugName(Args, Input));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006604}
6605
Stephen Hines176edba2014-12-01 14:53:08 -08006606void GnuTool::anchor() {}
6607
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006608void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006609 const InputInfo &Output,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006610 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006611 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006612 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006613 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006614
Stephen Hinesef822542014-07-21 00:47:37 -07006615 for (const auto &A : Args) {
Michael J. Spencer91e06da2012-10-19 22:37:06 +00006616 if (forwardToGCC(A->getOption())) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006617 // It is unfortunate that we have to claim here, as this means
6618 // we will basically never report anything interesting for
6619 // platforms using a generic gcc, even if we are just using gcc
6620 // to get to the assembler.
6621 A->claim();
6622
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00006623 // Don't forward any -g arguments to assembly steps.
6624 if (isa<AssembleJobAction>(JA) &&
6625 A->getOption().matches(options::OPT_g_Group))
6626 continue;
6627
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00006628 // Don't forward any -W arguments to assembly and link steps.
6629 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6630 A->getOption().matches(options::OPT_W_Group))
6631 continue;
6632
Daniel Dunbar1d460332009-03-18 10:01:51 +00006633 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00006634 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006635 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006636
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006637 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006638
6639 // If using a driver driver, force the arch.
Bob Wilson905c45f2011-10-14 05:03:44 +00006640 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006641 CmdArgs.push_back("-arch");
Stephen Hines176edba2014-12-01 14:53:08 -08006642 CmdArgs.push_back(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006643 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006644 }
6645
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006646 // Try to force gcc to match the tool chain we want, if we recognize
6647 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00006648 //
6649 // FIXME: The triple class should directly provide the information we want
6650 // here.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006651 switch (getToolChain().getArch()) {
6652 default:
6653 break;
6654 case llvm::Triple::x86:
6655 case llvm::Triple::ppc:
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006656 CmdArgs.push_back("-m32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006657 break;
6658 case llvm::Triple::x86_64:
6659 case llvm::Triple::ppc64:
6660 case llvm::Triple::ppc64le:
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006661 CmdArgs.push_back("-m64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006662 break;
6663 case llvm::Triple::sparcel:
6664 CmdArgs.push_back("-EL");
6665 break;
6666 }
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006667
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006668 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006669 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00006670 CmdArgs.push_back(Output.getFilename());
6671 } else {
6672 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006673 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00006674 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006675
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006676 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006677
6678 // Only pass -x if gcc will understand it; otherwise hope gcc
6679 // understands the suffix correctly. The main use case this would go
6680 // wrong in is for linker inputs if they happened to have an odd
6681 // suffix; really the only way to get this to happen is a command
6682 // like '-x foobar a.c' which will treat a.c like a linker input.
6683 //
6684 // FIXME: For the linker case specifically, can we safely convert
6685 // inputs into '-Wl,' options?
Stephen Hinesef822542014-07-21 00:47:37 -07006686 for (const auto &II : Inputs) {
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00006687 // Don't try to pass LLVM or AST inputs to a generic gcc.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006688 if (types::isLLVMIR(II.getType()))
Chris Lattner5f9e2722011-07-23 10:55:15 +00006689 D.Diag(diag::err_drv_no_linker_llvm_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006690 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00006691 else if (II.getType() == types::TY_AST)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006692 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00006693 else if (II.getType() == types::TY_ModuleFile)
6694 D.Diag(diag::err_drv_no_module_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006695 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00006696
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006697 if (types::canTypeBeUserSpecified(II.getType())) {
6698 CmdArgs.push_back("-x");
6699 CmdArgs.push_back(types::getTypeName(II.getType()));
6700 }
6701
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006702 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00006703 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00006704 else {
6705 const Arg &A = II.getInputArg();
6706
6707 // Reverse translate some rewritten options.
6708 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6709 CmdArgs.push_back("-lstdc++");
6710 continue;
6711 }
6712
Daniel Dunbar115a7922009-03-19 07:29:38 +00006713 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00006714 A.render(Args, CmdArgs);
6715 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006716 }
6717
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006718 const std::string &customGCCName = D.getCCCGenericGCCName();
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00006719 const char *GCCName;
6720 if (!customGCCName.empty())
6721 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00006722 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00006723 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00006724 } else
6725 GCCName = "gcc";
6726
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006727 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
6728 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006729}
6730
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006731void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6732 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006733 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006734}
6735
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006736void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6737 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00006738 const Driver &D = getToolChain().getDriver();
6739
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006740 switch (JA.getType()) {
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006741 // If -flto, etc. are present then make sure not to force assembly output.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006742 case types::TY_LLVM_IR:
6743 case types::TY_LTO_IR:
6744 case types::TY_LLVM_BC:
6745 case types::TY_LTO_BC:
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006746 CmdArgs.push_back("-c");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006747 break;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07006748 // We assume we've got an "integrated" assembler in that gcc will produce an
6749 // object file itself.
6750 case types::TY_Object:
6751 CmdArgs.push_back("-c");
6752 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006753 case types::TY_PP_Asm:
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006754 CmdArgs.push_back("-S");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006755 break;
6756 case types::TY_Nothing:
6757 CmdArgs.push_back("-fsyntax-only");
6758 break;
6759 default:
6760 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbar64952502010-02-11 03:16:21 +00006761 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006762}
6763
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006764void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6765 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006766 // The types are (hopefully) good enough.
6767}
6768
Tony Linthicum96319392011-12-12 21:14:55 +00006769// Hexagon tools start.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006770void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
6771 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00006772}
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006773
6774void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6775 const InputInfo &Output,
6776 const InputInfoList &Inputs,
6777 const ArgList &Args,
6778 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006779 claimNoWarnArgs(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00006780
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006781 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6782 const Driver &D = HTC.getDriver();
Tony Linthicum96319392011-12-12 21:14:55 +00006783 ArgStringList CmdArgs;
6784
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006785 std::string MArchString = "-march=hexagon";
6786 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum96319392011-12-12 21:14:55 +00006787
6788 RenderExtraToolArgs(JA, CmdArgs);
6789
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006790 std::string AsName = "hexagon-llvm-mc";
6791 std::string MCpuString = "-mcpu=hexagon" +
6792 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6793 CmdArgs.push_back("-filetype=obj");
6794 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6795
Tony Linthicum96319392011-12-12 21:14:55 +00006796 if (Output.isFilename()) {
6797 CmdArgs.push_back("-o");
6798 CmdArgs.push_back(Output.getFilename());
6799 } else {
6800 assert(Output.isNothing() && "Unexpected output");
6801 CmdArgs.push_back("-fsyntax-only");
6802 }
6803
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006804 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6805 std::string N = llvm::utostr(G.getValue());
6806 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6807 }
Tony Linthicum96319392011-12-12 21:14:55 +00006808
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006809 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtis3d8d4222012-12-07 17:23:04 +00006810
Tony Linthicum96319392011-12-12 21:14:55 +00006811 // Only pass -x if gcc will understand it; otherwise hope gcc
6812 // understands the suffix correctly. The main use case this would go
6813 // wrong in is for linker inputs if they happened to have an odd
6814 // suffix; really the only way to get this to happen is a command
6815 // like '-x foobar a.c' which will treat a.c like a linker input.
6816 //
6817 // FIXME: For the linker case specifically, can we safely convert
6818 // inputs into '-Wl,' options?
Stephen Hinesef822542014-07-21 00:47:37 -07006819 for (const auto &II : Inputs) {
Tony Linthicum96319392011-12-12 21:14:55 +00006820 // Don't try to pass LLVM or AST inputs to a generic gcc.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006821 if (types::isLLVMIR(II.getType()))
Tony Linthicum96319392011-12-12 21:14:55 +00006822 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006823 << HTC.getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00006824 else if (II.getType() == types::TY_AST)
6825 D.Diag(clang::diag::err_drv_no_ast_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006826 << HTC.getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00006827 else if (II.getType() == types::TY_ModuleFile)
6828 D.Diag(diag::err_drv_no_module_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006829 << HTC.getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00006830
6831 if (II.isFilename())
6832 CmdArgs.push_back(II.getFilename());
6833 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006834 // Don't render as input, we need gcc to do the translations.
6835 // FIXME: What is this?
Tony Linthicum96319392011-12-12 21:14:55 +00006836 II.getInputArg().render(Args, CmdArgs);
6837 }
6838
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006839 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
6840 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum96319392011-12-12 21:14:55 +00006841}
Stephen Hinesef822542014-07-21 00:47:37 -07006842
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006843void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6844 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00006845}
6846
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006847static void
6848constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6849 const toolchains::HexagonToolChain &HTC,
6850 const InputInfo &Output, const InputInfoList &Inputs,
6851 const ArgList &Args, ArgStringList &CmdArgs,
6852 const char *LinkingOutput) {
Tony Linthicum96319392011-12-12 21:14:55 +00006853
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006854 const Driver &D = HTC.getDriver();
Tony Linthicum96319392011-12-12 21:14:55 +00006855
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006856 //----------------------------------------------------------------------------
6857 //
6858 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006859 bool IsStatic = Args.hasArg(options::OPT_static);
6860 bool IsShared = Args.hasArg(options::OPT_shared);
6861 bool IsPIE = Args.hasArg(options::OPT_pie);
6862 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6863 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6864 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6865 bool UseG0 = false;
6866 bool UseShared = IsShared && !IsStatic;
Tony Linthicum96319392011-12-12 21:14:55 +00006867
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006868 //----------------------------------------------------------------------------
6869 // Silence warnings for various options
6870 //----------------------------------------------------------------------------
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006871 Args.ClaimAllArgs(options::OPT_g_Group);
6872 Args.ClaimAllArgs(options::OPT_emit_llvm);
6873 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6874 // handled somewhere else.
6875 Args.ClaimAllArgs(options::OPT_static_libgcc);
6876
6877 //----------------------------------------------------------------------------
6878 //
6879 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006880 if (Args.hasArg(options::OPT_s))
6881 CmdArgs.push_back("-s");
6882
6883 if (Args.hasArg(options::OPT_r))
6884 CmdArgs.push_back("-r");
6885
6886 for (const auto &Opt : HTC.ExtraOpts)
Stephen Hinesef822542014-07-21 00:47:37 -07006887 CmdArgs.push_back(Opt.c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00006888
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006889 CmdArgs.push_back("-march=hexagon");
6890 std::string CpuVer =
6891 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6892 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6893 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop43115d42012-01-13 20:37:10 +00006894
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006895 if (IsShared) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006896 CmdArgs.push_back("-shared");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006897 // The following should be the default, but doing as hexagon-gcc does.
6898 CmdArgs.push_back("-call_shared");
Tony Linthicum96319392011-12-12 21:14:55 +00006899 }
6900
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006901 if (IsStatic)
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006902 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00006903
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006904 if (IsPIE && !IsShared)
Matthew Curtis33c95f12012-12-06 17:49:03 +00006905 CmdArgs.push_back("-pie");
6906
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006907 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6908 std::string N = llvm::utostr(G.getValue());
6909 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6910 UseG0 = G.getValue() == 0;
Matthew Curtis33c95f12012-12-06 17:49:03 +00006911 }
6912
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006913 //----------------------------------------------------------------------------
6914 //
6915 //----------------------------------------------------------------------------
6916 CmdArgs.push_back("-o");
6917 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00006918
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006919 //----------------------------------------------------------------------------
6920 // moslib
6921 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006922 std::vector<std::string> OsLibs;
6923 bool HasStandalone = false;
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006924
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006925 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6926 A->claim();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006927 OsLibs.emplace_back(A->getValue());
6928 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00006929 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006930 if (OsLibs.empty()) {
6931 OsLibs.push_back("standalone");
6932 HasStandalone = true;
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006933 }
Tony Linthicum96319392011-12-12 21:14:55 +00006934
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006935 //----------------------------------------------------------------------------
6936 // Start Files
6937 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006938 const std::string MCpuSuffix = "/" + CpuVer;
6939 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6940 const std::string RootDir =
6941 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6942 const std::string StartSubDir =
6943 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006944
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006945 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6946 const char *Name) -> std::string {
6947 std::string RelName = SubDir + Name;
6948 std::string P = HTC.GetFilePath(RelName.c_str());
6949 if (llvm::sys::fs::exists(P))
6950 return P;
6951 return RootDir + RelName;
6952 };
6953
6954 if (IncStdLib && IncStartFiles) {
6955 if (!IsShared) {
6956 if (HasStandalone) {
6957 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6958 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006959 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006960 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6961 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006962 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006963 std::string Init = UseShared
6964 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6965 : Find(RootDir, StartSubDir, "/init.o");
6966 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006967 }
6968
6969 //----------------------------------------------------------------------------
6970 // Library Search Paths
6971 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006972 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
Stephen Hinesef822542014-07-21 00:47:37 -07006973 for (const auto &LibPath : LibPaths)
6974 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006975
6976 //----------------------------------------------------------------------------
6977 //
6978 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006979 Args.AddAllArgs(CmdArgs,
6980 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6981 options::OPT_t, options::OPT_u_Group});
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006982
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006983 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006984
6985 //----------------------------------------------------------------------------
6986 // Libraries
6987 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006988 if (IncStdLib && IncDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006989 if (D.CCCIsCXX()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006990 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006991 CmdArgs.push_back("-lm");
6992 }
6993
6994 CmdArgs.push_back("--start-group");
6995
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006996 if (!IsShared) {
6997 for (const std::string &Lib : OsLibs)
6998 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006999 CmdArgs.push_back("-lc");
7000 }
7001 CmdArgs.push_back("-lgcc");
7002
7003 CmdArgs.push_back("--end-group");
7004 }
7005
7006 //----------------------------------------------------------------------------
7007 // End files
7008 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007009 if (IncStdLib && IncStartFiles) {
7010 std::string Fini = UseShared
7011 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
7012 : Find(RootDir, StartSubDir, "/fini.o");
7013 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00007014 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007015}
7016
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007017void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7018 const InputInfo &Output,
7019 const InputInfoList &Inputs,
7020 const ArgList &Args,
7021 const char *LinkingOutput) const {
7022 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007023
7024 ArgStringList CmdArgs;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007025 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007026 LinkingOutput);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00007027
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007028 std::string Linker = HTC.GetProgramPath("hexagon-link");
Stephen Hines176edba2014-12-01 14:53:08 -08007029 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007030 CmdArgs, Inputs));
Tony Linthicum96319392011-12-12 21:14:55 +00007031}
7032// Hexagon tools end.
7033
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007034void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7035 const InputInfo &Output,
7036 const InputInfoList &Inputs,
7037 const ArgList &Args,
7038 const char *LinkingOutput) const {
7039
7040 std::string Linker = getToolChain().GetProgramPath(getShortName());
7041 ArgStringList CmdArgs;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007042 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007043 CmdArgs.push_back("-shared");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007044 CmdArgs.push_back("-o");
7045 CmdArgs.push_back(Output.getFilename());
7046 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
7047 CmdArgs, Inputs));
7048}
7049// AMDGPU tools end.
7050
7051wasm::Linker::Linker(const ToolChain &TC)
7052 : GnuTool("wasm::Linker", "lld", TC) {}
7053
7054bool wasm::Linker::isLinkJob() const {
7055 return true;
7056}
7057
7058bool wasm::Linker::hasIntegratedCPP() const {
7059 return false;
7060}
7061
7062void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7063 const InputInfo &Output,
7064 const InputInfoList &Inputs,
7065 const ArgList &Args,
7066 const char *LinkingOutput) const {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007067
7068 const ToolChain &ToolChain = getToolChain();
7069 const Driver &D = ToolChain.getDriver();
7070 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007071 ArgStringList CmdArgs;
7072 CmdArgs.push_back("-flavor");
7073 CmdArgs.push_back("ld");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007074
7075 // Enable garbage collection of unused input sections by default, since code
7076 // size is of particular importance. This is significantly facilitated by
7077 // the enabling of -ffunction-sections and -fdata-sections in
7078 // Clang::ConstructJob.
7079 if (areOptimizationsEnabled(Args))
7080 CmdArgs.push_back("--gc-sections");
7081
7082 if (Args.hasArg(options::OPT_rdynamic))
7083 CmdArgs.push_back("-export-dynamic");
7084 if (Args.hasArg(options::OPT_s))
7085 CmdArgs.push_back("--strip-all");
7086 if (Args.hasArg(options::OPT_shared))
7087 CmdArgs.push_back("-shared");
7088 if (Args.hasArg(options::OPT_static))
7089 CmdArgs.push_back("-Bstatic");
7090
7091 Args.AddAllArgs(CmdArgs, options::OPT_L);
7092 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
7093
7094 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
7095 if (Args.hasArg(options::OPT_shared))
7096 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
7097 else if (Args.hasArg(options::OPT_pie))
7098 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
7099 else
7100 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
7101
7102 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7103 }
7104
7105 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7106
7107 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
7108 if (D.CCCIsCXX())
7109 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7110
7111 if (Args.hasArg(options::OPT_pthread))
7112 CmdArgs.push_back("-lpthread");
7113
7114 CmdArgs.push_back("-lc");
7115 CmdArgs.push_back("-lcompiler_rt");
7116 }
7117
7118 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
7119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
7120
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007121 CmdArgs.push_back("-o");
7122 CmdArgs.push_back(Output.getFilename());
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007123
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007124 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
7125}
7126
7127const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007128 std::string MArch;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007129 if (!Arch.empty())
7130 MArch = Arch;
7131 else
Stephen Hines651f13c2014-04-23 16:59:28 -07007132 MArch = Triple.getArchName();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007133 MArch = StringRef(MArch).split("+").first.lower();
Stephen Hines651f13c2014-04-23 16:59:28 -07007134
7135 // Handle -march=native.
7136 if (MArch == "native") {
7137 std::string CPU = llvm::sys::getHostCPUName();
7138 if (CPU != "generic") {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007139 // Translate the native cpu into the architecture suffix for that CPU.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007140 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007141 // If there is no valid architecture suffix for this CPU we don't know how
7142 // to handle it, so return no architecture.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007143 if (Suffix.empty())
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007144 MArch = "";
7145 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007146 MArch = std::string("arm") + Suffix.str();
Stephen Hines651f13c2014-04-23 16:59:28 -07007147 }
7148 }
7149
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007150 return MArch;
7151}
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007152
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007153/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007154StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
7155 std::string MArch = getARMArch(Arch, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007156 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
7157 // here means an -march=native that we can't handle, so instead return no CPU.
7158 if (MArch.empty())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007159 return StringRef();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007160
7161 // We need to return an empty string here on invalid MArch values as the
7162 // various places that call this function can't cope with a null result.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007163 return Triple.getARMCPUForArch(MArch);
Stephen Hines651f13c2014-04-23 16:59:28 -07007164}
7165
7166/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007167std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
7168 const llvm::Triple &Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007169 // FIXME: Warn on inconsistent use of -mcpu and -march.
7170 // If we have -mcpu=, use that.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007171 if (!CPU.empty()) {
7172 std::string MCPU = StringRef(CPU).split("+").first.lower();
Stephen Hines651f13c2014-04-23 16:59:28 -07007173 // Handle -mcpu=native.
7174 if (MCPU == "native")
7175 return llvm::sys::getHostCPUName();
7176 else
7177 return MCPU;
7178 }
7179
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007180 return getARMCPUForMArch(Arch, Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07007181}
7182
7183/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007184/// CPU (or Arch, if CPU is generic).
Stephen Hines651f13c2014-04-23 16:59:28 -07007185// FIXME: This is redundant with -mcpu, why does LLVM use this.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007186StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
7187 const llvm::Triple &Triple) {
7188 unsigned ArchKind;
7189 if (CPU == "generic") {
7190 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
7191 ArchKind = llvm::ARM::parseArch(ARMArch);
7192 if (ArchKind == llvm::ARM::AK_INVALID)
7193 // In case of generic Arch, i.e. "arm",
7194 // extract arch from default cpu of the Triple
7195 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
7196 } else {
7197 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
7198 // armv7k triple if it's actually been specified via "-arch armv7k".
7199 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
7200 ? (unsigned)llvm::ARM::AK_ARMV7K
7201 : llvm::ARM::parseCPUArch(CPU);
7202 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007203 if (ArchKind == llvm::ARM::AK_INVALID)
7204 return "";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007205 return llvm::ARM::getSubArch(ArchKind);
Stephen Hines651f13c2014-04-23 16:59:28 -07007206}
7207
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007208void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007209 const llvm::Triple &Triple) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007210 if (Args.hasArg(options::OPT_r))
7211 return;
7212
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007213 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
7214 // to generate BE-8 executables.
7215 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
7216 CmdArgs.push_back("--be8");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007217}
7218
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07007219mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007220 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
7221 // was first introduced in Release 3. However, other compilers have
7222 // traditionally allowed it for Release 2 so we should do the same.
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07007223 return (NanEncoding)llvm::StringSwitch<int>(CPU)
7224 .Case("mips1", NanLegacy)
7225 .Case("mips2", NanLegacy)
7226 .Case("mips3", NanLegacy)
7227 .Case("mips4", NanLegacy)
7228 .Case("mips5", NanLegacy)
7229 .Case("mips32", NanLegacy)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007230 .Case("mips32r2", NanLegacy | Nan2008)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07007231 .Case("mips32r3", NanLegacy | Nan2008)
7232 .Case("mips32r5", NanLegacy | Nan2008)
7233 .Case("mips32r6", Nan2008)
7234 .Case("mips64", NanLegacy)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007235 .Case("mips64r2", NanLegacy | Nan2008)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07007236 .Case("mips64r3", NanLegacy | Nan2008)
7237 .Case("mips64r5", NanLegacy | Nan2008)
7238 .Case("mips64r6", Nan2008)
7239 .Default(NanLegacy);
7240}
7241
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007242bool mips::hasCompactBranches(StringRef &CPU) {
7243 // mips32r6 and mips64r6 have compact branches.
7244 return llvm::StringSwitch<bool>(CPU)
7245 .Case("mips32r6", true)
7246 .Case("mips64r6", true)
7247 .Default(false);
7248}
7249
Stephen Hines651f13c2014-04-23 16:59:28 -07007250bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
7251 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
7252 return A && (A->getValue() == StringRef(Value));
7253}
7254
Stephen Hines176edba2014-12-01 14:53:08 -08007255bool mips::isUCLibc(const ArgList &Args) {
7256 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
7257 return A && A->getOption().matches(options::OPT_muclibc);
7258}
7259
Stephen Hinesef822542014-07-21 00:47:37 -07007260bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
7261 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7262 return llvm::StringSwitch<bool>(NaNArg->getValue())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007263 .Case("2008", true)
7264 .Case("legacy", false)
7265 .Default(false);
Stephen Hinesef822542014-07-21 00:47:37 -07007266
7267 // NaN2008 is the default for MIPS32r6/MIPS64r6.
7268 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007269 .Cases("mips32r6", "mips64r6", true)
7270 .Default(false);
Stephen Hinesef822542014-07-21 00:47:37 -07007271
7272 return false;
7273}
7274
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007275bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) {
7276 if (!Triple.isAndroid())
7277 return false;
7278
7279 // Android MIPS32R6 defaults to FP64A.
7280 return llvm::StringSwitch<bool>(CPUName)
7281 .Case("mips32r6", true)
7282 .Default(false);
7283}
7284
Stephen Hines176edba2014-12-01 14:53:08 -08007285bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007286 StringRef ABIName, mips::FloatABI FloatABI) {
Stephen Hines176edba2014-12-01 14:53:08 -08007287 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007288 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
7289 !Triple.isAndroid())
Stephen Hines176edba2014-12-01 14:53:08 -08007290 return false;
7291
7292 if (ABIName != "32")
7293 return false;
7294
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007295 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7296 // present.
7297 if (FloatABI == mips::FloatABI::Soft)
7298 return false;
7299
Stephen Hines176edba2014-12-01 14:53:08 -08007300 return llvm::StringSwitch<bool>(CPUName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007301 .Cases("mips2", "mips3", "mips4", "mips5", true)
7302 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7303 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7304 .Default(false);
7305}
7306
7307bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7308 StringRef CPUName, StringRef ABIName,
7309 mips::FloatABI FloatABI) {
7310 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7311
7312 // FPXX shouldn't be used if -msingle-float is present.
7313 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7314 options::OPT_mdouble_float))
7315 if (A->getOption().matches(options::OPT_msingle_float))
7316 UseFPXX = false;
7317
7318 return UseFPXX;
Stephen Hines176edba2014-12-01 14:53:08 -08007319}
7320
Stephen Hines651f13c2014-04-23 16:59:28 -07007321llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindolacfed8282012-10-31 18:51:07 +00007322 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7323 // archs which Darwin doesn't use.
7324
7325 // The matching this routine does is fairly pointless, since it is neither the
7326 // complete architecture list, nor a reasonable subset. The problem is that
7327 // historically the driver driver accepts this and also ties its -march=
7328 // handling to the architecture name, so we need to be careful before removing
7329 // support for it.
7330
7331 // This code must be kept in sync with Clang's Darwin specific argument
7332 // translation.
7333
7334 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007335 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7336 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7337 .Case("ppc64", llvm::Triple::ppc64)
7338 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7339 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7340 llvm::Triple::x86)
7341 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7342 // This is derived from the driver driver.
7343 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7344 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7345 .Cases("armv7s", "xscale", llvm::Triple::arm)
7346 .Case("arm64", llvm::Triple::aarch64)
7347 .Case("r600", llvm::Triple::r600)
7348 .Case("amdgcn", llvm::Triple::amdgcn)
7349 .Case("nvptx", llvm::Triple::nvptx)
7350 .Case("nvptx64", llvm::Triple::nvptx64)
7351 .Case("amdil", llvm::Triple::amdil)
7352 .Case("spir", llvm::Triple::spir)
7353 .Default(llvm::Triple::UnknownArch);
Rafael Espindolacfed8282012-10-31 18:51:07 +00007354}
Tony Linthicum96319392011-12-12 21:14:55 +00007355
Stephen Hines651f13c2014-04-23 16:59:28 -07007356void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007357 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Stephen Hines651f13c2014-04-23 16:59:28 -07007358 T.setArch(Arch);
7359
7360 if (Str == "x86_64h")
7361 T.setArchName(Str);
7362 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7363 T.setOS(llvm::Triple::UnknownOS);
7364 T.setObjectFormat(llvm::Triple::MachO);
7365 }
7366}
7367
Bob Wilson66b8a662012-11-23 06:14:39 +00007368const char *Clang::getBaseInputName(const ArgList &Args,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007369 const InputInfo &Input) {
7370 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00007371}
7372
Bob Wilson66b8a662012-11-23 06:14:39 +00007373const char *Clang::getBaseInputStem(const ArgList &Args,
7374 const InputInfoList &Inputs) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007375 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00007376
Chris Lattner657ca662011-01-16 08:14:11 +00007377 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00007378 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00007379
7380 return Str;
7381}
7382
Bob Wilson66b8a662012-11-23 06:14:39 +00007383const char *Clang::getDependencyFileName(const ArgList &Args,
7384 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00007385 // FIXME: Think about this more.
7386 std::string Res;
7387
7388 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00007389 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00007390 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00007391 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00007392 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00007393 }
Daniel Dunbar88137642009-09-09 22:32:48 +00007394 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00007395}
7396
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007397void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7398 const InputInfo &Output,
7399 const InputInfoList &Inputs,
7400 const ArgList &Args,
7401 const char *LinkingOutput) const {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007402 const ToolChain &ToolChain = getToolChain();
7403 const Driver &D = ToolChain.getDriver();
7404 ArgStringList CmdArgs;
7405
7406 // Silence warning for "clang -g foo.o -o foo"
7407 Args.ClaimAllArgs(options::OPT_g_Group);
7408 // and "clang -emit-llvm foo.o -o foo"
7409 Args.ClaimAllArgs(options::OPT_emit_llvm);
7410 // and for "clang -w foo.o -o foo". Other warning options are already
7411 // handled somewhere else.
7412 Args.ClaimAllArgs(options::OPT_w);
7413
7414 if (!D.SysRoot.empty())
7415 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7416
7417 // CloudABI only supports static linkage.
7418 CmdArgs.push_back("-Bstatic");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007419
7420 // CloudABI uses Position Independent Executables exclusively.
7421 CmdArgs.push_back("-pie");
7422 CmdArgs.push_back("--no-dynamic-linker");
7423 CmdArgs.push_back("-zrelro");
7424
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007425 CmdArgs.push_back("--eh-frame-hdr");
7426 CmdArgs.push_back("--gc-sections");
7427
7428 if (Output.isFilename()) {
7429 CmdArgs.push_back("-o");
7430 CmdArgs.push_back(Output.getFilename());
7431 } else {
7432 assert(Output.isNothing() && "Invalid output.");
7433 }
7434
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007435 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007436 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7437 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7438 }
7439
7440 Args.AddAllArgs(CmdArgs, options::OPT_L);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007441 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
7442 Args.AddAllArgs(CmdArgs,
7443 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7444 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007445
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007446 if (D.isUsingLTO())
7447 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007448
7449 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7450
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007451 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007452 if (D.CCCIsCXX())
7453 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7454 CmdArgs.push_back("-lc");
7455 CmdArgs.push_back("-lcompiler_rt");
7456 }
7457
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007458 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007459 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7460
7461 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007462 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007463}
7464
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007465void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7466 const InputInfo &Output,
7467 const InputInfoList &Inputs,
7468 const ArgList &Args,
7469 const char *LinkingOutput) const {
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00007470 ArgStringList CmdArgs;
7471
7472 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7473 const InputInfo &Input = Inputs[0];
7474
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00007475 // Determine the original source input.
7476 const Action *SourceAction = &JA;
7477 while (SourceAction->getKind() != Action::InputClass) {
7478 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7479 SourceAction = SourceAction->getInputs()[0];
7480 }
7481
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007482 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00007483 // sure it runs its system assembler not clang's integrated assembler.
Stephen Hines651f13c2014-04-23 16:59:28 -07007484 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7485 // FIXME: at run-time detect assembler capabilities or rely on version
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007486 // information forwarded by -target-assembler-version.
Stephen Hines651f13c2014-04-23 16:59:28 -07007487 if (Args.hasArg(options::OPT_fno_integrated_as)) {
7488 const llvm::Triple &T(getToolChain().getTriple());
7489 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
7490 CmdArgs.push_back("-Q");
7491 }
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00007492
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00007493 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00007494 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00007495 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00007496 if (Args.hasArg(options::OPT_gstabs))
7497 CmdArgs.push_back("--gstabs");
7498 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00007499 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00007500 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007501
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00007502 // Derived from asm spec.
Stephen Hines651f13c2014-04-23 16:59:28 -07007503 AddMachOArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00007504
Daniel Dunbarf5438e32010-07-22 01:47:22 +00007505 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00007506 if (getToolChain().getArch() == llvm::Triple::x86 ||
7507 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00007508 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7509 CmdArgs.push_back("-force_cpusubtype_ALL");
7510
Eli Bendersky8f4269a2013-07-24 22:20:49 +00007511 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00007512 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00007513 Args.hasArg(options::OPT_fapple_kext)) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07007514 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00007515 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007516 CmdArgs.push_back("-static");
7517
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007518 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00007519
7520 assert(Output.isFilename() && "Unexpected lipo output.");
7521 CmdArgs.push_back("-o");
7522 CmdArgs.push_back(Output.getFilename());
7523
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007524 assert(Input.isFilename() && "Invalid input.");
7525 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00007526
7527 // asm_final spec is empty.
7528
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007529 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
7530 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00007531}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007532
Stephen Hines651f13c2014-04-23 16:59:28 -07007533void darwin::MachOTool::anchor() {}
David Blaikie99ba9e32011-12-20 02:48:34 +00007534
Stephen Hines651f13c2014-04-23 16:59:28 -07007535void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7536 ArgStringList &CmdArgs) const {
7537 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00007538
Daniel Dunbar02633b52009-03-26 16:23:12 +00007539 // Derived from darwin_arch spec.
7540 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00007541 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00007542
Daniel Dunbareeff4062010-01-22 02:04:58 +00007543 // FIXME: Is this needed anymore?
7544 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00007545 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00007546}
7547
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007548bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling6acf8b42012-10-02 18:02:50 +00007549 // We only need to generate a temp path for LTO if we aren't compiling object
7550 // files. When compiling source files, we run 'dsymutil' after linking. We
7551 // don't run 'dsymutil' when compiling object files.
Stephen Hinesef822542014-07-21 00:47:37 -07007552 for (const auto &Input : Inputs)
7553 if (Input.getType() != types::TY_Object)
Bill Wendling6acf8b42012-10-02 18:02:50 +00007554 return true;
7555
7556 return false;
7557}
7558
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007559void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7560 ArgStringList &CmdArgs,
7561 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00007562 const Driver &D = getToolChain().getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07007563 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00007564
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007565 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00007566 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007567 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007568 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00007569 }
7570
Stephen Hines651f13c2014-04-23 16:59:28 -07007571 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00007572 // the user.
Stephen Hines651f13c2014-04-23 16:59:28 -07007573 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7574 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00007575
Bob Wilsonbd77c592013-08-02 22:25:34 +00007576 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7577 CmdArgs.push_back("-export_dynamic");
7578
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007579 // If we are using App Extension restrictions, pass a flag to the linker
7580 // telling it that the compiled code has been audited.
7581 if (Args.hasFlag(options::OPT_fapplication_extension,
7582 options::OPT_fno_application_extension, false))
7583 CmdArgs.push_back("-application_extension");
7584
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007585 if (D.isUsingLTO()) {
7586 // If we are using LTO, then automatically create a temporary file path for
7587 // the linker to use, so that it's lifetime will extend past a possible
7588 // dsymutil step.
7589 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7590 const char *TmpPath = C.getArgs().MakeArgString(
7591 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7592 C.addTempFile(TmpPath);
7593 CmdArgs.push_back("-object_path_lto");
7594 CmdArgs.push_back(TmpPath);
7595 }
7596
7597 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7598 // it in clang installed libraries. If not found, the option is not used
7599 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7600 if (Version[0] >= 133) {
7601 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7602 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7603 SmallString<128> LibLTOPath(P);
7604 llvm::sys::path::append(LibLTOPath, "lib");
7605 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7606 if (llvm::sys::fs::exists(LibLTOPath)) {
7607 CmdArgs.push_back("-lto_library");
7608 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7609 } else {
7610 D.Diag(diag::warn_drv_lto_libpath);
7611 }
7612 }
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00007613 }
7614
Daniel Dunbar02633b52009-03-26 16:23:12 +00007615 // Derived from the "link" spec.
7616 Args.AddAllArgs(CmdArgs, options::OPT_static);
7617 if (!Args.hasArg(options::OPT_static))
7618 CmdArgs.push_back("-dynamic");
7619 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7620 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7621 // here. How do we wish to handle such things?
7622 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007623
Daniel Dunbar02633b52009-03-26 16:23:12 +00007624 if (!Args.hasArg(options::OPT_dynamiclib)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007625 AddMachOArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00007626 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00007627 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007628
7629 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7630 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7631 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7632
7633 Arg *A;
7634 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7635 (A = Args.getLastArg(options::OPT_current__version)) ||
7636 (A = Args.getLastArg(options::OPT_install__name)))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007637 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7638 << "-dynamiclib";
Daniel Dunbar02633b52009-03-26 16:23:12 +00007639
7640 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7641 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7642 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7643 } else {
7644 CmdArgs.push_back("-dylib");
7645
7646 Arg *A;
7647 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7648 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7649 (A = Args.getLastArg(options::OPT_client__name)) ||
7650 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7651 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7652 (A = Args.getLastArg(options::OPT_private__bundle)))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007653 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7654 << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007655
Daniel Dunbar02633b52009-03-26 16:23:12 +00007656 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7657 "-dylib_compatibility_version");
7658 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7659 "-dylib_current_version");
7660
Stephen Hines651f13c2014-04-23 16:59:28 -07007661 AddMachOArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007662
7663 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7664 "-dylib_install_name");
7665 }
7666
7667 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7668 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7669 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Stephen Hines651f13c2014-04-23 16:59:28 -07007670 if (MachOTC.isTargetIOSBased())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007671 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007672 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7673 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7674 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7675 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7676 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7677 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00007678 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007679 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7680 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7681 Args.AddAllArgs(CmdArgs, options::OPT_init);
7682
Daniel Dunbarce911f52011-04-28 21:23:41 +00007683 // Add the deployment target.
Stephen Hines651f13c2014-04-23 16:59:28 -07007684 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarce911f52011-04-28 21:23:41 +00007685
Daniel Dunbar02633b52009-03-26 16:23:12 +00007686 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7687 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7688 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7689 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7690 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007691
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007692 if (const Arg *A =
7693 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7694 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbar47e879d2010-07-13 23:31:40 +00007695 if (A->getOption().matches(options::OPT_fpie) ||
7696 A->getOption().matches(options::OPT_fPIE))
7697 CmdArgs.push_back("-pie");
7698 else
7699 CmdArgs.push_back("-no_pie");
7700 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07007701 // for embed-bitcode, use -bitcode_bundle in linker command
7702 if (C.getDriver().embedBitcodeEnabled() ||
7703 C.getDriver().embedBitcodeMarkerOnly()) {
7704 // Check if the toolchain supports bitcode build flow.
7705 if (MachOTC.SupportsEmbeddedBitcode())
7706 CmdArgs.push_back("-bitcode_bundle");
7707 else
7708 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7709 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00007710
7711 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7712 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7713 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7714 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7715 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7716 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7717 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7718 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7719 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7720 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7721 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7722 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7723 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7724 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7725 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7726 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007727
Daniel Dunbarcc957192011-05-02 21:03:47 +00007728 // Give --sysroot= preference, over the Apple specific behavior to also use
7729 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00007730 StringRef sysroot = C.getSysRoot();
7731 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00007732 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00007733 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00007734 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7735 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00007736 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007737 }
7738
Daniel Dunbar02633b52009-03-26 16:23:12 +00007739 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7740 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7741 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7742 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7743 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007744 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007745 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7746 Args.AddAllArgs(CmdArgs, options::OPT_y);
7747 Args.AddLastArg(CmdArgs, options::OPT_w);
7748 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7749 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7750 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7751 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7752 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7753 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7754 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7755 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7756 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7757 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7758 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7759 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7760}
7761
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007762void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7763 const InputInfo &Output,
7764 const InputInfoList &Inputs,
7765 const ArgList &Args,
7766 const char *LinkingOutput) const {
Daniel Dunbar02633b52009-03-26 16:23:12 +00007767 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00007768
Stephen Hines176edba2014-12-01 14:53:08 -08007769 // If the number of arguments surpasses the system limits, we will encode the
7770 // input files in a separate file, shortening the command line. To this end,
7771 // build a list of input file names that can be passed via a file with the
7772 // -filelist linker option.
7773 llvm::opt::ArgStringList InputFileList;
7774
Daniel Dunbar02633b52009-03-26 16:23:12 +00007775 // The logic here is derived from gcc's behavior; most of which
7776 // comes from specs (starting with link_command). Consult gcc for
7777 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00007778 ArgStringList CmdArgs;
7779
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007780 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7781 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7782 options::OPT_ccc_arcmt_migrate)) {
Stephen Hinesef822542014-07-21 00:47:37 -07007783 for (const auto &Arg : Args)
7784 Arg->claim();
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007785 const char *Exec =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007786 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007787 CmdArgs.push_back(Output.getFilename());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007788 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007789 return;
7790 }
7791
Daniel Dunbar02633b52009-03-26 16:23:12 +00007792 // I'm not sure why this particular decomposition exists in gcc, but
7793 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00007794 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007795
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007796 // It seems that the 'e' option is completely ignored for dynamic executables
7797 // (the default), and with static executables, the last one wins, as expected.
7798 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7799 options::OPT_Z_Flag, options::OPT_u_Group,
7800 options::OPT_e, options::OPT_r});
Daniel Dunbar02633b52009-03-26 16:23:12 +00007801
Daniel Dunbar270073c2010-10-18 22:08:36 +00007802 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7803 // members of static archive libraries which implement Objective-C classes or
7804 // categories.
7805 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7806 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00007807
Daniel Dunbar02633b52009-03-26 16:23:12 +00007808 CmdArgs.push_back("-o");
7809 CmdArgs.push_back(Output.getFilename());
7810
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007811 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Stephen Hines651f13c2014-04-23 16:59:28 -07007812 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007813
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007814 // SafeStack requires its own runtime libraries
7815 // These libraries should be linked first, to make sure the
7816 // __safestack_init constructor executes before everything else
7817 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7818 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7819 "libclang_rt.safestack_osx.a",
7820 /*AlwaysLink=*/true);
7821 }
7822
Daniel Dunbar02633b52009-03-26 16:23:12 +00007823 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007824
Douglas Gregor04e326b2012-05-15 21:00:27 +00007825 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -08007826 // Build the input file for -filelist (list of linker input files) in case we
7827 // need it later
7828 for (const auto &II : Inputs) {
7829 if (!II.isFilename()) {
7830 // This is a linker input argument.
7831 // We cannot mix input arguments and file names in a -filelist input, thus
7832 // we prematurely stop our list (remaining files shall be passed as
7833 // arguments).
7834 if (InputFileList.size() > 0)
7835 break;
7836
7837 continue;
7838 }
7839
7840 InputFileList.push_back(II.getFilename());
7841 }
7842
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007843 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
7844 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7845
Bob Wilson63d9f3c2012-05-15 18:57:39 +00007846 if (isObjCRuntimeLinked(Args) &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007847 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007848 // We use arclite library for both ARC and subscripting support.
7849 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7850
Bob Wilson0b1c7152012-04-21 00:21:42 +00007851 CmdArgs.push_back("-framework");
7852 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00007853 // Link libobj.
7854 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00007855 }
John McCallf85e1932011-06-15 23:02:42 +00007856
Daniel Dunbar02633b52009-03-26 16:23:12 +00007857 if (LinkingOutput) {
7858 CmdArgs.push_back("-arch_multiple");
7859 CmdArgs.push_back("-final_output");
7860 CmdArgs.push_back(LinkingOutput);
7861 }
7862
Daniel Dunbar02633b52009-03-26 16:23:12 +00007863 if (Args.hasArg(options::OPT_fnested_functions))
7864 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007865
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007866 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7867
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007868 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007869 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00007870 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00007871
Daniel Dunbar02633b52009-03-26 16:23:12 +00007872 // link_ssp spec is empty.
7873
Daniel Dunbar6cd41542009-09-18 08:15:03 +00007874 // Let the tool chain choose which runtime library to link.
Stephen Hines651f13c2014-04-23 16:59:28 -07007875 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007876 }
7877
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007878 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00007879 // endfile_spec is empty.
7880 }
7881
7882 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7883 Args.AddAllArgs(CmdArgs, options::OPT_F);
7884
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007885 // -iframework should be forwarded as -F.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007886 for (const Arg *A : Args.filtered(options::OPT_iframework))
7887 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007888
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007889 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007890 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7891 if (A->getValue() == StringRef("Accelerate")) {
7892 CmdArgs.push_back("-framework");
7893 CmdArgs.push_back("Accelerate");
7894 }
7895 }
7896 }
7897
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007898 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08007899 std::unique_ptr<Command> Cmd =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007900 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Stephen Hines176edba2014-12-01 14:53:08 -08007901 Cmd->setInputFileList(std::move(InputFileList));
7902 C.addCommand(std::move(Cmd));
Daniel Dunbar02633b52009-03-26 16:23:12 +00007903}
7904
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007905void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007906 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007907 const InputInfoList &Inputs,
7908 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007909 const char *LinkingOutput) const {
7910 ArgStringList CmdArgs;
7911
7912 CmdArgs.push_back("-create");
7913 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00007914
7915 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007916 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00007917
Stephen Hinesef822542014-07-21 00:47:37 -07007918 for (const auto &II : Inputs) {
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007919 assert(II.isFilename() && "Unexpected lipo input.");
7920 CmdArgs.push_back(II.getFilename());
7921 }
Stephen Hinesef822542014-07-21 00:47:37 -07007922
7923 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007924 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007925}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007926
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007927void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007928 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007929 const InputInfoList &Inputs,
7930 const ArgList &Args,
7931 const char *LinkingOutput) const {
7932 ArgStringList CmdArgs;
7933
Daniel Dunbar03e92302011-05-09 17:23:16 +00007934 CmdArgs.push_back("-o");
7935 CmdArgs.push_back(Output.getFilename());
7936
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007937 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7938 const InputInfo &Input = Inputs[0];
7939 assert(Input.isFilename() && "Unexpected dsymutil input.");
7940 CmdArgs.push_back(Input.getFilename());
7941
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007942 const char *Exec =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007943 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
7944 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007945}
7946
Eric Christopherf8571862011-08-23 17:56:55 +00007947void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00007948 const InputInfo &Output,
7949 const InputInfoList &Inputs,
7950 const ArgList &Args,
7951 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00007952 ArgStringList CmdArgs;
7953 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00007954 CmdArgs.push_back("--debug-info");
7955 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00007956 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00007957
7958 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7959 const InputInfo &Input = Inputs[0];
7960 assert(Input.isFilename() && "Unexpected verify input");
7961
7962 // Grabbing the output of the earlier dsymutil run.
7963 CmdArgs.push_back(Input.getFilename());
7964
7965 const char *Exec =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007966 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
7967 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopherf8571862011-08-23 17:56:55 +00007968}
7969
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007970void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnall31c46902012-02-15 13:39:01 +00007971 const InputInfo &Output,
7972 const InputInfoList &Inputs,
7973 const ArgList &Args,
7974 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007975 claimNoWarnArgs(Args);
David Chisnall31c46902012-02-15 13:39:01 +00007976 ArgStringList CmdArgs;
7977
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007978 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnall31c46902012-02-15 13:39:01 +00007979
7980 CmdArgs.push_back("-o");
7981 CmdArgs.push_back(Output.getFilename());
7982
Stephen Hinesef822542014-07-21 00:47:37 -07007983 for (const auto &II : Inputs)
David Chisnall31c46902012-02-15 13:39:01 +00007984 CmdArgs.push_back(II.getFilename());
David Chisnall31c46902012-02-15 13:39:01 +00007985
Stephen Hinesef822542014-07-21 00:47:37 -07007986 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007987 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnall31c46902012-02-15 13:39:01 +00007988}
7989
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007990void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7991 const InputInfo &Output,
7992 const InputInfoList &Inputs,
7993 const ArgList &Args,
7994 const char *LinkingOutput) const {
David Chisnall31c46902012-02-15 13:39:01 +00007995 ArgStringList CmdArgs;
7996
David Chisnall41d476d2012-02-29 15:06:12 +00007997 // Demangle C++ names in errors
7998 CmdArgs.push_back("-C");
7999
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008000 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnall31c46902012-02-15 13:39:01 +00008001 CmdArgs.push_back("-e");
8002 CmdArgs.push_back("_start");
8003 }
8004
8005 if (Args.hasArg(options::OPT_static)) {
8006 CmdArgs.push_back("-Bstatic");
8007 CmdArgs.push_back("-dn");
8008 } else {
8009 CmdArgs.push_back("-Bdynamic");
8010 if (Args.hasArg(options::OPT_shared)) {
8011 CmdArgs.push_back("-shared");
8012 } else {
8013 CmdArgs.push_back("--dynamic-linker");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008014 CmdArgs.push_back(
8015 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnall31c46902012-02-15 13:39:01 +00008016 }
8017 }
8018
8019 if (Output.isFilename()) {
8020 CmdArgs.push_back("-o");
8021 CmdArgs.push_back(Output.getFilename());
8022 } else {
8023 assert(Output.isNothing() && "Invalid output.");
8024 }
8025
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008026 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
8027 if (!Args.hasArg(options::OPT_shared))
8028 CmdArgs.push_back(
8029 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8030
8031 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8032 CmdArgs.push_back(
8033 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
8034 CmdArgs.push_back(
8035 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnall31c46902012-02-15 13:39:01 +00008036 }
8037
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008038 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnall31c46902012-02-15 13:39:01 +00008039
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008040 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8041 options::OPT_e, options::OPT_r});
David Chisnall31c46902012-02-15 13:39:01 +00008042
8043 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8044
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008045 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00008046 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00008047 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00008048 CmdArgs.push_back("-lgcc_s");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008049 CmdArgs.push_back("-lc");
David Chisnall165329c2012-02-28 17:10:04 +00008050 if (!Args.hasArg(options::OPT_shared)) {
8051 CmdArgs.push_back("-lgcc");
David Chisnall7dbefe12012-02-28 20:06:45 +00008052 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00008053 }
David Chisnall31c46902012-02-15 13:39:01 +00008054 }
8055
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008056 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
8057 CmdArgs.push_back(
8058 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnall31c46902012-02-15 13:39:01 +00008059 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008060 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnall31c46902012-02-15 13:39:01 +00008061
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008062 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnall31c46902012-02-15 13:39:01 +00008063
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008064 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
8065 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00008066}
8067
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008068void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8069 const InputInfo &Output,
8070 const InputInfoList &Inputs,
8071 const ArgList &Args,
8072 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008073 claimNoWarnArgs(Args);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008074 ArgStringList CmdArgs;
8075
Stephen Hines651f13c2014-04-23 16:59:28 -07008076 switch (getToolChain().getArch()) {
8077 case llvm::Triple::x86:
8078 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
8079 // instruct as in the base system to assemble 32-bit code.
Bill Wendlingac66cb82013-12-08 00:21:01 +00008080 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07008081 break;
8082
8083 case llvm::Triple::ppc:
Bill Wendlingac66cb82013-12-08 00:21:01 +00008084 CmdArgs.push_back("-mppc");
8085 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07008086 break;
8087
8088 case llvm::Triple::sparc:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008089 case llvm::Triple::sparcel: {
Stephen Hines651f13c2014-04-23 16:59:28 -07008090 CmdArgs.push_back("-32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008091 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8092 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8093 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07008094 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008095 }
Stephen Hines651f13c2014-04-23 16:59:28 -07008096
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008097 case llvm::Triple::sparcv9: {
Stephen Hines651f13c2014-04-23 16:59:28 -07008098 CmdArgs.push_back("-64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008099 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8100 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8101 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07008102 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008103 }
Stephen Hines651f13c2014-04-23 16:59:28 -07008104
8105 case llvm::Triple::mips64:
8106 case llvm::Triple::mips64el: {
Bill Wendlingac66cb82013-12-08 00:21:01 +00008107 StringRef CPUName;
8108 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08008109 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Bill Wendlingac66cb82013-12-08 00:21:01 +00008110
8111 CmdArgs.push_back("-mabi");
8112 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8113
8114 if (getToolChain().getArch() == llvm::Triple::mips64)
8115 CmdArgs.push_back("-EB");
8116 else
8117 CmdArgs.push_back("-EL");
8118
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008119 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07008120 break;
Bill Wendlingac66cb82013-12-08 00:21:01 +00008121 }
8122
Stephen Hines651f13c2014-04-23 16:59:28 -07008123 default:
8124 break;
8125 }
8126
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008127 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008128
8129 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008130 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008131
Stephen Hinesef822542014-07-21 00:47:37 -07008132 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008133 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008134
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008135 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
8136 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008137}
8138
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008139void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8140 const InputInfo &Output,
8141 const InputInfoList &Inputs,
8142 const ArgList &Args,
8143 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00008144 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008145 ArgStringList CmdArgs;
8146
Rafael Espindola6cc2a682012-12-31 22:41:36 +00008147 // Silence warning for "clang -g foo.o -o foo"
8148 Args.ClaimAllArgs(options::OPT_g_Group);
8149 // and "clang -emit-llvm foo.o -o foo"
8150 Args.ClaimAllArgs(options::OPT_emit_llvm);
8151 // and for "clang -w foo.o -o foo". Other warning options are already
8152 // handled somewhere else.
8153 Args.ClaimAllArgs(options::OPT_w);
8154
Bill Wendlingac66cb82013-12-08 00:21:01 +00008155 if (getToolChain().getArch() == llvm::Triple::mips64)
8156 CmdArgs.push_back("-EB");
8157 else if (getToolChain().getArch() == llvm::Triple::mips64el)
8158 CmdArgs.push_back("-EL");
8159
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008160 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00008161 CmdArgs.push_back("-e");
8162 CmdArgs.push_back("__start");
8163 }
8164
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008165 if (Args.hasArg(options::OPT_static)) {
8166 CmdArgs.push_back("-Bstatic");
8167 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00008168 if (Args.hasArg(options::OPT_rdynamic))
8169 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008170 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00008171 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008172 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00008173 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008174 } else {
8175 CmdArgs.push_back("-dynamic-linker");
8176 CmdArgs.push_back("/usr/libexec/ld.so");
8177 }
8178 }
8179
Rafael Espindola9adba392013-06-05 04:28:55 +00008180 if (Args.hasArg(options::OPT_nopie))
8181 CmdArgs.push_back("-nopie");
8182
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008183 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008184 CmdArgs.push_back("-o");
8185 CmdArgs.push_back(Output.getFilename());
8186 } else {
8187 assert(Output.isNothing() && "Invalid output.");
8188 }
8189
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008190 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008191 if (!Args.hasArg(options::OPT_shared)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008192 if (Args.hasArg(options::OPT_pg))
8193 CmdArgs.push_back(
8194 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman62d829a2011-12-15 02:15:56 +00008195 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008196 CmdArgs.push_back(
8197 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8198 CmdArgs.push_back(
8199 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008200 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008201 CmdArgs.push_back(
8202 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008203 }
8204 }
8205
Edward O'Callaghane7e18202009-10-28 15:13:08 +00008206 std::string Triple = getToolChain().getTripleString();
8207 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00008208 Triple.replace(0, 6, "amd64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008209 CmdArgs.push_back(
8210 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00008211
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008212 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8213 options::OPT_e, options::OPT_s, options::OPT_t,
8214 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008215
Daniel Dunbar2008fee2010-09-17 00:24:54 +00008216 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008217
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008218 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00008219 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00008220 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008221 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00008222 CmdArgs.push_back("-lm_p");
8223 else
8224 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00008225 }
8226
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00008227 // FIXME: For some reason GCC passes -lgcc before adding
8228 // the default system libraries. Just mimic this for now.
8229 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008230
Eric Christopherdc6cc872012-09-13 06:32:34 +00008231 if (Args.hasArg(options::OPT_pthread)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008232 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
8233 CmdArgs.push_back("-lpthread_p");
Eric Christopherdc6cc872012-09-13 06:32:34 +00008234 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008235 CmdArgs.push_back("-lpthread");
Eric Christopherdc6cc872012-09-13 06:32:34 +00008236 }
8237
Chandler Carruth657849c2011-12-17 22:32:42 +00008238 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00008239 if (Args.hasArg(options::OPT_pg))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008240 CmdArgs.push_back("-lc_p");
Eli Friedman62d829a2011-12-15 02:15:56 +00008241 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008242 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00008243 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00008244
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00008245 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008246 }
8247
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008248 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008249 if (!Args.hasArg(options::OPT_shared))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008250 CmdArgs.push_back(
8251 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008252 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008253 CmdArgs.push_back(
8254 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008255 }
8256
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008257 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
8258 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00008259}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00008260
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008261void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8262 const InputInfo &Output,
8263 const InputInfoList &Inputs,
8264 const ArgList &Args,
8265 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008266 claimNoWarnArgs(Args);
Eli Friedman42f74f22012-08-08 23:57:20 +00008267 ArgStringList CmdArgs;
8268
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008269 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman42f74f22012-08-08 23:57:20 +00008270
8271 CmdArgs.push_back("-o");
8272 CmdArgs.push_back(Output.getFilename());
8273
Stephen Hinesef822542014-07-21 00:47:37 -07008274 for (const auto &II : Inputs)
Eli Friedman42f74f22012-08-08 23:57:20 +00008275 CmdArgs.push_back(II.getFilename());
Eli Friedman42f74f22012-08-08 23:57:20 +00008276
Stephen Hinesef822542014-07-21 00:47:37 -07008277 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman42f74f22012-08-08 23:57:20 +00008279}
8280
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008281void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8282 const InputInfo &Output,
8283 const InputInfoList &Inputs,
8284 const ArgList &Args,
8285 const char *LinkingOutput) const {
Eli Friedman42f74f22012-08-08 23:57:20 +00008286 const Driver &D = getToolChain().getDriver();
8287 ArgStringList CmdArgs;
8288
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008289 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman42f74f22012-08-08 23:57:20 +00008290 CmdArgs.push_back("-e");
8291 CmdArgs.push_back("__start");
8292 }
8293
8294 if (Args.hasArg(options::OPT_static)) {
8295 CmdArgs.push_back("-Bstatic");
8296 } else {
8297 if (Args.hasArg(options::OPT_rdynamic))
8298 CmdArgs.push_back("-export-dynamic");
8299 CmdArgs.push_back("--eh-frame-hdr");
8300 CmdArgs.push_back("-Bdynamic");
8301 if (Args.hasArg(options::OPT_shared)) {
8302 CmdArgs.push_back("-shared");
8303 } else {
8304 CmdArgs.push_back("-dynamic-linker");
8305 CmdArgs.push_back("/usr/libexec/ld.so");
8306 }
8307 }
8308
8309 if (Output.isFilename()) {
8310 CmdArgs.push_back("-o");
8311 CmdArgs.push_back(Output.getFilename());
8312 } else {
8313 assert(Output.isNothing() && "Invalid output.");
8314 }
8315
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008316 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman42f74f22012-08-08 23:57:20 +00008317 if (!Args.hasArg(options::OPT_shared)) {
8318 if (Args.hasArg(options::OPT_pg))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008319 CmdArgs.push_back(
8320 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00008321 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008322 CmdArgs.push_back(
8323 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8324 CmdArgs.push_back(
8325 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00008326 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008327 CmdArgs.push_back(
8328 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00008329 }
8330 }
8331
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008332 Args.AddAllArgs(CmdArgs,
8333 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman42f74f22012-08-08 23:57:20 +00008334
8335 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8336
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008337 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00008338 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00008339 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8340 if (Args.hasArg(options::OPT_pg))
8341 CmdArgs.push_back("-lm_p");
8342 else
8343 CmdArgs.push_back("-lm");
8344 }
8345
Rafael Espindola3667bbe2012-10-23 17:07:31 +00008346 if (Args.hasArg(options::OPT_pthread)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008347 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola3667bbe2012-10-23 17:07:31 +00008348 CmdArgs.push_back("-lpthread_p");
8349 else
8350 CmdArgs.push_back("-lpthread");
8351 }
8352
Eli Friedman42f74f22012-08-08 23:57:20 +00008353 if (!Args.hasArg(options::OPT_shared)) {
8354 if (Args.hasArg(options::OPT_pg))
8355 CmdArgs.push_back("-lc_p");
8356 else
8357 CmdArgs.push_back("-lc");
8358 }
8359
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00008360 StringRef MyArch;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008361 switch (getToolChain().getArch()) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00008362 case llvm::Triple::arm:
8363 MyArch = "arm";
8364 break;
8365 case llvm::Triple::x86:
8366 MyArch = "i386";
8367 break;
8368 case llvm::Triple::x86_64:
8369 MyArch = "amd64";
8370 break;
8371 default:
8372 llvm_unreachable("Unsupported architecture");
8373 }
8374 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00008375 }
8376
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008377 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman42f74f22012-08-08 23:57:20 +00008378 if (!Args.hasArg(options::OPT_shared))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008379 CmdArgs.push_back(
8380 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00008381 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008382 CmdArgs.push_back(
8383 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00008384 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00008385
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008386 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
8387 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman42f74f22012-08-08 23:57:20 +00008388}
8389
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008390void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8391 const InputInfo &Output,
8392 const InputInfoList &Inputs,
8393 const ArgList &Args,
8394 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008395 claimNoWarnArgs(Args);
Daniel Dunbar68a31d42009-03-31 17:45:15 +00008396 ArgStringList CmdArgs;
8397
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008398 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8399 // instruct as in the base system to assemble 32-bit code.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008400 switch (getToolChain().getArch()) {
8401 default:
8402 break;
8403 case llvm::Triple::x86:
Daniel Dunbar68a31d42009-03-31 17:45:15 +00008404 CmdArgs.push_back("--32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008405 break;
8406 case llvm::Triple::ppc:
Roman Divacky3393cef2011-06-04 07:37:31 +00008407 CmdArgs.push_back("-a32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008408 break;
8409 case llvm::Triple::mips:
8410 case llvm::Triple::mipsel:
8411 case llvm::Triple::mips64:
8412 case llvm::Triple::mips64el: {
Eric Christopherc55da4b2012-09-05 21:32:44 +00008413 StringRef CPUName;
8414 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08008415 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00008416
Eric Christopherc55da4b2012-09-05 21:32:44 +00008417 CmdArgs.push_back("-march");
8418 CmdArgs.push_back(CPUName.data());
8419
Eric Christopherc55da4b2012-09-05 21:32:44 +00008420 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00008421 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00008422
8423 if (getToolChain().getArch() == llvm::Triple::mips ||
8424 getToolChain().getArch() == llvm::Triple::mips64)
8425 CmdArgs.push_back("-EB");
8426 else
8427 CmdArgs.push_back("-EL");
8428
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008429 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8430 StringRef v = A->getValue();
8431 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8432 A->claim();
8433 }
8434
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008435 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
8436 break;
8437 }
8438 case llvm::Triple::arm:
8439 case llvm::Triple::armeb:
8440 case llvm::Triple::thumb:
8441 case llvm::Triple::thumbeb: {
8442 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07008443
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008444 if (ABI == arm::FloatABI::Hard)
Stephen Hines651f13c2014-04-23 16:59:28 -07008445 CmdArgs.push_back("-mfpu=vfp");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008446 else
Stephen Hines651f13c2014-04-23 16:59:28 -07008447 CmdArgs.push_back("-mfpu=softvfp");
Stephen Hines651f13c2014-04-23 16:59:28 -07008448
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008449 switch (getToolChain().getTriple().getEnvironment()) {
Stephen Hines651f13c2014-04-23 16:59:28 -07008450 case llvm::Triple::GNUEABIHF:
Rafael Espindola27fa2362012-12-13 04:17:14 +00008451 case llvm::Triple::GNUEABI:
8452 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00008453 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00008454 break;
8455
8456 default:
8457 CmdArgs.push_back("-matpcs");
8458 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008459 break;
8460 }
8461 case llvm::Triple::sparc:
8462 case llvm::Triple::sparcel:
8463 case llvm::Triple::sparcv9: {
8464 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8465 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8466 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
8467 break;
8468 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00008469 }
Eric Christophered734732010-03-02 02:41:08 +00008470
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008471 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar68a31d42009-03-31 17:45:15 +00008472
8473 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008474 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00008475
Stephen Hinesef822542014-07-21 00:47:37 -07008476 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008477 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00008478
Stephen Hinesef822542014-07-21 00:47:37 -07008479 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008480 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00008481}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008482
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008483void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8484 const InputInfo &Output,
8485 const InputInfoList &Inputs,
8486 const ArgList &Args,
8487 const char *LinkingOutput) const {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008488 const toolchains::FreeBSD &ToolChain =
8489 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divacky94380162012-08-28 15:09:03 +00008490 const Driver &D = ToolChain.getDriver();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008491 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Stephen Hines651f13c2014-04-23 16:59:28 -07008492 const bool IsPIE =
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008493 !Args.hasArg(options::OPT_shared) &&
8494 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008495 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00008496
8497 // Silence warning for "clang -g foo.o -o foo"
8498 Args.ClaimAllArgs(options::OPT_g_Group);
8499 // and "clang -emit-llvm foo.o -o foo"
8500 Args.ClaimAllArgs(options::OPT_emit_llvm);
8501 // and for "clang -w foo.o -o foo". Other warning options are already
8502 // handled somewhere else.
8503 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008504
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00008505 if (!D.SysRoot.empty())
8506 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8507
Stephen Hines651f13c2014-04-23 16:59:28 -07008508 if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00008509 CmdArgs.push_back("-pie");
8510
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008511 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008512 if (Args.hasArg(options::OPT_static)) {
8513 CmdArgs.push_back("-Bstatic");
8514 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00008515 if (Args.hasArg(options::OPT_rdynamic))
8516 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008517 if (Args.hasArg(options::OPT_shared)) {
8518 CmdArgs.push_back("-Bshareable");
8519 } else {
8520 CmdArgs.push_back("-dynamic-linker");
8521 CmdArgs.push_back("/libexec/ld-elf.so.1");
8522 }
Roman Divacky94380162012-08-28 15:09:03 +00008523 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnalldfa210b2012-07-29 15:24:44 +00008524 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8525 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8526 CmdArgs.push_back("--hash-style=both");
8527 }
8528 }
8529 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008530 }
8531
8532 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8533 // instruct ld in the base system to link 32-bit code.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008534 if (Arch == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008535 CmdArgs.push_back("-m");
8536 CmdArgs.push_back("elf_i386_fbsd");
8537 }
8538
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008539 if (Arch == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00008540 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00008541 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00008542 }
8543
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008544 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8545 if (ToolChain.getArch() == llvm::Triple::mips ||
8546 ToolChain.getArch() == llvm::Triple::mipsel ||
8547 ToolChain.getArch() == llvm::Triple::mips64 ||
8548 ToolChain.getArch() == llvm::Triple::mips64el) {
8549 StringRef v = A->getValue();
8550 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8551 A->claim();
8552 }
8553 }
8554
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00008555 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008556 CmdArgs.push_back("-o");
8557 CmdArgs.push_back(Output.getFilename());
8558 } else {
8559 assert(Output.isNothing() && "Invalid output.");
8560 }
8561
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008562 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008563 const char *crt1 = nullptr;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008564 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00008565 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00008566 crt1 = "gcrt1.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07008567 else if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00008568 crt1 = "Scrt1.o";
8569 else
8570 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008571 }
Roman Divacky94380162012-08-28 15:09:03 +00008572 if (crt1)
8573 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8574
8575 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8576
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008577 const char *crtbegin = nullptr;
Roman Divacky94380162012-08-28 15:09:03 +00008578 if (Args.hasArg(options::OPT_static))
8579 crtbegin = "crtbeginT.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07008580 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00008581 crtbegin = "crtbeginS.o";
8582 else
8583 crtbegin = "crtbegin.o";
8584
8585 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008586 }
8587
8588 Args.AddAllArgs(CmdArgs, options::OPT_L);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008589 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008590 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8591 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00008592 Args.AddAllArgs(CmdArgs, options::OPT_s);
8593 Args.AddAllArgs(CmdArgs, options::OPT_t);
8594 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8595 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008596
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008597 if (D.isUsingLTO())
8598 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackydb334192013-11-10 09:31:43 +00008599
Stephen Hines176edba2014-12-01 14:53:08 -08008600 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divacky94380162012-08-28 15:09:03 +00008601 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008602
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008603 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
8604 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg76b86c22013-07-18 20:29:38 +00008605 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00008606 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00008607 if (Args.hasArg(options::OPT_pg))
8608 CmdArgs.push_back("-lm_p");
8609 else
8610 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00008611 }
Stephen Hines176edba2014-12-01 14:53:08 -08008612 if (NeedsSanitizerDeps)
8613 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008614 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8615 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00008616 if (Args.hasArg(options::OPT_pg))
8617 CmdArgs.push_back("-lgcc_p");
8618 else
8619 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008620 if (Args.hasArg(options::OPT_static)) {
8621 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00008622 } else if (Args.hasArg(options::OPT_pg)) {
8623 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008624 } else {
8625 CmdArgs.push_back("--as-needed");
8626 CmdArgs.push_back("-lgcc_s");
8627 CmdArgs.push_back("--no-as-needed");
8628 }
8629
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00008630 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00008631 if (Args.hasArg(options::OPT_pg))
8632 CmdArgs.push_back("-lpthread_p");
8633 else
8634 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00008635 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008636
Roman Divackyc16bb762011-02-10 16:59:40 +00008637 if (Args.hasArg(options::OPT_pg)) {
8638 if (Args.hasArg(options::OPT_shared))
8639 CmdArgs.push_back("-lc");
8640 else
8641 CmdArgs.push_back("-lc_p");
8642 CmdArgs.push_back("-lgcc_p");
8643 } else {
8644 CmdArgs.push_back("-lc");
8645 CmdArgs.push_back("-lgcc");
8646 }
8647
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008648 if (Args.hasArg(options::OPT_static)) {
8649 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00008650 } else if (Args.hasArg(options::OPT_pg)) {
8651 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008652 } else {
8653 CmdArgs.push_back("--as-needed");
8654 CmdArgs.push_back("-lgcc_s");
8655 CmdArgs.push_back("--no-as-needed");
8656 }
8657 }
8658
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008659 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07008660 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00008661 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00008662 else
8663 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00008664 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008665 }
8666
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008667 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00008668
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008669 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
8670 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008671}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008672
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008673void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008674 const InputInfo &Output,
8675 const InputInfoList &Inputs,
8676 const ArgList &Args,
8677 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008678 claimNoWarnArgs(Args);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008679 ArgStringList CmdArgs;
8680
Stephen Hines651f13c2014-04-23 16:59:28 -07008681 // GNU as needs different flags for creating the correct output format
8682 // on architectures with different ABIs or optional feature sets.
8683 switch (getToolChain().getArch()) {
8684 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008685 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07008686 break;
8687 case llvm::Triple::arm:
8688 case llvm::Triple::armeb:
8689 case llvm::Triple::thumb:
8690 case llvm::Triple::thumbeb: {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008691 StringRef MArch, MCPU;
8692 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8693 std::string Arch =
8694 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
8695 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Stephen Hines651f13c2014-04-23 16:59:28 -07008696 break;
Bill Wendlingcf660bd2013-12-06 19:12:36 +00008697 }
8698
Stephen Hines651f13c2014-04-23 16:59:28 -07008699 case llvm::Triple::mips:
8700 case llvm::Triple::mipsel:
8701 case llvm::Triple::mips64:
8702 case llvm::Triple::mips64el: {
Bill Wendlingc54c8852013-12-09 02:59:27 +00008703 StringRef CPUName;
8704 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08008705 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Bill Wendlingc54c8852013-12-09 02:59:27 +00008706
8707 CmdArgs.push_back("-march");
8708 CmdArgs.push_back(CPUName.data());
8709
8710 CmdArgs.push_back("-mabi");
8711 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8712
8713 if (getToolChain().getArch() == llvm::Triple::mips ||
8714 getToolChain().getArch() == llvm::Triple::mips64)
8715 CmdArgs.push_back("-EB");
8716 else
8717 CmdArgs.push_back("-EL");
8718
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008719 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07008720 break;
8721 }
8722
8723 case llvm::Triple::sparc:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008724 case llvm::Triple::sparcel: {
Stephen Hines651f13c2014-04-23 16:59:28 -07008725 CmdArgs.push_back("-32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008726 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8727 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8728 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07008729 break;
Bill Wendlingc54c8852013-12-09 02:59:27 +00008730 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008731
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008732 case llvm::Triple::sparcv9: {
8733 CmdArgs.push_back("-64");
8734 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8735 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8736 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
8737 break;
8738 }
8739
8740 default:
8741 break;
8742 }
8743
8744 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008745
8746 CmdArgs.push_back("-o");
8747 CmdArgs.push_back(Output.getFilename());
8748
Stephen Hinesef822542014-07-21 00:47:37 -07008749 for (const auto &II : Inputs)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008750 CmdArgs.push_back(II.getFilename());
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008751
David Chisnall5adcec12011-09-27 22:03:18 +00008752 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008754}
8755
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008756void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8757 const InputInfo &Output,
8758 const InputInfoList &Inputs,
8759 const ArgList &Args,
8760 const char *LinkingOutput) const {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008761 const Driver &D = getToolChain().getDriver();
8762 ArgStringList CmdArgs;
8763
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00008764 if (!D.SysRoot.empty())
8765 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8766
Stephen Hines651f13c2014-04-23 16:59:28 -07008767 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008768 if (Args.hasArg(options::OPT_static)) {
8769 CmdArgs.push_back("-Bstatic");
8770 } else {
8771 if (Args.hasArg(options::OPT_rdynamic))
8772 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008773 if (Args.hasArg(options::OPT_shared)) {
8774 CmdArgs.push_back("-Bshareable");
8775 } else {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008776 Args.AddAllArgs(CmdArgs, options::OPT_pie);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008777 CmdArgs.push_back("-dynamic-linker");
8778 CmdArgs.push_back("/libexec/ld.elf_so");
8779 }
8780 }
8781
Stephen Hines651f13c2014-04-23 16:59:28 -07008782 // Many NetBSD architectures support more than one ABI.
8783 // Determine the correct emulation for ld.
8784 switch (getToolChain().getArch()) {
8785 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008786 CmdArgs.push_back("-m");
8787 CmdArgs.push_back("elf_i386");
Stephen Hines651f13c2014-04-23 16:59:28 -07008788 break;
8789 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07008790 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07008791 CmdArgs.push_back("-m");
8792 switch (getToolChain().getTriple().getEnvironment()) {
8793 case llvm::Triple::EABI:
8794 case llvm::Triple::GNUEABI:
8795 CmdArgs.push_back("armelf_nbsd_eabi");
8796 break;
8797 case llvm::Triple::EABIHF:
8798 case llvm::Triple::GNUEABIHF:
8799 CmdArgs.push_back("armelf_nbsd_eabihf");
8800 break;
8801 default:
8802 CmdArgs.push_back("armelf_nbsd");
8803 break;
8804 }
8805 break;
Stephen Hines176edba2014-12-01 14:53:08 -08008806 case llvm::Triple::armeb:
8807 case llvm::Triple::thumbeb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008808 arm::appendEBLinkFlags(
8809 Args, CmdArgs,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008810 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Stephen Hines176edba2014-12-01 14:53:08 -08008811 CmdArgs.push_back("-m");
8812 switch (getToolChain().getTriple().getEnvironment()) {
8813 case llvm::Triple::EABI:
8814 case llvm::Triple::GNUEABI:
8815 CmdArgs.push_back("armelfb_nbsd_eabi");
8816 break;
8817 case llvm::Triple::EABIHF:
8818 case llvm::Triple::GNUEABIHF:
8819 CmdArgs.push_back("armelfb_nbsd_eabihf");
8820 break;
8821 default:
8822 CmdArgs.push_back("armelfb_nbsd");
8823 break;
8824 }
8825 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07008826 case llvm::Triple::mips64:
8827 case llvm::Triple::mips64el:
8828 if (mips::hasMipsAbiArg(Args, "32")) {
8829 CmdArgs.push_back("-m");
8830 if (getToolChain().getArch() == llvm::Triple::mips64)
8831 CmdArgs.push_back("elf32btsmip");
8832 else
8833 CmdArgs.push_back("elf32ltsmip");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008834 } else if (mips::hasMipsAbiArg(Args, "64")) {
8835 CmdArgs.push_back("-m");
8836 if (getToolChain().getArch() == llvm::Triple::mips64)
8837 CmdArgs.push_back("elf64btsmip");
8838 else
8839 CmdArgs.push_back("elf64ltsmip");
8840 }
8841 break;
Stephen Hines176edba2014-12-01 14:53:08 -08008842 case llvm::Triple::ppc:
8843 CmdArgs.push_back("-m");
8844 CmdArgs.push_back("elf32ppc_nbsd");
8845 break;
8846
8847 case llvm::Triple::ppc64:
8848 case llvm::Triple::ppc64le:
8849 CmdArgs.push_back("-m");
8850 CmdArgs.push_back("elf64ppc");
8851 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07008852
8853 case llvm::Triple::sparc:
8854 CmdArgs.push_back("-m");
8855 CmdArgs.push_back("elf32_sparc");
8856 break;
8857
8858 case llvm::Triple::sparcv9:
8859 CmdArgs.push_back("-m");
8860 CmdArgs.push_back("elf64_sparc");
8861 break;
8862
8863 default:
8864 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008865 }
8866
8867 if (Output.isFilename()) {
8868 CmdArgs.push_back("-o");
8869 CmdArgs.push_back(Output.getFilename());
8870 } else {
8871 assert(Output.isNothing() && "Invalid output.");
8872 }
8873
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008874 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008875 if (!Args.hasArg(options::OPT_shared)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008876 CmdArgs.push_back(
8877 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008878 }
8879 CmdArgs.push_back(
8880 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8881 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008882 CmdArgs.push_back(
8883 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008884 } else {
8885 CmdArgs.push_back(
8886 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008887 }
8888 }
8889
8890 Args.AddAllArgs(CmdArgs, options::OPT_L);
8891 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8892 Args.AddAllArgs(CmdArgs, options::OPT_e);
8893 Args.AddAllArgs(CmdArgs, options::OPT_s);
8894 Args.AddAllArgs(CmdArgs, options::OPT_t);
8895 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8896 Args.AddAllArgs(CmdArgs, options::OPT_r);
8897
8898 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8899
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008900 unsigned Major, Minor, Micro;
8901 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8902 bool useLibgcc = true;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008903 if (Major >= 7 || Major == 0) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008904 switch (getToolChain().getArch()) {
Stephen Hines176edba2014-12-01 14:53:08 -08008905 case llvm::Triple::aarch64:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008906 case llvm::Triple::arm:
8907 case llvm::Triple::armeb:
8908 case llvm::Triple::thumb:
8909 case llvm::Triple::thumbeb:
Stephen Hines176edba2014-12-01 14:53:08 -08008910 case llvm::Triple::ppc:
8911 case llvm::Triple::ppc64:
8912 case llvm::Triple::ppc64le:
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008913 case llvm::Triple::sparc:
8914 case llvm::Triple::sparcv9:
Stephen Hines651f13c2014-04-23 16:59:28 -07008915 case llvm::Triple::x86:
8916 case llvm::Triple::x86_64:
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008917 useLibgcc = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07008918 break;
8919 default:
8920 break;
8921 }
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008922 }
8923
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008924 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
8925 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg76b86c22013-07-18 20:29:38 +00008926 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008927 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8928 CmdArgs.push_back("-lm");
8929 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008930 if (Args.hasArg(options::OPT_pthread))
8931 CmdArgs.push_back("-lpthread");
8932 CmdArgs.push_back("-lc");
8933
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008934 if (useLibgcc) {
8935 if (Args.hasArg(options::OPT_static)) {
8936 // libgcc_eh depends on libc, so resolve as much as possible,
8937 // pull in any new requirements from libc and then get the rest
8938 // of libgcc.
8939 CmdArgs.push_back("-lgcc_eh");
8940 CmdArgs.push_back("-lc");
8941 CmdArgs.push_back("-lgcc");
8942 } else {
8943 CmdArgs.push_back("-lgcc");
8944 CmdArgs.push_back("--as-needed");
8945 CmdArgs.push_back("-lgcc_s");
8946 CmdArgs.push_back("--no-as-needed");
8947 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008948 }
8949 }
8950
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008951 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008952 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008953 CmdArgs.push_back(
8954 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07008955 else
8956 CmdArgs.push_back(
8957 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008958 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008959 }
8960
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008961 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00008962
Stephen Hinesef822542014-07-21 00:47:37 -07008963 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008964 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008965}
8966
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008967void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8968 const InputInfo &Output,
8969 const InputInfoList &Inputs,
8970 const ArgList &Args,
8971 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008972 claimNoWarnArgs(Args);
8973
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008974 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8975 llvm::Triple Triple = llvm::Triple(TripleStr);
8976
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008977 ArgStringList CmdArgs;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008978
8979 llvm::Reloc::Model RelocationModel;
8980 unsigned PICLevel;
8981 bool IsPIE;
8982 std::tie(RelocationModel, PICLevel, IsPIE) =
8983 ParsePICArgs(getToolChain(), Triple, Args);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008984
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008985 switch (getToolChain().getArch()) {
8986 default:
8987 break;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008988 // Add --32/--64 to make sure we get the format we want.
8989 // This is incomplete
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008990 case llvm::Triple::x86:
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008991 CmdArgs.push_back("--32");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008992 break;
8993 case llvm::Triple::x86_64:
Stephen Hinesef822542014-07-21 00:47:37 -07008994 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8995 CmdArgs.push_back("--x32");
8996 else
8997 CmdArgs.push_back("--64");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008998 break;
8999 case llvm::Triple::ppc:
Eli Friedman7972c882011-11-28 23:46:52 +00009000 CmdArgs.push_back("-a32");
9001 CmdArgs.push_back("-mppc");
9002 CmdArgs.push_back("-many");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009003 break;
9004 case llvm::Triple::ppc64:
Eli Friedman7972c882011-11-28 23:46:52 +00009005 CmdArgs.push_back("-a64");
9006 CmdArgs.push_back("-mppc64");
9007 CmdArgs.push_back("-many");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009008 break;
9009 case llvm::Triple::ppc64le:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00009010 CmdArgs.push_back("-a64");
Stephen Hines651f13c2014-04-23 16:59:28 -07009011 CmdArgs.push_back("-mppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00009012 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07009013 CmdArgs.push_back("-mlittle-endian");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009014 break;
9015 case llvm::Triple::sparc:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009016 case llvm::Triple::sparcel: {
Stephen Hines651f13c2014-04-23 16:59:28 -07009017 CmdArgs.push_back("-32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009018 std::string CPU = getCPUName(Args, getToolChain().getTriple());
9019 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
9020 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009021 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009022 }
9023 case llvm::Triple::sparcv9: {
Stephen Hines651f13c2014-04-23 16:59:28 -07009024 CmdArgs.push_back("-64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009025 std::string CPU = getCPUName(Args, getToolChain().getTriple());
9026 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
9027 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009028 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009029 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009030 case llvm::Triple::arm:
9031 case llvm::Triple::armeb:
9032 case llvm::Triple::thumb:
9033 case llvm::Triple::thumbeb: {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009034 const llvm::Triple &Triple2 = getToolChain().getTriple();
9035 switch (Triple2.getSubArch()) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009036 case llvm::Triple::ARMSubArch_v7:
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00009037 CmdArgs.push_back("-mfpu=neon");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009038 break;
9039 case llvm::Triple::ARMSubArch_v8:
Bernard Ogden80e90c22013-10-24 18:32:41 +00009040 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009041 break;
9042 default:
9043 break;
9044 }
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00009045
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009046 switch (arm::getARMFloatABI(getToolChain(), Args)) {
9047 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
9048 case arm::FloatABI::Soft:
9049 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
9050 break;
9051 case arm::FloatABI::SoftFP:
9052 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
9053 break;
9054 case arm::FloatABI::Hard:
9055 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
9056 break;
9057 }
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00009058
9059 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Stephen Hines651f13c2014-04-23 16:59:28 -07009060
9061 // FIXME: remove krait check when GNU tools support krait cpu
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009062 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Stephen Hines651f13c2014-04-23 16:59:28 -07009063 // march from being picked in the absence of a cpu flag.
9064 Arg *A;
9065 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009066 StringRef(A->getValue()).lower() == "krait")
9067 CmdArgs.push_back("-mcpu=cortex-a15");
Stephen Hines651f13c2014-04-23 16:59:28 -07009068 else
9069 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00009070 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009071 break;
9072 }
9073 case llvm::Triple::mips:
9074 case llvm::Triple::mipsel:
9075 case llvm::Triple::mips64:
9076 case llvm::Triple::mips64el: {
Simon Atanasyan073a7802012-04-07 22:31:29 +00009077 StringRef CPUName;
9078 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08009079 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
9080 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00009081
Simon Atanasyan073a7802012-04-07 22:31:29 +00009082 CmdArgs.push_back("-march");
9083 CmdArgs.push_back(CPUName.data());
9084
Simon Atanasyan073a7802012-04-07 22:31:29 +00009085 CmdArgs.push_back("-mabi");
Stephen Hines176edba2014-12-01 14:53:08 -08009086 CmdArgs.push_back(ABIName.data());
9087
9088 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
9089 // or -mshared (not implemented) is in effect.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009090 if (RelocationModel == llvm::Reloc::Static)
Stephen Hines176edba2014-12-01 14:53:08 -08009091 CmdArgs.push_back("-mno-shared");
9092
9093 // LLVM doesn't support -mplt yet and acts as if it is always given.
9094 // However, -mplt has no effect with the N64 ABI.
9095 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00009096
9097 if (getToolChain().getArch() == llvm::Triple::mips ||
9098 getToolChain().getArch() == llvm::Triple::mips64)
9099 CmdArgs.push_back("-EB");
9100 else
9101 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00009102
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00009103 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
9104 if (StringRef(A->getValue()) == "2008")
9105 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
9106 }
9107
Stephen Hines176edba2014-12-01 14:53:08 -08009108 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
9109 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
9110 options::OPT_mfp64)) {
9111 A->claim();
9112 A->render(Args, CmdArgs);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009113 } else if (mips::shouldUseFPXX(
9114 Args, getToolChain().getTriple(), CPUName, ABIName,
9115 getMipsFloatABI(getToolChain().getDriver(), Args)))
Stephen Hines176edba2014-12-01 14:53:08 -08009116 CmdArgs.push_back("-mfpxx");
9117
9118 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
9119 // -mno-mips16 is actually -no-mips16.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009120 if (Arg *A =
9121 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Stephen Hines176edba2014-12-01 14:53:08 -08009122 if (A->getOption().matches(options::OPT_mips16)) {
9123 A->claim();
9124 A->render(Args, CmdArgs);
9125 } else {
9126 A->claim();
9127 CmdArgs.push_back("-no-mips16");
9128 }
9129 }
9130
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00009131 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
9132 options::OPT_mno_micromips);
9133 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
9134 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
9135
Daniel Sanders0d5d6ff2013-12-02 10:14:43 +00009136 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
9137 // Do not use AddLastArg because not all versions of MIPS assembler
9138 // support -mmsa / -mno-msa options.
9139 if (A->getOption().matches(options::OPT_mmsa))
9140 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
9141 }
9142
Stephen Hines176edba2014-12-01 14:53:08 -08009143 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
9144 options::OPT_msoft_float);
9145
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009146 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
9147 options::OPT_msingle_float);
9148
Stephen Hines176edba2014-12-01 14:53:08 -08009149 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
9150 options::OPT_mno_odd_spreg);
9151
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009152 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009153 break;
9154 }
9155 case llvm::Triple::systemz: {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00009156 // Always pass an -march option, since our default of z10 is later
9157 // than the GNU assembler's default.
9158 StringRef CPUName = getSystemZTargetCPU(Args);
9159 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009160 break;
9161 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00009162 }
9163
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009164 Args.AddAllArgs(CmdArgs, options::OPT_I);
9165 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00009166
9167 CmdArgs.push_back("-o");
9168 CmdArgs.push_back(Output.getFilename());
9169
Stephen Hinesef822542014-07-21 00:47:37 -07009170 for (const auto &II : Inputs)
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00009171 CmdArgs.push_back(II.getFilename());
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00009172
Stephen Hinesef822542014-07-21 00:47:37 -07009173 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009174 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00009175
9176 // Handle the debug info splitting at object creation time if we're
9177 // creating an object.
9178 // TODO: Currently only works on linux with newer objcopy.
9179 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00009180 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00009181 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009182 SplitDebugName(Args, Inputs[0]));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00009183}
9184
Stephen Hines651f13c2014-04-23 16:59:28 -07009185static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00009186 ArgStringList &CmdArgs, const ArgList &Args) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009187 bool isAndroid = Triple.isAndroid();
9188 bool isCygMing = Triple.isOSCygMing();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009189 bool IsIAMCU = Triple.isOSIAMCU();
Chandler Carruth68f94db2013-03-04 02:07:55 +00009190 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
9191 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00009192 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00009193 CmdArgs.push_back("-lgcc");
9194
Logan Chien529a73d2012-11-19 12:04:11 +00009195 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00009196 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00009197 CmdArgs.push_back("-lgcc");
9198 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009199 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00009200 CmdArgs.push_back("--as-needed");
9201 CmdArgs.push_back("-lgcc_s");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009202 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00009203 CmdArgs.push_back("--no-as-needed");
9204 }
9205
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009206 if (StaticLibgcc && !isAndroid && !IsIAMCU)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00009207 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00009208 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00009209 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00009210
9211 // According to Android ABI, we have to link with libdl if we are
9212 // linking with non-static libgcc.
9213 //
9214 // NOTE: This fixes a link error on Android MIPS as well. The non-static
9215 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
9216 if (isAndroid && !StaticLibgcc)
9217 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00009218}
9219
Stephen Hines651f13c2014-04-23 16:59:28 -07009220static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009221 ArgStringList &CmdArgs, const ArgList &Args) {
Stephen Hines651f13c2014-04-23 16:59:28 -07009222 // Make use of compiler-rt if --rtlib option is used
9223 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9224
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009225 switch (RLT) {
Stephen Hines651f13c2014-04-23 16:59:28 -07009226 case ToolChain::RLT_CompilerRT:
Stephen Hines176edba2014-12-01 14:53:08 -08009227 switch (TC.getTriple().getOS()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009228 default:
9229 llvm_unreachable("unsupported OS");
Stephen Hines176edba2014-12-01 14:53:08 -08009230 case llvm::Triple::Win32:
Stephen Hines176edba2014-12-01 14:53:08 -08009231 case llvm::Triple::Linux:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009232 addClangRT(TC, Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -08009233 break;
9234 }
Stephen Hines651f13c2014-04-23 16:59:28 -07009235 break;
9236 case ToolChain::RLT_Libgcc:
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009237 // Make sure libgcc is not used under MSVC environment by default
9238 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9239 // Issue error diagnostic if libgcc is explicitly specified
9240 // through command line as --rtlib option argument.
9241 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9242 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9243 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9244 }
9245 } else
9246 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07009247 break;
9248 }
9249}
9250
Stephen Hines176edba2014-12-01 14:53:08 -08009251static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9252 switch (T.getArch()) {
9253 case llvm::Triple::x86:
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009254 if (T.isOSIAMCU())
9255 return "elf_iamcu";
Stephen Hines176edba2014-12-01 14:53:08 -08009256 return "elf_i386";
9257 case llvm::Triple::aarch64:
9258 return "aarch64linux";
9259 case llvm::Triple::aarch64_be:
9260 return "aarch64_be_linux";
9261 case llvm::Triple::arm:
9262 case llvm::Triple::thumb:
9263 return "armelf_linux_eabi";
9264 case llvm::Triple::armeb:
9265 case llvm::Triple::thumbeb:
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009266 return "armelfb_linux_eabi";
Stephen Hines176edba2014-12-01 14:53:08 -08009267 case llvm::Triple::ppc:
9268 return "elf32ppclinux";
9269 case llvm::Triple::ppc64:
9270 return "elf64ppc";
9271 case llvm::Triple::ppc64le:
9272 return "elf64lppc";
9273 case llvm::Triple::sparc:
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009274 case llvm::Triple::sparcel:
Stephen Hines176edba2014-12-01 14:53:08 -08009275 return "elf32_sparc";
9276 case llvm::Triple::sparcv9:
9277 return "elf64_sparc";
9278 case llvm::Triple::mips:
9279 return "elf32btsmip";
9280 case llvm::Triple::mipsel:
9281 return "elf32ltsmip";
9282 case llvm::Triple::mips64:
9283 if (mips::hasMipsAbiArg(Args, "n32"))
9284 return "elf32btsmipn32";
9285 return "elf64btsmip";
9286 case llvm::Triple::mips64el:
9287 if (mips::hasMipsAbiArg(Args, "n32"))
9288 return "elf32ltsmipn32";
9289 return "elf64ltsmip";
9290 case llvm::Triple::systemz:
9291 return "elf64_s390";
9292 case llvm::Triple::x86_64:
9293 if (T.getEnvironment() == llvm::Triple::GNUX32)
9294 return "elf32_x86_64";
9295 return "elf_x86_64";
9296 default:
9297 llvm_unreachable("Unexpected arch");
9298 }
9299}
9300
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009301void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9302 const InputInfo &Output,
9303 const InputInfoList &Inputs,
9304 const ArgList &Args,
9305 const char *LinkingOutput) const {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009306 const toolchains::Linux &ToolChain =
9307 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac1da9812010-11-07 20:14:31 +00009308 const Driver &D = ToolChain.getDriver();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009309
9310 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9311 llvm::Triple Triple = llvm::Triple(TripleStr);
9312
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009313 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009314 const bool isAndroid = ToolChain.getTriple().isAndroid();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009315 const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00009316 const bool IsPIE =
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009317 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9318 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009319 const bool HasCRTBeginEndFiles =
9320 ToolChain.getTriple().hasEnvironment() ||
9321 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00009322
Rafael Espindolac1da9812010-11-07 20:14:31 +00009323 ArgStringList CmdArgs;
9324
Rafael Espindola26f14c32010-11-15 18:28:16 +00009325 // Silence warning for "clang -g foo.o -o foo"
9326 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00009327 // and "clang -emit-llvm foo.o -o foo"
9328 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00009329 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00009330 // handled somewhere else.
9331 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00009332
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009333 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9334 if (llvm::sys::path::filename(Exec) == "lld") {
9335 CmdArgs.push_back("-flavor");
9336 CmdArgs.push_back("old-gnu");
9337 CmdArgs.push_back("-target");
9338 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9339 }
9340
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00009341 if (!D.SysRoot.empty())
9342 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00009343
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00009344 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00009345 CmdArgs.push_back("-pie");
9346
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00009347 if (Args.hasArg(options::OPT_rdynamic))
9348 CmdArgs.push_back("-export-dynamic");
9349
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00009350 if (Args.hasArg(options::OPT_s))
9351 CmdArgs.push_back("-s");
9352
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009353 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009354 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009355
Stephen Hinesef822542014-07-21 00:47:37 -07009356 for (const auto &Opt : ToolChain.ExtraOpts)
9357 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac1da9812010-11-07 20:14:31 +00009358
9359 if (!Args.hasArg(options::OPT_static)) {
9360 CmdArgs.push_back("--eh-frame-hdr");
9361 }
9362
9363 CmdArgs.push_back("-m");
Stephen Hines176edba2014-12-01 14:53:08 -08009364 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac1da9812010-11-07 20:14:31 +00009365
9366 if (Args.hasArg(options::OPT_static)) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009367 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9368 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00009369 CmdArgs.push_back("-Bstatic");
9370 else
9371 CmdArgs.push_back("-static");
9372 } else if (Args.hasArg(options::OPT_shared)) {
9373 CmdArgs.push_back("-shared");
9374 }
9375
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009376 if (!Args.hasArg(options::OPT_static)) {
9377 if (Args.hasArg(options::OPT_rdynamic))
9378 CmdArgs.push_back("-export-dynamic");
9379
9380 if (!Args.hasArg(options::OPT_shared)) {
9381 const std::string Loader =
9382 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
9383 CmdArgs.push_back("-dynamic-linker");
9384 CmdArgs.push_back(Args.MakeArgString(Loader));
9385 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00009386 }
9387
9388 CmdArgs.push_back("-o");
9389 CmdArgs.push_back(Output.getFilename());
9390
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009391 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009392 if (!isAndroid && !IsIAMCU) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07009393 const char *crt1 = nullptr;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009394 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher61f08682013-06-07 23:25:01 +00009395 if (Args.hasArg(options::OPT_pg))
9396 crt1 = "gcrt1.o";
9397 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00009398 crt1 = "Scrt1.o";
9399 else
9400 crt1 = "crt1.o";
9401 }
9402 if (crt1)
9403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00009404
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00009405 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9406 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00009407
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009408 if (IsIAMCU)
9409 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
9410 else {
9411 const char *crtbegin;
9412 if (Args.hasArg(options::OPT_static))
9413 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
9414 else if (Args.hasArg(options::OPT_shared))
9415 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
9416 else if (IsPIE)
9417 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
9418 else
9419 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009420
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009421 if (HasCRTBeginEndFiles)
9422 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9423 }
Benjamin Kramere20e5082012-10-04 19:42:20 +00009424
9425 // Add crtfastmath.o if available and fast math is enabled.
9426 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00009427 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00009428
9429 Args.AddAllArgs(CmdArgs, options::OPT_L);
Stephen Hinesef822542014-07-21 00:47:37 -07009430 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac1da9812010-11-07 20:14:31 +00009431
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009432 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac1da9812010-11-07 20:14:31 +00009433
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009434 if (D.isUsingLTO())
9435 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth700d4e42013-01-13 11:46:33 +00009436
Nick Lewyckye276cfc2012-08-17 03:39:16 +00009437 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9438 CmdArgs.push_back("--no-demangle");
9439
Stephen Hines176edba2014-12-01 14:53:08 -08009440 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009441 bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
Rafael Espindolac1da9812010-11-07 20:14:31 +00009442 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00009443 // The profile runtime also needs access to system libraries.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009444 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00009445
Hans Wennborg76b86c22013-07-18 20:29:38 +00009446 if (D.CCCIsCXX() &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009447 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00009448 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009449 !Args.hasArg(options::OPT_static);
Rafael Espindola19706f82011-10-17 22:14:51 +00009450 if (OnlyLibstdcxxStatic)
9451 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00009452 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00009453 if (OnlyLibstdcxxStatic)
9454 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00009455 CmdArgs.push_back("-lm");
9456 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009457 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9458 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac1da9812010-11-07 20:14:31 +00009459
Rafael Espindola89414b32010-11-12 03:00:39 +00009460 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00009461 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9462 if (Args.hasArg(options::OPT_static))
9463 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00009464
Stephen Hines176edba2014-12-01 14:53:08 -08009465 if (NeedsSanitizerDeps)
9466 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9467
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009468 if (NeedsXRayDeps)
9469 linkXRayRuntimeDeps(ToolChain, Args, CmdArgs);
9470
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009471 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9472 Args.hasArg(options::OPT_pthreads);
Chandler Carruthdf96e022013-01-17 13:19:29 +00009473
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009474 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9475 options::OPT_fno_openmp, false)) {
9476 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9477 // FIXME: Does this really make sense for all GNU toolchains?
9478 WantPthread = true;
9479
9480 // Also link the particular OpenMP runtimes.
9481 switch (getOpenMPRuntime(ToolChain, Args)) {
9482 case OMPRT_OMP:
9483 CmdArgs.push_back("-lomp");
9484 break;
9485 case OMPRT_GOMP:
9486 CmdArgs.push_back("-lgomp");
9487
9488 // FIXME: Exclude this for platforms with libgomp that don't require
9489 // librt. Most modern Linux platforms require it, but some may not.
9490 CmdArgs.push_back("-lrt");
9491 break;
9492 case OMPRT_IOMP5:
9493 CmdArgs.push_back("-liomp5");
9494 break;
9495 case OMPRT_Unknown:
9496 // Already diagnosed.
9497 break;
9498 }
Chandler Carruthdf96e022013-01-17 13:19:29 +00009499 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009500
Stephen Hines651f13c2014-04-23 16:59:28 -07009501 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00009502
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009503 if (WantPthread && !isAndroid)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00009504 CmdArgs.push_back("-lpthread");
9505
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009506 if (Args.hasArg(options::OPT_fsplit_stack))
9507 CmdArgs.push_back("--wrap=pthread_create");
9508
Chandler Carruth2ba542c2012-05-14 18:31:18 +00009509 CmdArgs.push_back("-lc");
9510
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009511 // Add IAMCU specific libs, if needed.
9512 if (IsIAMCU)
9513 CmdArgs.push_back("-lgloss");
9514
Chandler Carruth2ba542c2012-05-14 18:31:18 +00009515 if (Args.hasArg(options::OPT_static))
9516 CmdArgs.push_back("--end-group");
9517 else
Stephen Hines651f13c2014-04-23 16:59:28 -07009518 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009519
9520 // Add IAMCU specific libs (outside the group), if needed.
9521 if (IsIAMCU) {
9522 CmdArgs.push_back("--as-needed");
9523 CmdArgs.push_back("-lsoftfp");
9524 CmdArgs.push_back("--no-as-needed");
9525 }
Chandler Carruth2ba542c2012-05-14 18:31:18 +00009526 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00009527
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009528 if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
Rafael Espindola49c64fd2010-12-01 01:52:43 +00009529 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00009530 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00009531 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00009532 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00009533 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00009534 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00009535 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00009536
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009537 if (HasCRTBeginEndFiles)
9538 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00009539 if (!isAndroid)
9540 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00009541 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00009542 }
9543
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009544 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Rafael Espindolac1da9812010-11-07 20:14:31 +00009545}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00009546
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009547// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9548// for the various SFI requirements like register masking. The assembly tool
9549// inserts the file containing the macros as an input into all the assembly
9550// jobs.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009551void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9552 const InputInfo &Output,
9553 const InputInfoList &Inputs,
9554 const ArgList &Args,
9555 const char *LinkingOutput) const {
9556 const toolchains::NaClToolChain &ToolChain =
9557 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009558 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009559 "nacl-arm-macros.s");
9560 InputInfoList NewInputs;
9561 NewInputs.push_back(NaClMacros);
9562 NewInputs.append(Inputs.begin(), Inputs.end());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009563 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9564 LinkingOutput);
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009565}
9566
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009567// This is quite similar to gnutools::Linker::ConstructJob with changes that
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009568// we use static by default, do not yet support sanitizers or LTO, and a few
9569// others. Eventually we can support more of that and hopefully migrate back
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009570// to gnutools::Linker.
9571void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9572 const InputInfo &Output,
9573 const InputInfoList &Inputs,
9574 const ArgList &Args,
9575 const char *LinkingOutput) const {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009576
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009577 const toolchains::NaClToolChain &ToolChain =
9578 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009579 const Driver &D = ToolChain.getDriver();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009580 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009581 const bool IsStatic =
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009582 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009583
9584 ArgStringList CmdArgs;
9585
9586 // Silence warning for "clang -g foo.o -o foo"
9587 Args.ClaimAllArgs(options::OPT_g_Group);
9588 // and "clang -emit-llvm foo.o -o foo"
9589 Args.ClaimAllArgs(options::OPT_emit_llvm);
9590 // and for "clang -w foo.o -o foo". Other warning options are already
9591 // handled somewhere else.
9592 Args.ClaimAllArgs(options::OPT_w);
9593
9594 if (!D.SysRoot.empty())
9595 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9596
9597 if (Args.hasArg(options::OPT_rdynamic))
9598 CmdArgs.push_back("-export-dynamic");
9599
9600 if (Args.hasArg(options::OPT_s))
9601 CmdArgs.push_back("-s");
9602
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009603 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9604 // from there is --build-id, which we do want.
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009605 CmdArgs.push_back("--build-id");
9606
9607 if (!IsStatic)
9608 CmdArgs.push_back("--eh-frame-hdr");
9609
9610 CmdArgs.push_back("-m");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009611 if (Arch == llvm::Triple::x86)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009612 CmdArgs.push_back("elf_i386_nacl");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009613 else if (Arch == llvm::Triple::arm)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009614 CmdArgs.push_back("armelf_nacl");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009615 else if (Arch == llvm::Triple::x86_64)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009616 CmdArgs.push_back("elf_x86_64_nacl");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009617 else if (Arch == llvm::Triple::mipsel)
9618 CmdArgs.push_back("mipselelf_nacl");
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009619 else
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07009620 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9621 << "Native Client";
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009622
9623 if (IsStatic)
9624 CmdArgs.push_back("-static");
9625 else if (Args.hasArg(options::OPT_shared))
9626 CmdArgs.push_back("-shared");
9627
9628 CmdArgs.push_back("-o");
9629 CmdArgs.push_back(Output.getFilename());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009630 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009631 if (!Args.hasArg(options::OPT_shared))
9632 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9633 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9634
9635 const char *crtbegin;
9636 if (IsStatic)
9637 crtbegin = "crtbeginT.o";
9638 else if (Args.hasArg(options::OPT_shared))
9639 crtbegin = "crtbeginS.o";
9640 else
9641 crtbegin = "crtbegin.o";
9642 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9643 }
9644
9645 Args.AddAllArgs(CmdArgs, options::OPT_L);
9646 Args.AddAllArgs(CmdArgs, options::OPT_u);
9647
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009648 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009649
9650 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9651 CmdArgs.push_back("--no-demangle");
9652
9653 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9654
9655 if (D.CCCIsCXX() &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009656 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
9657 bool OnlyLibstdcxxStatic =
9658 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009659 if (OnlyLibstdcxxStatic)
9660 CmdArgs.push_back("-Bstatic");
9661 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9662 if (OnlyLibstdcxxStatic)
9663 CmdArgs.push_back("-Bdynamic");
9664 CmdArgs.push_back("-lm");
9665 }
9666
9667 if (!Args.hasArg(options::OPT_nostdlib)) {
9668 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9669 // Always use groups, since it has no effect on dynamic libraries.
9670 CmdArgs.push_back("--start-group");
9671 CmdArgs.push_back("-lc");
9672 // NaCl's libc++ currently requires libpthread, so just always include it
9673 // in the group for C++.
9674 if (Args.hasArg(options::OPT_pthread) ||
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009675 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
9676 // Gold, used by Mips, handles nested groups differently than ld, and
9677 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9678 // which is not a desired behaviour here.
9679 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9680 if (getToolChain().getArch() == llvm::Triple::mipsel)
9681 CmdArgs.push_back("-lnacl");
9682
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009683 CmdArgs.push_back("-lpthread");
9684 }
9685
9686 CmdArgs.push_back("-lgcc");
9687 CmdArgs.push_back("--as-needed");
9688 if (IsStatic)
9689 CmdArgs.push_back("-lgcc_eh");
9690 else
9691 CmdArgs.push_back("-lgcc_s");
9692 CmdArgs.push_back("--no-as-needed");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009693
9694 // Mips needs to create and use pnacl_legacy library that contains
9695 // definitions from bitcode/pnaclmm.c and definitions for
9696 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9697 if (getToolChain().getArch() == llvm::Triple::mipsel)
9698 CmdArgs.push_back("-lpnacl_legacy");
9699
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009700 CmdArgs.push_back("--end-group");
9701 }
9702
9703 if (!Args.hasArg(options::OPT_nostartfiles)) {
9704 const char *crtend;
9705 if (Args.hasArg(options::OPT_shared))
9706 crtend = "crtendS.o";
9707 else
9708 crtend = "crtend.o";
9709
9710 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9711 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9712 }
9713 }
9714
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009715 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9716 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009717}
9718
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009719void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9720 const InputInfo &Output,
9721 const InputInfoList &Inputs,
9722 const ArgList &Args,
9723 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009724 claimNoWarnArgs(Args);
Chris Lattner38e317d2010-07-07 16:01:42 +00009725 ArgStringList CmdArgs;
9726
Stephen Hinesef822542014-07-21 00:47:37 -07009727 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner38e317d2010-07-07 16:01:42 +00009728
9729 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009730 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00009731
Stephen Hinesef822542014-07-21 00:47:37 -07009732 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009733 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00009734
Stephen Hinesef822542014-07-21 00:47:37 -07009735 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009736 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner38e317d2010-07-07 16:01:42 +00009737}
9738
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009739void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9740 const InputInfo &Output,
9741 const InputInfoList &Inputs,
9742 const ArgList &Args,
9743 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00009744 const Driver &D = getToolChain().getDriver();
9745 ArgStringList CmdArgs;
9746
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009747 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00009748 CmdArgs.push_back("-o");
9749 CmdArgs.push_back(Output.getFilename());
9750 } else {
9751 assert(Output.isNothing() && "Invalid output.");
9752 }
9753
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009754 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
9755 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9756 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9757 CmdArgs.push_back(
9758 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9759 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman6d402dc2011-12-08 23:54:21 +00009760 }
Chris Lattner38e317d2010-07-07 16:01:42 +00009761
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009762 Args.AddAllArgs(CmdArgs,
9763 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner38e317d2010-07-07 16:01:42 +00009764
Daniel Dunbar2008fee2010-09-17 00:24:54 +00009765 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00009766
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009767 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman6d402dc2011-12-08 23:54:21 +00009768
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009769 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00009770 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00009771 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00009772 CmdArgs.push_back("-lm");
9773 }
Chris Lattner38e317d2010-07-07 16:01:42 +00009774 }
9775
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009776 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00009777 if (Args.hasArg(options::OPT_pthread))
9778 CmdArgs.push_back("-lpthread");
9779 CmdArgs.push_back("-lc");
9780 CmdArgs.push_back("-lCompilerRT-Generic");
9781 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9782 CmdArgs.push_back(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009783 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00009784 }
9785
Stephen Hinesef822542014-07-21 00:47:37 -07009786 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009787 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner38e317d2010-07-07 16:01:42 +00009788}
9789
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009790/// DragonFly Tools
9791
9792// For now, DragonFly Assemble does just about the same as for
9793// FreeBSD, but this may change soon.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009794void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9795 const InputInfo &Output,
9796 const InputInfoList &Inputs,
9797 const ArgList &Args,
9798 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009799 claimNoWarnArgs(Args);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009800 ArgStringList CmdArgs;
9801
9802 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9803 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00009804 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009805 CmdArgs.push_back("--32");
9806
Stephen Hinesef822542014-07-21 00:47:37 -07009807 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009808
9809 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009810 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009811
Stephen Hinesef822542014-07-21 00:47:37 -07009812 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009813 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009814
Stephen Hinesef822542014-07-21 00:47:37 -07009815 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009816 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009817}
9818
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009819void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9820 const InputInfo &Output,
9821 const InputInfoList &Inputs,
9822 const ArgList &Args,
9823 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00009824 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009825 ArgStringList CmdArgs;
John McCall8cfb7202013-04-11 22:55:55 +00009826
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00009827 if (!D.SysRoot.empty())
9828 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9829
John McCall8cfb7202013-04-11 22:55:55 +00009830 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009831 if (Args.hasArg(options::OPT_static)) {
9832 CmdArgs.push_back("-Bstatic");
9833 } else {
John McCall8cfb7202013-04-11 22:55:55 +00009834 if (Args.hasArg(options::OPT_rdynamic))
9835 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009836 if (Args.hasArg(options::OPT_shared))
9837 CmdArgs.push_back("-Bshareable");
9838 else {
9839 CmdArgs.push_back("-dynamic-linker");
9840 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9841 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009842 CmdArgs.push_back("--hash-style=gnu");
9843 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009844 }
9845
9846 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9847 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00009848 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009849 CmdArgs.push_back("-m");
9850 CmdArgs.push_back("elf_i386");
9851 }
9852
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009853 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009854 CmdArgs.push_back("-o");
9855 CmdArgs.push_back(Output.getFilename());
9856 } else {
9857 assert(Output.isNothing() && "Invalid output.");
9858 }
9859
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009860 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009861 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00009862 if (Args.hasArg(options::OPT_pg))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009863 CmdArgs.push_back(
9864 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009865 else {
9866 if (Args.hasArg(options::OPT_pie))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009867 CmdArgs.push_back(
9868 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009869 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009870 CmdArgs.push_back(
9871 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009872 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009873 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009874 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009875 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009876 CmdArgs.push_back(
9877 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009878 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009879 CmdArgs.push_back(
9880 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009881 }
9882
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009883 Args.AddAllArgs(CmdArgs,
9884 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009885
Daniel Dunbar2008fee2010-09-17 00:24:54 +00009886 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009887
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009888 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009889 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009890
9891 if (!Args.hasArg(options::OPT_static)) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009892 CmdArgs.push_back("-rpath");
9893 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009894 }
9895
Hans Wennborg76b86c22013-07-18 20:29:38 +00009896 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00009897 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00009898 CmdArgs.push_back("-lm");
9899 }
9900
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009901 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00009902 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009903
9904 if (!Args.hasArg(options::OPT_nolibc)) {
9905 CmdArgs.push_back("-lc");
9906 }
9907
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009908 if (Args.hasArg(options::OPT_static) ||
9909 Args.hasArg(options::OPT_static_libgcc)) {
John McCall8cfb7202013-04-11 22:55:55 +00009910 CmdArgs.push_back("-lgcc");
9911 CmdArgs.push_back("-lgcc_eh");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009912 } else {
9913 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall8cfb7202013-04-11 22:55:55 +00009914 CmdArgs.push_back("-lgcc_pic");
9915 if (!Args.hasArg(options::OPT_shared))
9916 CmdArgs.push_back("-lgcc");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -07009917 } else {
John McCall8cfb7202013-04-11 22:55:55 +00009918 CmdArgs.push_back("-lgcc");
9919 CmdArgs.push_back("--as-needed");
9920 CmdArgs.push_back("-lgcc_pic");
9921 CmdArgs.push_back("--no-as-needed");
John McCall8cfb7202013-04-11 22:55:55 +00009922 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009923 }
9924 }
9925
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009926 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00009927 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009928 CmdArgs.push_back(
9929 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009930 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009931 CmdArgs.push_back(
9932 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9933 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009934 }
9935
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009936 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00009937
Stephen Hinesef822542014-07-21 00:47:37 -07009938 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009939 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009940}
Michael J. Spencerff58e362010-08-21 21:55:07 +00009941
Stephen Hines176edba2014-12-01 14:53:08 -08009942// Try to find Exe from a Visual Studio distribution. This first tries to find
9943// an installed copy of Visual Studio and, failing that, looks in the PATH,
9944// making sure that whatever executable that's found is not a same-named exe
9945// from clang itself to prevent clang from falling back to itself.
9946static std::string FindVisualStudioExecutable(const ToolChain &TC,
9947 const char *Exe,
9948 const char *ClangProgramPath) {
9949 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9950 std::string visualStudioBinDir;
9951 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9952 visualStudioBinDir)) {
9953 SmallString<128> FilePath(visualStudioBinDir);
9954 llvm::sys::path::append(FilePath, Exe);
9955 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9956 return FilePath.str();
9957 }
9958
9959 return Exe;
9960}
9961
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009962void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9963 const InputInfo &Output,
9964 const InputInfoList &Inputs,
9965 const ArgList &Args,
9966 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00009967 ArgStringList CmdArgs;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009968 const ToolChain &TC = getToolChain();
Michael J. Spencerff58e362010-08-21 21:55:07 +00009969
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009970 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9971 if (Output.isFilename())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009972 CmdArgs.push_back(
9973 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00009974
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009975 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9976 !C.getDriver().IsCLMode())
Michael J. Spencerff58e362010-08-21 21:55:07 +00009977 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerff58e362010-08-21 21:55:07 +00009978
Stephen Hines176edba2014-12-01 14:53:08 -08009979 if (!llvm::sys::Process::GetEnv("LIB")) {
9980 // If the VC environment hasn't been configured (perhaps because the user
9981 // did not run vcvarsall), try to build a consistent link environment. If
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009982 // the environment variable is set however, assume the user knows what
9983 // they're doing.
Stephen Hines176edba2014-12-01 14:53:08 -08009984 std::string VisualStudioDir;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009985 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Stephen Hines176edba2014-12-01 14:53:08 -08009986 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9987 SmallString<128> LibDir(VisualStudioDir);
9988 llvm::sys::path::append(LibDir, "VC", "lib");
9989 switch (MSVC.getArch()) {
9990 case llvm::Triple::x86:
9991 // x86 just puts the libraries directly in lib
9992 break;
9993 case llvm::Triple::x86_64:
9994 llvm::sys::path::append(LibDir, "amd64");
9995 break;
9996 case llvm::Triple::arm:
9997 llvm::sys::path::append(LibDir, "arm");
9998 break;
9999 default:
10000 break;
10001 }
10002 CmdArgs.push_back(
10003 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010004
10005 if (MSVC.useUniversalCRT(VisualStudioDir)) {
10006 std::string UniversalCRTLibPath;
10007 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
10008 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
10009 UniversalCRTLibPath.c_str()));
10010 }
Stephen Hines176edba2014-12-01 14:53:08 -080010011 }
10012
10013 std::string WindowsSdkLibPath;
10014 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
10015 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
10016 WindowsSdkLibPath.c_str()));
10017 }
10018
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010019 if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
10020 for (const auto &LibPath : Args.getAllArgValues(options::OPT_L))
10021 CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
10022
Michael J. Spencerff58e362010-08-21 21:55:07 +000010023 CmdArgs.push_back("-nologo");
10024
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010025 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7,
10026 options::OPT__SLASH_Zd))
Stephen Hines6bcf27b2014-05-29 04:14:42 -070010027 CmdArgs.push_back("-debug");
Stephen Hines6bcf27b2014-05-29 04:14:42 -070010028
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010029 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070010030 options::OPT_shared);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +000010031 if (DLL) {
10032 CmdArgs.push_back(Args.MakeArgString("-dll"));
10033
10034 SmallString<128> ImplibName(Output.getFilename());
10035 llvm::sys::path::replace_extension(ImplibName, "lib");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010036 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborg6d0a8d52013-09-10 20:18:04 +000010037 }
10038
Stephen Hines0e2c34f2015-03-23 12:09:02 -070010039 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +000010040 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +000010041 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Stephen Hines176edba2014-12-01 14:53:08 -080010042 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010043 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10044 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Stephen Hines176edba2014-12-01 14:53:08 -080010045 // Make sure the dynamic runtime thunk is not optimized out at link time
10046 // to ensure proper SEH handling.
10047 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
10048 } else if (DLL) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010049 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Stephen Hines6bcf27b2014-05-29 04:14:42 -070010050 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010051 for (const auto &Lib : {"asan", "asan_cxx"})
10052 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Stephen Hines6bcf27b2014-05-29 04:14:42 -070010053 }
Hans Wennborg3c4da0c2013-08-27 18:10:21 +000010054 }
10055
Hans Wennborg5db95272013-08-13 23:38:57 +000010056 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +000010057
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010058 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
10059 options::OPT_fno_openmp, false)) {
10060 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
10061 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
10062 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
10063 TC.getDriver().Dir + "/../lib"));
10064 switch (getOpenMPRuntime(getToolChain(), Args)) {
10065 case OMPRT_OMP:
10066 CmdArgs.push_back("-defaultlib:libomp.lib");
10067 break;
10068 case OMPRT_IOMP5:
10069 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
10070 break;
10071 case OMPRT_GOMP:
10072 break;
10073 case OMPRT_Unknown:
10074 // Already diagnosed.
10075 break;
10076 }
10077 }
10078
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010079 // Add compiler-rt lib in case if it was explicitly
10080 // specified as an argument for --rtlib option.
10081 if (!Args.hasArg(options::OPT_nostdlib)) {
10082 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
10083 }
10084
Stephen Hines176edba2014-12-01 14:53:08 -080010085 // Add filenames, libraries, and other linker inputs.
10086 for (const auto &Input : Inputs) {
10087 if (Input.isFilename()) {
Stephen Hinesef822542014-07-21 00:47:37 -070010088 CmdArgs.push_back(Input.getFilename());
Stephen Hines176edba2014-12-01 14:53:08 -080010089 continue;
10090 }
Michael J. Spencerff58e362010-08-21 21:55:07 +000010091
Stephen Hines176edba2014-12-01 14:53:08 -080010092 const Arg &A = Input.getInputArg();
10093
10094 // Render -l options differently for the MSVC linker.
10095 if (A.getOption().matches(options::OPT_l)) {
10096 StringRef Lib = A.getValue();
10097 const char *LinkLibArg;
10098 if (Lib.endswith(".lib"))
10099 LinkLibArg = Args.MakeArgString(Lib);
10100 else
10101 LinkLibArg = Args.MakeArgString(Lib + ".lib");
10102 CmdArgs.push_back(LinkLibArg);
10103 continue;
10104 }
10105
10106 // Otherwise, this is some other kind of linker input option like -Wl, -z,
10107 // or -L. Render it, even if MSVC doesn't understand it.
10108 A.renderAsInput(Args, CmdArgs);
10109 }
10110
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010111 TC.addProfileRTLibs(Args, CmdArgs);
10112
Stephen Hines0e2c34f2015-03-23 12:09:02 -070010113 // We need to special case some linker paths. In the case of lld, we need to
10114 // translate 'lld' into 'lld-link', and in the case of the regular msvc
10115 // linker, we need to use a special search algorithm.
10116 llvm::SmallString<128> linkPath;
10117 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
10118 if (Linker.equals_lower("lld"))
10119 Linker = "lld-link";
10120
10121 if (Linker.equals_lower("link")) {
10122 // If we're using the MSVC linker, it's not sufficient to just use link
10123 // from the program PATH, because other environments like GnuWin32 install
10124 // their own link.exe which may come first.
10125 linkPath = FindVisualStudioExecutable(TC, "link.exe",
10126 C.getDriver().getClangProgramPath());
10127 } else {
10128 linkPath = Linker;
10129 llvm::sys::path::replace_extension(linkPath, "exe");
10130 linkPath = TC.GetProgramPath(linkPath.c_str());
10131 }
10132
Stephen Hines176edba2014-12-01 14:53:08 -080010133 const char *Exec = Args.MakeArgString(linkPath);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010134 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerff58e362010-08-21 21:55:07 +000010135}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010136
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010137void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10138 const InputInfo &Output,
10139 const InputInfoList &Inputs,
10140 const ArgList &Args,
10141 const char *LinkingOutput) const {
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010142 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
10143}
10144
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010145std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
Stephen Hines176edba2014-12-01 14:53:08 -080010146 Compilation &C, const JobAction &JA, const InputInfo &Output,
10147 const InputInfoList &Inputs, const ArgList &Args,
10148 const char *LinkingOutput) const {
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010149 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +000010150 CmdArgs.push_back("/nologo");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010151 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010152 CmdArgs.push_back("/W0"); // No warnings.
10153
10154 // The goal is to be able to invoke this tool correctly based on
10155 // any flag accepted by clang-cl.
10156
10157 // These are spelled the same way in clang and cl.exe,.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010158 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborga8ffc162013-09-24 18:17:21 +000010159
10160 // Optimization level.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010161 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
10162 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
10163 : "/Oi-");
Hans Wennborga8ffc162013-09-24 18:17:21 +000010164 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
10165 if (A->getOption().getID() == options::OPT_O0) {
10166 CmdArgs.push_back("/Od");
10167 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010168 CmdArgs.push_back("/Og");
10169
Hans Wennborga8ffc162013-09-24 18:17:21 +000010170 StringRef OptLevel = A->getValue();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010171 if (OptLevel == "s" || OptLevel == "z")
10172 CmdArgs.push_back("/Os");
10173 else
10174 CmdArgs.push_back("/Ot");
10175
10176 CmdArgs.push_back("/Ob2");
Hans Wennborga8ffc162013-09-24 18:17:21 +000010177 }
10178 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010179 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
10180 options::OPT_fno_omit_frame_pointer))
10181 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
10182 ? "/Oy"
10183 : "/Oy-");
10184 if (!Args.hasArg(options::OPT_fwritable_strings))
10185 CmdArgs.push_back("/GF");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010186
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070010187 // Flags for which clang-cl has an alias.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010188 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
10189
Stephen Hinesef822542014-07-21 00:47:37 -070010190 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
10191 /*default=*/false))
10192 CmdArgs.push_back("/GR-");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010193
10194 if (Args.hasFlag(options::OPT__SLASH_GS_, options::OPT__SLASH_GS,
10195 /*default=*/false))
10196 CmdArgs.push_back("/GS-");
10197
Stephen Hines651f13c2014-04-23 16:59:28 -070010198 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
10199 options::OPT_fno_function_sections))
10200 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
10201 ? "/Gy"
10202 : "/Gy-");
Stephen Hines6bcf27b2014-05-29 04:14:42 -070010203 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
10204 options::OPT_fno_data_sections))
10205 CmdArgs.push_back(
10206 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010207 if (Args.hasArg(options::OPT_fsyntax_only))
10208 CmdArgs.push_back("/Zs");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010209 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
10210 options::OPT__SLASH_Z7))
Stephen Hines651f13c2014-04-23 16:59:28 -070010211 CmdArgs.push_back("/Z7");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010212
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070010213 std::vector<std::string> Includes =
10214 Args.getAllArgValues(options::OPT_include);
Stephen Hinesef822542014-07-21 00:47:37 -070010215 for (const auto &Include : Includes)
10216 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg4fe475a2013-09-27 17:54:18 +000010217
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010218 // Flags that can simply be passed through.
10219 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
10220 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010221 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
10222 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Stephen Hinesef822542014-07-21 00:47:37 -070010223 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010224 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010225
10226 // The order of these flags is relevant, so pick the last one.
10227 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
10228 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
10229 A->render(Args, CmdArgs);
10230
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010231 // Pass through all unknown arguments so that the fallback command can see
10232 // them too.
10233 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10234
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010235 // Input filename.
10236 assert(Inputs.size() == 1);
10237 const InputInfo &II = Inputs[0];
10238 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10239 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10240 if (II.isFilename())
10241 CmdArgs.push_back(II.getFilename());
10242 else
10243 II.getInputArg().renderAsInput(Args, CmdArgs);
10244
10245 // Output filename.
10246 assert(Output.getType() == types::TY_Object);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010247 const char *Fo =
10248 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010249 CmdArgs.push_back(Fo);
10250
Hans Wennborgdc40bf92013-09-20 18:16:35 +000010251 const Driver &D = getToolChain().getDriver();
Stephen Hines176edba2014-12-01 14:53:08 -080010252 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10253 D.getClangProgramPath());
10254 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010255 CmdArgs, Inputs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +000010256}
Robert Lytton4e490e22013-10-11 10:29:40 +000010257
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010258/// MinGW Tools
10259void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10260 const InputInfo &Output,
10261 const InputInfoList &Inputs,
10262 const ArgList &Args,
10263 const char *LinkingOutput) const {
10264 claimNoWarnArgs(Args);
10265 ArgStringList CmdArgs;
10266
10267 if (getToolChain().getArch() == llvm::Triple::x86) {
10268 CmdArgs.push_back("--32");
10269 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10270 CmdArgs.push_back("--64");
10271 }
10272
10273 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10274
10275 CmdArgs.push_back("-o");
10276 CmdArgs.push_back(Output.getFilename());
10277
10278 for (const auto &II : Inputs)
10279 CmdArgs.push_back(II.getFilename());
10280
10281 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
10282 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10283
10284 if (Args.hasArg(options::OPT_gsplit_dwarf))
10285 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10286 SplitDebugName(Args, Inputs[0]));
10287}
10288
10289void MinGW::Linker::AddLibGCC(const ArgList &Args,
10290 ArgStringList &CmdArgs) const {
10291 if (Args.hasArg(options::OPT_mthreads))
10292 CmdArgs.push_back("-lmingwthrd");
10293 CmdArgs.push_back("-lmingw32");
10294
10295 // Make use of compiler-rt if --rtlib option is used
10296 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10297 if (RLT == ToolChain::RLT_Libgcc) {
10298 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10299 Args.hasArg(options::OPT_static);
10300 bool Shared = Args.hasArg(options::OPT_shared);
10301 bool CXX = getToolChain().getDriver().CCCIsCXX();
10302
10303 if (Static || (!CXX && !Shared)) {
10304 CmdArgs.push_back("-lgcc");
10305 CmdArgs.push_back("-lgcc_eh");
10306 } else {
10307 CmdArgs.push_back("-lgcc_s");
10308 CmdArgs.push_back("-lgcc");
10309 }
10310 } else {
10311 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10312 }
10313
10314 CmdArgs.push_back("-lmoldname");
10315 CmdArgs.push_back("-lmingwex");
10316 CmdArgs.push_back("-lmsvcrt");
10317}
10318
10319void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10320 const InputInfo &Output,
10321 const InputInfoList &Inputs,
10322 const ArgList &Args,
10323 const char *LinkingOutput) const {
10324 const ToolChain &TC = getToolChain();
10325 const Driver &D = TC.getDriver();
10326 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10327
10328 ArgStringList CmdArgs;
10329
10330 // Silence warning for "clang -g foo.o -o foo"
10331 Args.ClaimAllArgs(options::OPT_g_Group);
10332 // and "clang -emit-llvm foo.o -o foo"
10333 Args.ClaimAllArgs(options::OPT_emit_llvm);
10334 // and for "clang -w foo.o -o foo". Other warning options are already
10335 // handled somewhere else.
10336 Args.ClaimAllArgs(options::OPT_w);
10337
10338 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10339 if (LinkerName.equals_lower("lld")) {
10340 CmdArgs.push_back("-flavor");
10341 CmdArgs.push_back("gnu");
10342 } else if (!LinkerName.equals_lower("ld")) {
10343 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
10344 }
10345
10346 if (!D.SysRoot.empty())
10347 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10348
10349 if (Args.hasArg(options::OPT_s))
10350 CmdArgs.push_back("-s");
10351
10352 CmdArgs.push_back("-m");
10353 if (TC.getArch() == llvm::Triple::x86)
10354 CmdArgs.push_back("i386pe");
10355 if (TC.getArch() == llvm::Triple::x86_64)
10356 CmdArgs.push_back("i386pep");
10357 if (TC.getArch() == llvm::Triple::arm)
10358 CmdArgs.push_back("thumb2pe");
10359
10360 if (Args.hasArg(options::OPT_mwindows)) {
10361 CmdArgs.push_back("--subsystem");
10362 CmdArgs.push_back("windows");
10363 } else if (Args.hasArg(options::OPT_mconsole)) {
10364 CmdArgs.push_back("--subsystem");
10365 CmdArgs.push_back("console");
10366 }
10367
10368 if (Args.hasArg(options::OPT_static))
10369 CmdArgs.push_back("-Bstatic");
10370 else {
10371 if (Args.hasArg(options::OPT_mdll))
10372 CmdArgs.push_back("--dll");
10373 else if (Args.hasArg(options::OPT_shared))
10374 CmdArgs.push_back("--shared");
10375 CmdArgs.push_back("-Bdynamic");
10376 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10377 CmdArgs.push_back("-e");
10378 if (TC.getArch() == llvm::Triple::x86)
10379 CmdArgs.push_back("_DllMainCRTStartup@12");
10380 else
10381 CmdArgs.push_back("DllMainCRTStartup");
10382 CmdArgs.push_back("--enable-auto-image-base");
10383 }
10384 }
10385
10386 CmdArgs.push_back("-o");
10387 CmdArgs.push_back(Output.getFilename());
10388
10389 Args.AddAllArgs(CmdArgs, options::OPT_e);
10390 // FIXME: add -N, -n flags
10391 Args.AddLastArg(CmdArgs, options::OPT_r);
10392 Args.AddLastArg(CmdArgs, options::OPT_s);
10393 Args.AddLastArg(CmdArgs, options::OPT_t);
10394 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10395 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10396
10397 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
10398 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10399 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10400 } else {
10401 if (Args.hasArg(options::OPT_municode))
10402 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10403 else
10404 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10405 }
10406 if (Args.hasArg(options::OPT_pg))
10407 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10408 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10409 }
10410
10411 Args.AddAllArgs(CmdArgs, options::OPT_L);
10412 TC.AddFilePathLibArgs(Args, CmdArgs);
10413 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10414
10415 // TODO: Add ASan stuff here
10416
10417 // TODO: Add profile stuff here
10418
10419 if (D.CCCIsCXX() &&
10420 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
10421 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10422 !Args.hasArg(options::OPT_static);
10423 if (OnlyLibstdcxxStatic)
10424 CmdArgs.push_back("-Bstatic");
10425 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10426 if (OnlyLibstdcxxStatic)
10427 CmdArgs.push_back("-Bdynamic");
10428 }
10429
10430 if (!Args.hasArg(options::OPT_nostdlib)) {
10431 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10432 if (Args.hasArg(options::OPT_static))
10433 CmdArgs.push_back("--start-group");
10434
10435 if (Args.hasArg(options::OPT_fstack_protector) ||
10436 Args.hasArg(options::OPT_fstack_protector_strong) ||
10437 Args.hasArg(options::OPT_fstack_protector_all)) {
10438 CmdArgs.push_back("-lssp_nonshared");
10439 CmdArgs.push_back("-lssp");
10440 }
10441 if (Args.hasArg(options::OPT_fopenmp))
10442 CmdArgs.push_back("-lgomp");
10443
10444 AddLibGCC(Args, CmdArgs);
10445
10446 if (Args.hasArg(options::OPT_pg))
10447 CmdArgs.push_back("-lgmon");
10448
10449 if (Args.hasArg(options::OPT_pthread))
10450 CmdArgs.push_back("-lpthread");
10451
10452 // add system libraries
10453 if (Args.hasArg(options::OPT_mwindows)) {
10454 CmdArgs.push_back("-lgdi32");
10455 CmdArgs.push_back("-lcomdlg32");
10456 }
10457 CmdArgs.push_back("-ladvapi32");
10458 CmdArgs.push_back("-lshell32");
10459 CmdArgs.push_back("-luser32");
10460 CmdArgs.push_back("-lkernel32");
10461
10462 if (Args.hasArg(options::OPT_static))
10463 CmdArgs.push_back("--end-group");
10464 else if (!LinkerName.equals_lower("lld"))
10465 AddLibGCC(Args, CmdArgs);
10466 }
10467
10468 if (!Args.hasArg(options::OPT_nostartfiles)) {
10469 // Add crtfastmath.o if available and fast math is enabled.
10470 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10471
10472 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10473 }
10474 }
10475 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
10476 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10477}
Robert Lytton4e490e22013-10-11 10:29:40 +000010478
10479/// XCore Tools
10480// We pass assemble and link construction to the xcc tool.
10481
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010482void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10483 const InputInfo &Output,
10484 const InputInfoList &Inputs,
10485 const ArgList &Args,
10486 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -070010487 claimNoWarnArgs(Args);
Robert Lytton4e490e22013-10-11 10:29:40 +000010488 ArgStringList CmdArgs;
10489
10490 CmdArgs.push_back("-o");
10491 CmdArgs.push_back(Output.getFilename());
10492
10493 CmdArgs.push_back("-c");
10494
Stephen Hines651f13c2014-04-23 16:59:28 -070010495 if (Args.hasArg(options::OPT_v))
10496 CmdArgs.push_back("-v");
10497
Stephen Hines6bcf27b2014-05-29 04:14:42 -070010498 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10499 if (!A->getOption().matches(options::OPT_g0))
10500 CmdArgs.push_back("-g");
Stephen Hines651f13c2014-04-23 16:59:28 -070010501
10502 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10503 false))
10504 CmdArgs.push_back("-fverbose-asm");
Robert Lytton4e490e22013-10-11 10:29:40 +000010505
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010506 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lytton4e490e22013-10-11 10:29:40 +000010507
Stephen Hinesef822542014-07-21 00:47:37 -070010508 for (const auto &II : Inputs)
Robert Lytton4e490e22013-10-11 10:29:40 +000010509 CmdArgs.push_back(II.getFilename());
Robert Lytton4e490e22013-10-11 10:29:40 +000010510
Stephen Hinesef822542014-07-21 00:47:37 -070010511 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010512 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lytton4e490e22013-10-11 10:29:40 +000010513}
10514
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010515void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10516 const InputInfo &Output,
10517 const InputInfoList &Inputs,
10518 const ArgList &Args,
10519 const char *LinkingOutput) const {
Robert Lytton4e490e22013-10-11 10:29:40 +000010520 ArgStringList CmdArgs;
10521
10522 if (Output.isFilename()) {
10523 CmdArgs.push_back("-o");
10524 CmdArgs.push_back(Output.getFilename());
10525 } else {
10526 assert(Output.isNothing() && "Invalid output.");
10527 }
10528
Stephen Hines651f13c2014-04-23 16:59:28 -070010529 if (Args.hasArg(options::OPT_v))
10530 CmdArgs.push_back("-v");
10531
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010532 // Pass -fexceptions through to the linker if it was present.
10533 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10534 false))
Stephen Hines651f13c2014-04-23 16:59:28 -070010535 CmdArgs.push_back("-fexceptions");
10536
Robert Lytton4e490e22013-10-11 10:29:40 +000010537 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10538
Stephen Hinesef822542014-07-21 00:47:37 -070010539 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010540 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lytton4e490e22013-10-11 10:29:40 +000010541}
Stephen Hines176edba2014-12-01 14:53:08 -080010542
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010543void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10544 const InputInfo &Output,
10545 const InputInfoList &Inputs,
10546 const ArgList &Args,
10547 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -070010548 claimNoWarnArgs(Args);
Stephen Hines176edba2014-12-01 14:53:08 -080010549 const auto &TC =
10550 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10551 ArgStringList CmdArgs;
10552 const char *Exec;
10553
10554 switch (TC.getArch()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010555 default:
10556 llvm_unreachable("unsupported architecture");
Stephen Hines176edba2014-12-01 14:53:08 -080010557 case llvm::Triple::arm:
10558 case llvm::Triple::thumb:
10559 break;
10560 case llvm::Triple::x86:
10561 CmdArgs.push_back("--32");
10562 break;
10563 case llvm::Triple::x86_64:
10564 CmdArgs.push_back("--64");
10565 break;
10566 }
10567
10568 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10569
10570 CmdArgs.push_back("-o");
10571 CmdArgs.push_back(Output.getFilename());
10572
10573 for (const auto &Input : Inputs)
10574 CmdArgs.push_back(Input.getFilename());
10575
10576 const std::string Assembler = TC.GetProgramPath("as");
10577 Exec = Args.MakeArgString(Assembler);
10578
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010579 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Stephen Hines176edba2014-12-01 14:53:08 -080010580}
10581
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010582void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10583 const InputInfo &Output,
10584 const InputInfoList &Inputs,
10585 const ArgList &Args,
10586 const char *LinkingOutput) const {
Stephen Hines176edba2014-12-01 14:53:08 -080010587 const auto &TC =
10588 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10589 const llvm::Triple &T = TC.getTriple();
10590 const Driver &D = TC.getDriver();
10591 SmallString<128> EntryPoint;
10592 ArgStringList CmdArgs;
10593 const char *Exec;
10594
10595 // Silence warning for "clang -g foo.o -o foo"
10596 Args.ClaimAllArgs(options::OPT_g_Group);
10597 // and "clang -emit-llvm foo.o -o foo"
10598 Args.ClaimAllArgs(options::OPT_emit_llvm);
10599 // and for "clang -w foo.o -o foo"
10600 Args.ClaimAllArgs(options::OPT_w);
10601 // Other warning options are already handled somewhere else.
10602
10603 if (!D.SysRoot.empty())
10604 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10605
10606 if (Args.hasArg(options::OPT_pie))
10607 CmdArgs.push_back("-pie");
10608 if (Args.hasArg(options::OPT_rdynamic))
10609 CmdArgs.push_back("-export-dynamic");
10610 if (Args.hasArg(options::OPT_s))
10611 CmdArgs.push_back("--strip-all");
10612
10613 CmdArgs.push_back("-m");
10614 switch (TC.getArch()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010615 default:
10616 llvm_unreachable("unsupported architecture");
Stephen Hines176edba2014-12-01 14:53:08 -080010617 case llvm::Triple::arm:
10618 case llvm::Triple::thumb:
10619 // FIXME: this is incorrect for WinCE
10620 CmdArgs.push_back("thumb2pe");
10621 break;
10622 case llvm::Triple::x86:
10623 CmdArgs.push_back("i386pe");
10624 EntryPoint.append("_");
10625 break;
10626 case llvm::Triple::x86_64:
10627 CmdArgs.push_back("i386pep");
10628 break;
10629 }
10630
10631 if (Args.hasArg(options::OPT_shared)) {
10632 switch (T.getArch()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010633 default:
10634 llvm_unreachable("unsupported architecture");
Stephen Hines176edba2014-12-01 14:53:08 -080010635 case llvm::Triple::arm:
10636 case llvm::Triple::thumb:
10637 case llvm::Triple::x86_64:
10638 EntryPoint.append("_DllMainCRTStartup");
10639 break;
10640 case llvm::Triple::x86:
10641 EntryPoint.append("_DllMainCRTStartup@12");
10642 break;
10643 }
10644
10645 CmdArgs.push_back("-shared");
10646 CmdArgs.push_back("-Bdynamic");
10647
10648 CmdArgs.push_back("--enable-auto-image-base");
10649
10650 CmdArgs.push_back("--entry");
10651 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10652 } else {
10653 EntryPoint.append("mainCRTStartup");
10654
10655 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10656 : "-Bdynamic");
10657
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010658 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines176edba2014-12-01 14:53:08 -080010659 CmdArgs.push_back("--entry");
10660 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10661 }
10662
10663 // FIXME: handle subsystem
10664 }
10665
10666 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
10667 CmdArgs.push_back("--allow-multiple-definition");
10668
10669 CmdArgs.push_back("-o");
10670 CmdArgs.push_back(Output.getFilename());
10671
10672 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10673 SmallString<261> ImpLib(Output.getFilename());
10674 llvm::sys::path::replace_extension(ImpLib, ".lib");
10675
10676 CmdArgs.push_back("--out-implib");
10677 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10678 }
10679
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010680 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines176edba2014-12-01 14:53:08 -080010681 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10682 const char *CRTBegin;
10683
10684 CRTBegin =
10685 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10686 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10687 }
10688
10689 Args.AddAllArgs(CmdArgs, options::OPT_L);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010690 TC.AddFilePathLibArgs(Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -080010691 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10692
10693 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10694 !Args.hasArg(options::OPT_nodefaultlibs)) {
10695 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10696 !Args.hasArg(options::OPT_static);
10697 if (StaticCXX)
10698 CmdArgs.push_back("-Bstatic");
10699 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10700 if (StaticCXX)
10701 CmdArgs.push_back("-Bdynamic");
10702 }
10703
10704 if (!Args.hasArg(options::OPT_nostdlib)) {
10705 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10706 // TODO handle /MT[d] /MD[d]
10707 CmdArgs.push_back("-lmsvcrt");
10708 AddRunTimeLibs(TC, D, CmdArgs, Args);
10709 }
10710 }
10711
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010712 if (TC.getSanitizerArgs().needsAsanRt()) {
10713 // TODO handle /MT[d] /MD[d]
10714 if (Args.hasArg(options::OPT_shared)) {
10715 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10716 } else {
10717 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10718 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010719 // Make sure the dynamic runtime thunk is not optimized out at link time
10720 // to ensure proper SEH handling.
10721 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10722 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10723 ? "___asan_seh_interceptor"
10724 : "__asan_seh_interceptor"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010725 }
10726 }
Stephen Hines176edba2014-12-01 14:53:08 -080010727
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010728 Exec = Args.MakeArgString(TC.GetLinkerPath());
10729
10730 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10731}
10732
10733void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10734 const InputInfo &Output,
10735 const InputInfoList &Inputs,
10736 const ArgList &Args,
10737 const char *LinkingOutput) const {
10738 ArgStringList CmdArgs;
10739 assert(Inputs.size() == 1);
10740 const InputInfo &II = Inputs[0];
10741 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10742 II.getType() == types::TY_PP_CXX);
10743
10744 if (JA.getKind() == Action::PreprocessJobClass) {
10745 Args.ClaimAllArgs();
10746 CmdArgs.push_back("-E");
10747 } else {
10748 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10749 CmdArgs.push_back("-S");
10750 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10751 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010752 CmdArgs.push_back("-DMYRIAD2");
10753
10754 // Append all -I, -iquote, -isystem paths, defines/undefines,
10755 // 'f' flags, optimize flags, and warning options.
10756 // These are spelled the same way in clang and moviCompile.
10757 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
10758 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
10759 options::OPT_f_Group, options::OPT_f_clang_Group,
10760 options::OPT_g_Group, options::OPT_M_Group,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010761 options::OPT_O_Group, options::OPT_W_Group,
10762 options::OPT_mcpu_EQ});
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010763
10764 // If we're producing a dependency file, and assembly is the final action,
10765 // then the name of the target in the dependency file should be the '.o'
10766 // file, not the '.s' file produced by this step. For example, instead of
10767 // /tmp/mumble.s: mumble.c .../someheader.h
10768 // the filename on the lefthand side should be "mumble.o"
10769 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10770 C.getActions().size() == 1 &&
10771 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10772 Arg *A = Args.getLastArg(options::OPT_o);
10773 if (A) {
10774 CmdArgs.push_back("-MT");
10775 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10776 }
10777 }
10778
10779 CmdArgs.push_back(II.getFilename());
10780 CmdArgs.push_back("-o");
10781 CmdArgs.push_back(Output.getFilename());
10782
10783 std::string Exec =
10784 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
10785 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10786 CmdArgs, Inputs));
10787}
10788
10789void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10790 const InputInfo &Output,
10791 const InputInfoList &Inputs,
10792 const ArgList &Args,
10793 const char *LinkingOutput) const {
10794 ArgStringList CmdArgs;
10795
10796 assert(Inputs.size() == 1);
10797 const InputInfo &II = Inputs[0];
10798 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10799 assert(Output.getType() == types::TY_Object);
10800
10801 CmdArgs.push_back("-no6thSlotCompression");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010802 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10803 if (CPUArg)
10804 CmdArgs.push_back(
10805 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010806 CmdArgs.push_back("-noSPrefixing");
10807 CmdArgs.push_back("-a"); // Mystery option.
10808 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10809 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10810 A->claim();
10811 CmdArgs.push_back(
10812 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
10813 }
10814 CmdArgs.push_back("-elf"); // Output format.
10815 CmdArgs.push_back(II.getFilename());
10816 CmdArgs.push_back(
10817 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10818
10819 std::string Exec =
10820 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
10821 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10822 CmdArgs, Inputs));
10823}
10824
10825void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10826 const InputInfo &Output,
10827 const InputInfoList &Inputs,
10828 const ArgList &Args,
10829 const char *LinkingOutput) const {
10830 const auto &TC =
10831 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10832 const llvm::Triple &T = TC.getTriple();
10833 ArgStringList CmdArgs;
10834 bool UseStartfiles =
10835 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
10836 bool UseDefaultLibs =
10837 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
10838
10839 if (T.getArch() == llvm::Triple::sparc)
10840 CmdArgs.push_back("-EB");
10841 else // SHAVE assumes little-endian, and sparcel is expressly so.
10842 CmdArgs.push_back("-EL");
10843
10844 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10845 // but we never pass through a --sysroot option and various other bits.
10846 // For example, there are no sanitizers (yet) nor gold linker.
10847
10848 // Eat some arguments that may be present but have no effect.
10849 Args.ClaimAllArgs(options::OPT_g_Group);
10850 Args.ClaimAllArgs(options::OPT_w);
10851 Args.ClaimAllArgs(options::OPT_static_libgcc);
10852
10853 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10854 CmdArgs.push_back("-s");
10855
10856 CmdArgs.push_back("-o");
10857 CmdArgs.push_back(Output.getFilename());
10858
10859 if (UseStartfiles) {
10860 // If you want startfiles, it means you want the builtin crti and crtbegin,
10861 // but not crt0. Myriad link commands provide their own crt0.o as needed.
10862 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10863 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10864 }
10865
10866 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10867 options::OPT_e, options::OPT_s, options::OPT_t,
10868 options::OPT_Z_Flag, options::OPT_r});
10869
10870 TC.AddFilePathLibArgs(Args, CmdArgs);
10871
10872 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10873
10874 if (UseDefaultLibs) {
10875 if (C.getDriver().CCCIsCXX())
10876 CmdArgs.push_back("-lstdc++");
10877 if (T.getOS() == llvm::Triple::RTEMS) {
10878 CmdArgs.push_back("--start-group");
10879 CmdArgs.push_back("-lc");
10880 // You must provide your own "-L" option to enable finding these.
10881 CmdArgs.push_back("-lrtemscpu");
10882 CmdArgs.push_back("-lrtemsbsp");
10883 CmdArgs.push_back("--end-group");
10884 } else {
10885 CmdArgs.push_back("-lc");
10886 }
10887 CmdArgs.push_back("-lgcc");
10888 }
10889 if (UseStartfiles) {
10890 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10891 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
10892 }
10893
10894 std::string Exec =
10895 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10896 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10897 CmdArgs, Inputs));
10898}
10899
10900void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10901 const InputInfo &Output,
10902 const InputInfoList &Inputs,
10903 const ArgList &Args,
10904 const char *LinkingOutput) const {
10905 claimNoWarnArgs(Args);
10906 ArgStringList CmdArgs;
10907
10908 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10909
10910 CmdArgs.push_back("-o");
10911 CmdArgs.push_back(Output.getFilename());
10912
10913 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10914 const InputInfo &Input = Inputs[0];
10915 assert(Input.isFilename() && "Invalid input.");
10916 CmdArgs.push_back(Input.getFilename());
10917
10918 const char *Exec =
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010919 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010920 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10921}
10922
10923static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10924 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10925 if (SanArgs.needsUbsanRt()) {
10926 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10927 }
10928 if (SanArgs.needsAsanRt()) {
10929 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10930 }
10931}
10932
10933static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10934 const JobAction &JA, const InputInfo &Output,
10935 const InputInfoList &Inputs,
10936 const ArgList &Args,
10937 const char *LinkingOutput) {
10938 const toolchains::FreeBSD &ToolChain =
10939 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10940 const Driver &D = ToolChain.getDriver();
10941 ArgStringList CmdArgs;
10942
10943 // Silence warning for "clang -g foo.o -o foo"
10944 Args.ClaimAllArgs(options::OPT_g_Group);
10945 // and "clang -emit-llvm foo.o -o foo"
10946 Args.ClaimAllArgs(options::OPT_emit_llvm);
10947 // and for "clang -w foo.o -o foo". Other warning options are already
10948 // handled somewhere else.
10949 Args.ClaimAllArgs(options::OPT_w);
10950
10951 if (!D.SysRoot.empty())
10952 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10953
10954 if (Args.hasArg(options::OPT_pie))
10955 CmdArgs.push_back("-pie");
10956
10957 if (Args.hasArg(options::OPT_rdynamic))
10958 CmdArgs.push_back("-export-dynamic");
10959 if (Args.hasArg(options::OPT_shared))
10960 CmdArgs.push_back("--oformat=so");
10961
10962 if (Output.isFilename()) {
10963 CmdArgs.push_back("-o");
10964 CmdArgs.push_back(Output.getFilename());
10965 } else {
10966 assert(Output.isNothing() && "Invalid output.");
10967 }
10968
10969 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10970
10971 Args.AddAllArgs(CmdArgs, options::OPT_L);
10972 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10973 Args.AddAllArgs(CmdArgs, options::OPT_e);
10974 Args.AddAllArgs(CmdArgs, options::OPT_s);
10975 Args.AddAllArgs(CmdArgs, options::OPT_t);
10976 Args.AddAllArgs(CmdArgs, options::OPT_r);
10977
10978 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10979 CmdArgs.push_back("--no-demangle");
10980
10981 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10982
10983 if (Args.hasArg(options::OPT_pthread)) {
10984 CmdArgs.push_back("-lpthread");
10985 }
10986
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070010987 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010988
10989 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10990}
10991
10992static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10993 const JobAction &JA, const InputInfo &Output,
10994 const InputInfoList &Inputs,
10995 const ArgList &Args,
10996 const char *LinkingOutput) {
10997 const toolchains::FreeBSD &ToolChain =
10998 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10999 const Driver &D = ToolChain.getDriver();
11000 ArgStringList CmdArgs;
11001
11002 // Silence warning for "clang -g foo.o -o foo"
11003 Args.ClaimAllArgs(options::OPT_g_Group);
11004 // and "clang -emit-llvm foo.o -o foo"
11005 Args.ClaimAllArgs(options::OPT_emit_llvm);
11006 // and for "clang -w foo.o -o foo". Other warning options are already
11007 // handled somewhere else.
11008 Args.ClaimAllArgs(options::OPT_w);
11009
11010 if (!D.SysRoot.empty())
11011 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
11012
11013 if (Args.hasArg(options::OPT_pie))
11014 CmdArgs.push_back("-pie");
11015
11016 if (Args.hasArg(options::OPT_static)) {
11017 CmdArgs.push_back("-Bstatic");
11018 } else {
11019 if (Args.hasArg(options::OPT_rdynamic))
11020 CmdArgs.push_back("-export-dynamic");
11021 CmdArgs.push_back("--eh-frame-hdr");
11022 if (Args.hasArg(options::OPT_shared)) {
11023 CmdArgs.push_back("-Bshareable");
11024 } else {
11025 CmdArgs.push_back("-dynamic-linker");
11026 CmdArgs.push_back("/libexec/ld-elf.so.1");
11027 }
11028 CmdArgs.push_back("--enable-new-dtags");
11029 }
11030
11031 if (Output.isFilename()) {
11032 CmdArgs.push_back("-o");
11033 CmdArgs.push_back(Output.getFilename());
11034 } else {
11035 assert(Output.isNothing() && "Invalid output.");
11036 }
11037
11038 AddPS4SanitizerArgs(ToolChain, CmdArgs);
11039
11040 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
11041 const char *crt1 = nullptr;
11042 if (!Args.hasArg(options::OPT_shared)) {
11043 if (Args.hasArg(options::OPT_pg))
11044 crt1 = "gcrt1.o";
11045 else if (Args.hasArg(options::OPT_pie))
11046 crt1 = "Scrt1.o";
11047 else
11048 crt1 = "crt1.o";
11049 }
11050 if (crt1)
11051 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
11052
11053 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
11054
11055 const char *crtbegin = nullptr;
11056 if (Args.hasArg(options::OPT_static))
11057 crtbegin = "crtbeginT.o";
11058 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
11059 crtbegin = "crtbeginS.o";
11060 else
11061 crtbegin = "crtbegin.o";
11062
11063 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
11064 }
11065
11066 Args.AddAllArgs(CmdArgs, options::OPT_L);
11067 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
11068 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
11069 Args.AddAllArgs(CmdArgs, options::OPT_e);
11070 Args.AddAllArgs(CmdArgs, options::OPT_s);
11071 Args.AddAllArgs(CmdArgs, options::OPT_t);
11072 Args.AddAllArgs(CmdArgs, options::OPT_r);
11073
11074 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
11075 CmdArgs.push_back("--no-demangle");
11076
11077 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
11078
11079 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
11080 // For PS4, we always want to pass libm, libstdc++ and libkernel
11081 // libraries for both C and C++ compilations.
11082 CmdArgs.push_back("-lkernel");
11083 if (D.CCCIsCXX()) {
11084 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
11085 if (Args.hasArg(options::OPT_pg))
11086 CmdArgs.push_back("-lm_p");
11087 else
11088 CmdArgs.push_back("-lm");
11089 }
11090 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
11091 // the default system libraries. Just mimic this for now.
11092 if (Args.hasArg(options::OPT_pg))
11093 CmdArgs.push_back("-lgcc_p");
11094 else
11095 CmdArgs.push_back("-lcompiler_rt");
11096 if (Args.hasArg(options::OPT_static)) {
11097 CmdArgs.push_back("-lstdc++");
11098 } else if (Args.hasArg(options::OPT_pg)) {
11099 CmdArgs.push_back("-lgcc_eh_p");
11100 } else {
11101 CmdArgs.push_back("--as-needed");
11102 CmdArgs.push_back("-lstdc++");
11103 CmdArgs.push_back("--no-as-needed");
11104 }
11105
11106 if (Args.hasArg(options::OPT_pthread)) {
11107 if (Args.hasArg(options::OPT_pg))
11108 CmdArgs.push_back("-lpthread_p");
11109 else
11110 CmdArgs.push_back("-lpthread");
11111 }
11112
11113 if (Args.hasArg(options::OPT_pg)) {
11114 if (Args.hasArg(options::OPT_shared))
11115 CmdArgs.push_back("-lc");
11116 else {
11117 if (Args.hasArg(options::OPT_static)) {
11118 CmdArgs.push_back("--start-group");
11119 CmdArgs.push_back("-lc_p");
11120 CmdArgs.push_back("-lpthread_p");
11121 CmdArgs.push_back("--end-group");
11122 } else {
11123 CmdArgs.push_back("-lc_p");
11124 }
11125 }
11126 CmdArgs.push_back("-lgcc_p");
11127 } else {
11128 if (Args.hasArg(options::OPT_static)) {
11129 CmdArgs.push_back("--start-group");
11130 CmdArgs.push_back("-lc");
11131 CmdArgs.push_back("-lpthread");
11132 CmdArgs.push_back("--end-group");
11133 } else {
11134 CmdArgs.push_back("-lc");
11135 }
11136 CmdArgs.push_back("-lcompiler_rt");
11137 }
11138
11139 if (Args.hasArg(options::OPT_static)) {
11140 CmdArgs.push_back("-lstdc++");
11141 } else if (Args.hasArg(options::OPT_pg)) {
11142 CmdArgs.push_back("-lgcc_eh_p");
11143 } else {
11144 CmdArgs.push_back("--as-needed");
11145 CmdArgs.push_back("-lstdc++");
11146 CmdArgs.push_back("--no-as-needed");
11147 }
11148 }
11149
11150 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
11151 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
11152 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
11153 else
11154 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
11155 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
11156 }
11157
11158 const char *Exec =
11159#ifdef LLVM_ON_WIN32
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070011160 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080011161#else
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070011162 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080011163#endif
11164
11165 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
11166}
11167
11168void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
11169 const InputInfo &Output,
11170 const InputInfoList &Inputs,
11171 const ArgList &Args,
11172 const char *LinkingOutput) const {
11173 const toolchains::FreeBSD &ToolChain =
11174 static_cast<const toolchains::FreeBSD &>(getToolChain());
11175 const Driver &D = ToolChain.getDriver();
11176 bool PS4Linker;
11177 StringRef LinkerOptName;
11178 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
11179 LinkerOptName = A->getValue();
11180 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
11181 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
11182 }
11183
11184 if (LinkerOptName == "gold")
11185 PS4Linker = false;
11186 else if (LinkerOptName == "ps4")
11187 PS4Linker = true;
11188 else
11189 PS4Linker = !Args.hasArg(options::OPT_shared);
11190
11191 if (PS4Linker)
11192 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11193 else
11194 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
Stephen Hines176edba2014-12-01 14:53:08 -080011195}
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070011196
11197void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
11198 const InputInfo &Output,
11199 const InputInfoList &Inputs,
11200 const ArgList &Args,
11201 const char *LinkingOutput) const {
11202 const auto &TC =
11203 static_cast<const toolchains::CudaToolChain &>(getToolChain());
11204 assert(TC.getTriple().isNVPTX() && "Wrong platform");
11205
11206 std::vector<std::string> gpu_archs =
11207 Args.getAllArgValues(options::OPT_march_EQ);
11208 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
11209 const std::string& gpu_arch = gpu_archs[0];
11210
11211 // Check that our installation's ptxas supports gpu_arch.
11212 if (!Args.hasArg(options::OPT_no_cuda_version_check)) {
11213 TC.cudaInstallation().CheckCudaVersionSupportsArch(
11214 StringToCudaArch(gpu_arch));
11215 }
11216
11217 ArgStringList CmdArgs;
11218 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
11219 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
11220 options::OPT_no_cuda_noopt_device_debug, false)) {
11221 // ptxas does not accept -g option if optimization is enabled, so
11222 // we ignore the compiler's -O* options if we want debug info.
11223 CmdArgs.push_back("-g");
11224 CmdArgs.push_back("--dont-merge-basicblocks");
11225 CmdArgs.push_back("--return-at-end");
11226 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
11227 // Map the -O we received to -O{0,1,2,3}.
11228 //
11229 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
11230 // default, so it may correspond more closely to the spirit of clang -O2.
11231
11232 // -O3 seems like the least-bad option when -Osomething is specified to
11233 // clang but it isn't handled below.
11234 StringRef OOpt = "3";
11235 if (A->getOption().matches(options::OPT_O4) ||
11236 A->getOption().matches(options::OPT_Ofast))
11237 OOpt = "3";
11238 else if (A->getOption().matches(options::OPT_O0))
11239 OOpt = "0";
11240 else if (A->getOption().matches(options::OPT_O)) {
11241 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11242 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11243 .Case("1", "1")
11244 .Case("2", "2")
11245 .Case("3", "3")
11246 .Case("s", "2")
11247 .Case("z", "2")
11248 .Default("2");
11249 }
11250 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11251 } else {
11252 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11253 // to no optimizations, but ptxas's default is -O3.
11254 CmdArgs.push_back("-O0");
11255 }
11256
11257 CmdArgs.push_back("--gpu-name");
11258 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11259 CmdArgs.push_back("--output-file");
11260 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11261 for (const auto& II : Inputs)
11262 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11263
11264 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11265 CmdArgs.push_back(Args.MakeArgString(A));
11266
11267 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11268 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11269}
11270
11271// All inputs to this linker must be from CudaDeviceActions, as we need to look
11272// at the Inputs' Actions in order to figure out which GPU architecture they
11273// correspond to.
11274void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11275 const InputInfo &Output,
11276 const InputInfoList &Inputs,
11277 const ArgList &Args,
11278 const char *LinkingOutput) const {
11279 const auto &TC =
11280 static_cast<const toolchains::CudaToolChain &>(getToolChain());
11281 assert(TC.getTriple().isNVPTX() && "Wrong platform");
11282
11283 ArgStringList CmdArgs;
11284 CmdArgs.push_back("--cuda");
11285 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11286 CmdArgs.push_back(Args.MakeArgString("--create"));
11287 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11288
11289 for (const auto& II : Inputs) {
11290 auto* A = cast<const CudaDeviceAction>(II.getAction());
11291 // We need to pass an Arch of the form "sm_XX" for cubin files and
11292 // "compute_XX" for ptx.
11293 const char *Arch =
11294 (II.getType() == types::TY_PP_Asm)
11295 ? CudaVirtualArchToString(VirtualArchForCudaArch(A->getGpuArch()))
11296 : CudaArchToString(A->getGpuArch());
11297 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11298 Arch + ",file=" + II.getFilename()));
11299 }
11300
11301 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11302 CmdArgs.push_back(Args.MakeArgString(A));
11303
11304 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11305 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11306}