blob: 8e8265732a23b970c14af98991ea42013bcd22d8 [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 Nainar87d948e2016-03-03 15:49:35 -080055static const char *getSparcAsmModeForCPU(StringRef Name,
56 const llvm::Triple &Triple) {
57 if (Triple.getArch() == llvm::Triple::sparcv9) {
58 return llvm::StringSwitch<const char *>(Name)
59 .Case("niagara", "-Av9b")
60 .Case("niagara2", "-Av9b")
61 .Case("niagara3", "-Av9d")
62 .Case("niagara4", "-Av9d")
63 .Default("-Av9");
64 } else {
65 return llvm::StringSwitch<const char *>(Name)
66 .Case("v8", "-Av8")
67 .Case("supersparc", "-Av8")
68 .Case("sparclite", "-Asparclite")
69 .Case("f934", "-Asparclite")
70 .Case("hypersparc", "-Av8")
71 .Case("sparclite86x", "-Asparclite")
72 .Case("sparclet", "-Asparclet")
73 .Case("tsc701", "-Asparclet")
74 .Case("v9", "-Av8plus")
75 .Case("ultrasparc", "-Av8plus")
76 .Case("ultrasparc3", "-Av8plus")
77 .Case("niagara", "-Av8plusb")
78 .Case("niagara2", "-Av8plusb")
79 .Case("niagara3", "-Av8plusd")
80 .Case("niagara4", "-Av8plusd")
81 .Default("-Av8");
Stephen Hines651f13c2014-04-23 16:59:28 -070082 }
83}
84
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000085/// CheckPreprocessingOptions - Perform some validation of preprocessing
86/// arguments that is shared with gcc.
87static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Stephen Hinesef822542014-07-21 00:47:37 -070088 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
89 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
90 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +000091 D.Diag(diag::err_drv_argument_only_allowed_with)
Stephen Hinesef822542014-07-21 00:47:37 -070092 << A->getBaseArg().getAsString(Args)
93 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
94 }
95 }
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000096}
97
Daniel Dunbare2fd6642009-09-10 01:21:12 +000098/// CheckCodeGenerationOptions - Perform some validation of code generation
99/// arguments that is shared with gcc.
100static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
101 // In gcc, only ARM checks this, but it seems reasonable to check universally.
102 if (Args.hasArg(options::OPT_static))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800103 if (const Arg *A =
104 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
105 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
106 << "-static";
Daniel Dunbare2fd6642009-09-10 01:21:12 +0000107}
108
Stephen Hines176edba2014-12-01 14:53:08 -0800109// Add backslashes to escape spaces and other backslashes.
110// This is used for the space-separated argument list specified with
111// the -dwarf-debug-flags option.
112static void EscapeSpacesAndBackslashes(const char *Arg,
113 SmallVectorImpl<char> &Res) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800114 for (; *Arg; ++Arg) {
Stephen Hines176edba2014-12-01 14:53:08 -0800115 switch (*Arg) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800116 default:
117 break;
Stephen Hines176edba2014-12-01 14:53:08 -0800118 case ' ':
119 case '\\':
120 Res.push_back('\\');
121 break;
122 }
123 Res.push_back(*Arg);
124 }
125}
126
Chris Lattner3edbeb72010-03-29 17:55:58 +0000127// Quote target names for inclusion in GNU Make dependency files.
128// Only the characters '$', '#', ' ', '\t' are quoted.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800129static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000130 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
131 switch (Target[i]) {
132 case ' ':
133 case '\t':
134 // Escape the preceding backslashes
135 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
136 Res.push_back('\\');
137
138 // Escape the space/tab
139 Res.push_back('\\');
140 break;
141 case '$':
142 Res.push_back('$');
143 break;
144 case '#':
145 Res.push_back('\\');
146 break;
147 default:
148 break;
149 }
150
151 Res.push_back(Target[i]);
152 }
153}
154
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800155static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
156 const char *ArgName, const char *EnvVar) {
Bill Wendling3d717152012-03-12 22:10:06 +0000157 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000158 bool CombinedArg = false;
159
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000160 if (!DirList)
161 return; // Nothing to do.
162
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000163 StringRef Name(ArgName);
164 if (Name.equals("-I") || Name.equals("-L"))
165 CombinedArg = true;
166
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000167 StringRef Dirs(DirList);
168 if (Dirs.empty()) // Empty string should not add '.'.
169 return;
170
171 StringRef::size_type Delim;
Rafael Espindola8db7ec02013-06-25 14:29:51 +0000172 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000173 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000174 if (CombinedArg) {
175 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
176 } else {
177 CmdArgs.push_back(ArgName);
178 CmdArgs.push_back(".");
179 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000180 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000181 if (CombinedArg) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800182 CmdArgs.push_back(
183 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000184 } else {
185 CmdArgs.push_back(ArgName);
186 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
187 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000188 }
Nico Weber09c5c392012-03-19 15:00:03 +0000189 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000190 }
191
192 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000193 if (CombinedArg) {
194 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
195 } else {
196 CmdArgs.push_back(ArgName);
197 CmdArgs.push_back(".");
198 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000199 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000200 if (CombinedArg) {
201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs));
205 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000206 }
207}
208
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800209static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
210 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000211 const Driver &D = TC.getDriver();
212
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000213 // Add extra linker input arguments which are not treated as inputs
214 // (constructed via -Xarch_).
215 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
216
Stephen Hinesef822542014-07-21 00:47:37 -0700217 for (const auto &II : Inputs) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800218 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000219 // Don't try to pass LLVM inputs unless we have native support.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800220 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000221
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000222 // Add filenames immediately.
223 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000224 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000225 continue;
226 }
227
228 // Otherwise, this is a linker input argument.
229 const Arg &A = II.getInputArg();
230
231 // Handle reserved library options.
Stephen Hinesef822542014-07-21 00:47:37 -0700232 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000233 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Stephen Hinesef822542014-07-21 00:47:37 -0700234 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Sen7433fed2010-09-17 18:39:08 +0000235 TC.AddCCKextLibArgs(Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -0800236 else if (A.getOption().matches(options::OPT_z)) {
237 // Pass -z prefix for gcc linker compatibility.
238 A.claim();
239 A.render(Args, CmdArgs);
240 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800241 A.renderAsInput(Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -0800242 }
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000243 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000244
245 // LIBRARY_PATH - included following the user specified library paths.
Stephen Hines651f13c2014-04-23 16:59:28 -0700246 // and only supported on native toolchains.
247 if (!TC.isCrossCompiling())
248 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000249}
250
John McCallf85e1932011-06-15 23:02:42 +0000251/// \brief Determine whether Objective-C automated reference counting is
252/// enabled.
253static bool isObjCAutoRefCount(const ArgList &Args) {
254 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
255}
256
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000257/// \brief Determine whether we are linking the ObjC runtime.
258static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000259 if (isObjCAutoRefCount(Args)) {
260 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000261 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000262 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000263 return Args.hasArg(options::OPT_fobjc_link_runtime);
264}
265
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000266static bool forwardToGCC(const Option &O) {
Reid Kleckner4cd90df2013-06-19 15:09:06 +0000267 // Don't forward inputs from the original command line. They are added from
268 // InputInfoList.
Richard Smithe40bc4b2013-06-20 01:33:59 +0000269 return O.getKind() != Option::InputClass &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800270 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000271}
272
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800273void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
274 const Driver &D, const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000275 ArgStringList &CmdArgs,
276 const InputInfo &Output,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800277 const InputInfoList &Inputs,
278 const ToolChain *AuxToolChain) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000279 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000280
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000281 CheckPreprocessingOptions(D, Args);
282
283 Args.AddLastArg(CmdArgs, options::OPT_C);
284 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000285
286 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000287 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000288 (A = Args.getLastArg(options::OPT_MD)) ||
289 (A = Args.getLastArg(options::OPT_MMD))) {
290 // Determine the output location.
291 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000292 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000293 DepFile = MF->getValue();
Chad Rosier9d718632013-01-24 19:14:47 +0000294 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000295 } else if (Output.getType() == types::TY_Dependencies) {
296 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000297 } else if (A->getOption().matches(options::OPT_M) ||
298 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000299 DepFile = "-";
300 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +0000301 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000302 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000303 }
304 CmdArgs.push_back("-dependency-file");
305 CmdArgs.push_back(DepFile);
306
Chris Lattner3edbeb72010-03-29 17:55:58 +0000307 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000308 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
309 const char *DepTarget;
310
311 // If user provided -o, that is the dependency target, except
312 // when we are only generating a dependency file.
313 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
314 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000315 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000316 } else {
317 // Otherwise derive from the base input.
318 //
319 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000320 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000321 llvm::sys::path::replace_extension(P, "o");
322 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000323 }
324
325 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000326 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000327 QuoteTarget(DepTarget, Quoted);
328 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000329 }
330
Daniel Dunbarb827a052009-11-19 03:26:40 +0000331 if (A->getOption().matches(options::OPT_M) ||
332 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000333 CmdArgs.push_back("-sys-header-deps");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700334 if ((isa<PrecompileJobAction>(JA) &&
335 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
336 Args.hasArg(options::OPT_fmodule_file_deps))
Stephen Hines651f13c2014-04-23 16:59:28 -0700337 CmdArgs.push_back("-module-file-deps");
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000338 }
339
Peter Collingbournebb527862011-07-12 19:35:15 +0000340 if (Args.hasArg(options::OPT_MG)) {
341 if (!A || A->getOption().matches(options::OPT_MD) ||
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800342 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000343 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000344 CmdArgs.push_back("-MG");
345 }
346
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000347 Args.AddLastArg(CmdArgs, options::OPT_MP);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700348 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000349
350 // Convert all -MQ <target> args to -MT <quoted target>
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700351 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000352 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000353
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000354 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000355 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000356 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000357 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000358 CmdArgs.push_back(Args.MakeArgString(Quoted));
359
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800360 // -MT flag - no change
Chris Lattner3edbeb72010-03-29 17:55:58 +0000361 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000362 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000363 }
364 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000365
Douglas Gregordf91ef32009-04-18 00:34:01 +0000366 // Add -i* options, and automatically translate to
367 // -include-pch/-include-pth for transparent PCH support. It's
368 // wonky, but we include looking for .gch so we can support seamless
369 // replacement into a build system already set up to be generating
370 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000371 bool RenderedImplicitInclude = false;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700372 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000379
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700388 if (llvm::sys::fs::exists(P))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000390 }
391
Douglas Gregordf91ef32009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700394 if (llvm::sys::fs::exists(P))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000396 }
397
Douglas Gregordf91ef32009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000403 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800417 D.Diag(diag::warn_drv_pch_not_first_include) << P
418 << A->getAsString(Args);
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000419 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800428 Args.AddAllArgs(CmdArgs,
429 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
430 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000431
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800432 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000454
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000469
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800470 // Optional AuxToolChain indicates that we need to include headers
471 // for more than one target. If that's the case, add include paths
472 // from AuxToolChain right after include paths of the same kind for
473 // the current target.
474
Chandler Carruth88491fc2011-11-04 07:12:53 +0000475 // Add C++ include arguments, if needed.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800476 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000477 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800478 if (AuxToolChain)
479 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
480 }
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000481
482 // Add system include arguments.
483 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800484 if (AuxToolChain)
485 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
486
487 // Add CUDA include arguments, if needed.
488 if (types::isCuda(Inputs[0].getType()))
489 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000490}
491
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000492// FIXME: Move to target hook.
493static bool isSignedCharDefault(const llvm::Triple &Triple) {
494 switch (Triple.getArch()) {
495 default:
496 return true;
497
Tim Northoverc264e162013-01-31 12:13:10 +0000498 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -0700499 case llvm::Triple::aarch64_be:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000500 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -0700501 case llvm::Triple::armeb:
Stephen Hines176edba2014-12-01 14:53:08 -0800502 case llvm::Triple::thumb:
503 case llvm::Triple::thumbeb:
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700504 if (Triple.isOSDarwin() || Triple.isOSWindows())
505 return true;
506 return false;
507
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000508 case llvm::Triple::ppc:
509 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000510 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000511 return true;
512 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000513
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700514 case llvm::Triple::hexagon:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000515 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000516 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000517 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000518 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000519 }
520}
521
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000522static bool isNoCommonDefault(const llvm::Triple &Triple) {
523 switch (Triple.getArch()) {
524 default:
525 return false;
526
527 case llvm::Triple::xcore:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800528 case llvm::Triple::wasm32:
529 case llvm::Triple::wasm64:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000530 return true;
531 }
532}
533
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800534// ARM tools start.
535
536// Get SubArch (vN).
537static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
538 llvm::StringRef Arch = Triple.getArchName();
539 return llvm::ARM::parseArchVersion(Arch);
540}
541
542// True if M-profile.
543static bool isARMMProfile(const llvm::Triple &Triple) {
544 llvm::StringRef Arch = Triple.getArchName();
545 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
546 return Profile == llvm::ARM::PK_M;
547}
548
549// Get Arch/CPU from args.
550static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
551 llvm::StringRef &CPU, bool FromAs = false) {
552 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
553 CPU = A->getValue();
554 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
555 Arch = A->getValue();
556 if (!FromAs)
557 return;
558
559 for (const Arg *A :
560 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
561 StringRef Value = A->getValue();
562 if (Value.startswith("-mcpu="))
563 CPU = Value.substr(6);
564 if (Value.startswith("-march="))
565 Arch = Value.substr(7);
566 }
567}
568
Silviu Baranga1db2e272013-10-21 10:54:53 +0000569// Handle -mhwdiv=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800570// FIXME: Use ARMTargetParser.
Silviu Baranga1db2e272013-10-21 10:54:53 +0000571static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800572 const ArgList &Args, StringRef HWDiv,
573 std::vector<const char *> &Features) {
574 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
575 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Baranga1db2e272013-10-21 10:54:53 +0000576 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
577}
Stephen Hines176edba2014-12-01 14:53:08 -0800578
Amara Emersonfe7ed042013-10-01 10:20:54 +0000579// Handle -mfpu=.
Amara Emersonfe7ed042013-10-01 10:20:54 +0000580static void getARMFPUFeatures(const Driver &D, const Arg *A,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800581 const ArgList &Args, StringRef FPU,
Amara Emersonfe7ed042013-10-01 10:20:54 +0000582 std::vector<const char *> &Features) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800583 unsigned FPUID = llvm::ARM::parseFPU(FPU);
584 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosier99317272012-04-04 20:51:35 +0000585 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
586}
587
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800588// Decode ARM features from string like +[no]featureA+[no]featureB+...
589static bool DecodeARMFeatures(const Driver &D, StringRef text,
590 std::vector<const char *> &Features) {
591 SmallVector<StringRef, 8> Split;
592 text.split(Split, StringRef("+"), -1, false);
593
594 for (StringRef Feature : Split) {
595 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
596 if (FeatureName)
597 Features.push_back(FeatureName);
598 else
599 return false;
600 }
601 return true;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700602}
603
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800604// Check if -march is valid by checking if it can be canonicalised and parsed.
605// getARMArch is used here instead of just checking the -march value in order
606// to handle -march=native correctly.
607static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
608 llvm::StringRef ArchName,
609 std::vector<const char *> &Features,
610 const llvm::Triple &Triple) {
611 std::pair<StringRef, StringRef> Split = ArchName.split("+");
612
613 std::string MArch = arm::getARMArch(ArchName, Triple);
614 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
615 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
617}
618
619// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
620static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
621 llvm::StringRef CPUName, llvm::StringRef ArchName,
622 std::vector<const char *> &Features,
623 const llvm::Triple &Triple) {
624 std::pair<StringRef, StringRef> Split = CPUName.split("+");
625
626 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
627 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
628 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
629 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
630}
631
632static bool useAAPCSForMachO(const llvm::Triple &T) {
633 // The backend is hardwired to assume AAPCS for M-class processors, ensure
634 // the frontend matches that.
635 return T.getEnvironment() == llvm::Triple::EABI ||
636 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700637}
638
Anton Korobeynikove2571792012-04-09 13:38:30 +0000639// Select the float ABI as determined by -msoft-float, -mhard-float, and
640// -mfloat-abi=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800641arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
642 const Driver &D = TC.getDriver();
643 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
644 auto SubArch = getARMSubArchVersionNumber(Triple);
645 arm::FloatABI ABI = FloatABI::Invalid;
646 if (Arg *A =
647 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
648 options::OPT_mfloat_abi_EQ)) {
649 if (A->getOption().matches(options::OPT_msoft_float)) {
650 ABI = FloatABI::Soft;
651 } else if (A->getOption().matches(options::OPT_mhard_float)) {
652 ABI = FloatABI::Hard;
653 } else {
654 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
655 .Case("soft", FloatABI::Soft)
656 .Case("softfp", FloatABI::SoftFP)
657 .Case("hard", FloatABI::Hard)
658 .Default(FloatABI::Invalid);
659 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
660 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
661 ABI = FloatABI::Soft;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000662 }
663 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800664
665 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
666 // "apcs-gnu".
667 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
668 ABI == FloatABI::Hard) {
669 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
670 << Triple.getArchName();
671 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000672 }
673
674 // If unspecified, choose the default based on the platform.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800675 if (ABI == FloatABI::Invalid) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000676 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000677 case llvm::Triple::Darwin:
678 case llvm::Triple::MacOSX:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800679 case llvm::Triple::IOS:
680 case llvm::Triple::TvOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000681 // Darwin defaults to "softfp" for v6 and v7.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800682 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000683 break;
684 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800685 case llvm::Triple::WatchOS:
686 ABI = FloatABI::Hard;
687 break;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000688
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700689 // FIXME: this is invalid for WindowsCE
690 case llvm::Triple::Win32:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800691 ABI = FloatABI::Hard;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700692 break;
693
Rafael Espindola27fa2362012-12-13 04:17:14 +0000694 case llvm::Triple::FreeBSD:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800695 switch (Triple.getEnvironment()) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700696 case llvm::Triple::GNUEABIHF:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800697 ABI = FloatABI::Hard;
Stephen Hines651f13c2014-04-23 16:59:28 -0700698 break;
699 default:
700 // FreeBSD defaults to soft float
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800701 ABI = FloatABI::Soft;
Stephen Hines651f13c2014-04-23 16:59:28 -0700702 break;
703 }
Rafael Espindola27fa2362012-12-13 04:17:14 +0000704 break;
705
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000706 default:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800707 switch (Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000708 case llvm::Triple::GNUEABIHF:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800709 case llvm::Triple::EABIHF:
710 ABI = FloatABI::Hard;
Jiangning Liuff104a12012-07-31 08:06:29 +0000711 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000712 case llvm::Triple::GNUEABI:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000713 case llvm::Triple::EABI:
714 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800715 ABI = FloatABI::SoftFP;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000716 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800717 case llvm::Triple::Android:
718 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthb43550b2012-01-10 19:47:42 +0000719 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000720 default:
721 // Assume "soft", but warn the user we are guessing.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800722 ABI = FloatABI::Soft;
Stephen Hines651f13c2014-04-23 16:59:28 -0700723 if (Triple.getOS() != llvm::Triple::UnknownOS ||
724 !Triple.isOSBinFormatMachO())
725 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000726 break;
727 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000728 }
729 }
730
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800731 assert(ABI != FloatABI::Invalid && "must select an ABI");
732 return ABI;
Anton Korobeynikove2571792012-04-09 13:38:30 +0000733}
734
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800735static void getARMTargetFeatures(const ToolChain &TC,
736 const llvm::Triple &Triple,
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000737 const ArgList &Args,
Stephen Hines651f13c2014-04-23 16:59:28 -0700738 std::vector<const char *> &Features,
739 bool ForAS) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800740 const Driver &D = TC.getDriver();
741
742 bool KernelOrKext =
743 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
744 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
745 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
746 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
747
Stephen Hines651f13c2014-04-23 16:59:28 -0700748 if (!ForAS) {
749 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
750 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
751 // stripped out by the ARM target. We should probably pass this a new
752 // -target-option, which is handled by the -cc1/-cc1as invocation.
753 //
754 // FIXME2: For consistency, it would be ideal if we set up the target
755 // machine state the same when using the frontend or the assembler. We don't
756 // currently do that for the assembler, we pass the options directly to the
757 // backend and never even instantiate the frontend TargetInfo. If we did,
758 // and used its handleTargetFeatures hook, then we could ensure the
759 // assembler and the frontend behave the same.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000760
Stephen Hines651f13c2014-04-23 16:59:28 -0700761 // Use software floating point operations?
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800762 if (ABI == arm::FloatABI::Soft)
Stephen Hines651f13c2014-04-23 16:59:28 -0700763 Features.push_back("+soft-float");
764
765 // Use software floating point argument passing?
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800766 if (ABI != arm::FloatABI::Hard)
Stephen Hines651f13c2014-04-23 16:59:28 -0700767 Features.push_back("+soft-float-abi");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800768 } else {
769 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
770 // to the assembler correctly.
771 for (const Arg *A :
772 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
773 StringRef Value = A->getValue();
774 if (Value.startswith("-mfpu=")) {
775 WaFPU = A;
776 } else if (Value.startswith("-mcpu=")) {
777 WaCPU = A;
778 } else if (Value.startswith("-mhwdiv=")) {
779 WaHDiv = A;
780 } else if (Value.startswith("-march=")) {
781 WaArch = A;
782 }
783 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700784 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000785
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800786 // Check -march. ClangAs gives preference to -Wa,-march=.
787 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
788 StringRef ArchName;
789 if (WaArch) {
790 if (ArchArg)
791 D.Diag(clang::diag::warn_drv_unused_argument)
792 << ArchArg->getAsString(Args);
793 ArchName = StringRef(WaArch->getValue()).substr(7);
794 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
795 // FIXME: Set Arch.
796 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
797 } else if (ArchArg) {
798 ArchName = ArchArg->getValue();
799 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700800 }
801
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800802 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
803 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
804 StringRef CPUName;
805 if (WaCPU) {
806 if (CPUArg)
807 D.Diag(clang::diag::warn_drv_unused_argument)
808 << CPUArg->getAsString(Args);
809 CPUName = StringRef(WaCPU->getValue()).substr(6);
810 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
811 } else if (CPUArg) {
812 CPUName = CPUArg->getValue();
813 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700814 }
815
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800816 // Add CPU features for generic CPUs
817 if (CPUName == "native") {
818 llvm::StringMap<bool> HostFeatures;
819 if (llvm::sys::getHostCPUFeatures(HostFeatures))
820 for (auto &F : HostFeatures)
821 Features.push_back(
822 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
823 }
824
825 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
826 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
827 if (WaFPU) {
828 if (FPUArg)
829 D.Diag(clang::diag::warn_drv_unused_argument)
830 << FPUArg->getAsString(Args);
831 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
832 Features);
833 } else if (FPUArg) {
834 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
835 }
836
837 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
838 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
839 if (WaHDiv) {
840 if (HDivArg)
841 D.Diag(clang::diag::warn_drv_unused_argument)
842 << HDivArg->getAsString(Args);
843 getARMHWDivFeatures(D, WaHDiv, Args,
844 StringRef(WaHDiv->getValue()).substr(8), Features);
845 } else if (HDivArg)
846 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
847
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000848 // Setting -msoft-float effectively disables NEON because of the GCC
849 // implementation, although the same isn't true of VFP or VFP3.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800850 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000851 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700852 // Also need to explicitly disable features which imply NEON.
853 Features.push_back("-crypto");
854 }
Bernard Ogden909f35a2013-10-29 09:47:51 +0000855
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700856 // En/disable crc code generation.
857 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden909f35a2013-10-29 09:47:51 +0000858 if (A->getOption().matches(options::OPT_mcrc))
859 Features.push_back("+crc");
860 else
861 Features.push_back("-crc");
862 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700863
864 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
865 Features.insert(Features.begin(), "+v8.1a");
866 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800867
868 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
869 // neither options are specified, see if we are compiling for kernel/kext and
870 // decide whether to pass "+long-calls" based on the OS and its version.
871 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
872 options::OPT_mno_long_calls)) {
873 if (A->getOption().matches(options::OPT_mlong_calls))
874 Features.push_back("+long-calls");
875 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
876 !Triple.isWatchOS()) {
877 Features.push_back("+long-calls");
878 }
879
880 // Kernel code has more strict alignment requirements.
881 if (KernelOrKext)
882 Features.push_back("+strict-align");
883 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
884 options::OPT_munaligned_access)) {
885 if (A->getOption().matches(options::OPT_munaligned_access)) {
886 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
887 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
888 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
889 } else
890 Features.push_back("+strict-align");
891 } else {
892 // Assume pre-ARMv6 doesn't support unaligned accesses.
893 //
894 // ARMv6 may or may not support unaligned accesses depending on the
895 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
896 // Darwin and NetBSD targets support unaligned accesses, and others don't.
897 //
898 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
899 // which raises an alignment fault on unaligned accesses. Linux
900 // defaults this bit to 0 and handles it as a system-wide (not
901 // per-process) setting. It is therefore safe to assume that ARMv7+
902 // Linux targets support unaligned accesses. The same goes for NaCl.
903 //
904 // The above behavior is consistent with GCC.
905 int VersionNum = getARMSubArchVersionNumber(Triple);
906 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
907 if (VersionNum < 6 ||
908 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
909 Features.push_back("+strict-align");
910 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
911 if (VersionNum < 7)
912 Features.push_back("+strict-align");
913 } else
914 Features.push_back("+strict-align");
915 }
916
917 // llvm does not support reserving registers in general. There is support
918 // for reserving r9 on ARM though (defined as a platform-specific register
919 // in ARM EABI).
920 if (Args.hasArg(options::OPT_ffixed_r9))
921 Features.push_back("+reserve-r9");
922
923 // The kext linker doesn't know how to deal with movw/movt.
924 if (KernelOrKext)
925 Features.push_back("+no-movt");
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000926}
Anton Korobeynikove2571792012-04-09 13:38:30 +0000927
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800928void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
929 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikove2571792012-04-09 13:38:30 +0000930 // Select the ABI to use.
Anton Korobeynikove2571792012-04-09 13:38:30 +0000931 // FIXME: Support -meabi.
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700932 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700933 const char *ABIName = nullptr;
Anton Korobeynikove2571792012-04-09 13:38:30 +0000934 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000935 ABIName = A->getValue();
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700936 } else if (Triple.isOSBinFormatMachO()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800937 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000938 ABIName = "aapcs";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800939 } else if (Triple.isWatchOS()) {
940 ABIName = "aapcs16";
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000941 } else {
942 ABIName = "apcs-gnu";
943 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700944 } else if (Triple.isOSWindows()) {
945 // FIXME: this is invalid for WindowsCE
946 ABIName = "aapcs";
Anton Korobeynikove2571792012-04-09 13:38:30 +0000947 } else {
948 // Select the default based on the platform.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800949 switch (Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000950 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000951 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000952 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000953 ABIName = "aapcs-linux";
954 break;
Stephen Hines651f13c2014-04-23 16:59:28 -0700955 case llvm::Triple::EABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000956 case llvm::Triple::EABI:
957 ABIName = "aapcs";
958 break;
959 default:
Stephen Hines176edba2014-12-01 14:53:08 -0800960 if (Triple.getOS() == llvm::Triple::NetBSD)
961 ABIName = "apcs-gnu";
962 else
963 ABIName = "aapcs";
964 break;
Anton Korobeynikove2571792012-04-09 13:38:30 +0000965 }
966 }
967 CmdArgs.push_back("-target-abi");
968 CmdArgs.push_back(ABIName);
969
Anton Korobeynikove2571792012-04-09 13:38:30 +0000970 // Determine floating point ABI from the options & target defaults.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800971 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
972 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000973 // Floating point operations and argument passing are soft.
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000974 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000975 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000976 CmdArgs.push_back("-mfloat-abi");
977 CmdArgs.push_back("soft");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800978 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000979 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000980 CmdArgs.push_back("-mfloat-abi");
981 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000982 } else {
983 // Floating point operations and argument passing are hard.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800984 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000985 CmdArgs.push_back("-mfloat-abi");
986 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000987 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000988
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700989 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosier1b906052011-08-26 00:26:29 +0000990 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
991 options::OPT_mno_global_merge)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700992 CmdArgs.push_back("-backend-option");
Chad Rosier1b906052011-08-26 00:26:29 +0000993 if (A->getOption().matches(options::OPT_mno_global_merge))
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700994 CmdArgs.push_back("-arm-global-merge=false");
995 else
996 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosier1b906052011-08-26 00:26:29 +0000997 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000998
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000999 if (!Args.hasFlag(options::OPT_mimplicit_float,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001000 options::OPT_mno_implicit_float, true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +00001001 CmdArgs.push_back("-no-implicit-float");
Stephen Hines651f13c2014-04-23 16:59:28 -07001002}
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001003// ARM tools end.
Stephen Hines651f13c2014-04-23 16:59:28 -07001004
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001005/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1006/// targeting.
1007static std::string getAArch64TargetCPU(const ArgList &Args) {
Stephen Hines176edba2014-12-01 14:53:08 -08001008 Arg *A;
1009 std::string CPU;
1010 // If we have -mtune or -mcpu, use that.
1011 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001012 CPU = StringRef(A->getValue()).lower();
Stephen Hines176edba2014-12-01 14:53:08 -08001013 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
1014 StringRef Mcpu = A->getValue();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001015 CPU = Mcpu.split("+").first.lower();
Stephen Hines651f13c2014-04-23 16:59:28 -07001016 }
1017
Stephen Hines176edba2014-12-01 14:53:08 -08001018 // Handle CPU name is 'native'.
1019 if (CPU == "native")
1020 return llvm::sys::getHostCPUName();
1021 else if (CPU.size())
1022 return CPU;
Stephen Hines651f13c2014-04-23 16:59:28 -07001023
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001024 // Make sure we pick "cyclone" if -arch is used.
1025 // FIXME: Should this be picked by checking the target triple instead?
1026 if (Args.getLastArg(options::OPT_arch))
1027 return "cyclone";
1028
1029 return "generic";
Stephen Hines651f13c2014-04-23 16:59:28 -07001030}
1031
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001032void Clang::AddAArch64TargetArgs(const ArgList &Args,
1033 ArgStringList &CmdArgs) const {
Stephen Hines651f13c2014-04-23 16:59:28 -07001034 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1035 llvm::Triple Triple(TripleStr);
1036
1037 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1038 Args.hasArg(options::OPT_mkernel) ||
1039 Args.hasArg(options::OPT_fapple_kext))
1040 CmdArgs.push_back("-disable-red-zone");
1041
1042 if (!Args.hasFlag(options::OPT_mimplicit_float,
1043 options::OPT_mno_implicit_float, true))
1044 CmdArgs.push_back("-no-implicit-float");
1045
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001046 const char *ABIName = nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001047 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1048 ABIName = A->getValue();
1049 else if (Triple.isOSDarwin())
1050 ABIName = "darwinpcs";
1051 else
1052 ABIName = "aapcs";
1053
1054 CmdArgs.push_back("-target-abi");
1055 CmdArgs.push_back(ABIName);
1056
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001057 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1058 options::OPT_mno_fix_cortex_a53_835769)) {
1059 CmdArgs.push_back("-backend-option");
1060 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1061 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1062 else
1063 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001064 } else if (Triple.isAndroid()) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001065 // Enabled A53 errata (835769) workaround by default on android
1066 CmdArgs.push_back("-backend-option");
1067 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1068 }
1069
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001070 // Forward the -mglobal-merge option for explicit control over the pass.
Stephen Hinesef822542014-07-21 00:47:37 -07001071 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1072 options::OPT_mno_global_merge)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001073 CmdArgs.push_back("-backend-option");
Stephen Hinesef822542014-07-21 00:47:37 -07001074 if (A->getOption().matches(options::OPT_mno_global_merge))
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001075 CmdArgs.push_back("-aarch64-global-merge=false");
1076 else
1077 CmdArgs.push_back("-aarch64-global-merge=true");
Stephen Hinesef822542014-07-21 00:47:37 -07001078 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +00001079}
1080
Simon Atanasyana2768be2012-04-07 22:09:23 +00001081// Get CPU and ABI names. They are not independent
1082// so we have to calculate them together.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001083void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1084 StringRef &CPUName, StringRef &ABIName) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001085 const char *DefMips32CPU = "mips32r2";
1086 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka9f360622011-09-26 21:07:52 +00001087
Stephen Hinesef822542014-07-21 00:47:37 -07001088 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1089 // default for mips64(el)?-img-linux-gnu.
1090 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1091 Triple.getEnvironment() == llvm::Triple::GNU) {
1092 DefMips32CPU = "mips32r6";
1093 DefMips64CPU = "mips64r6";
1094 }
1095
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001096 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1097 if (Triple.isAndroid())
1098 DefMips64CPU = "mips64r6";
1099
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001100 // MIPS3 is the default for mips64*-unknown-openbsd.
1101 if (Triple.getOS() == llvm::Triple::OpenBSD)
1102 DefMips64CPU = "mips3";
1103
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001104 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyan66751bc2013-10-09 12:12:24 +00001105 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001106
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001107 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001108 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001109 // Convert a GNU style Mips ABI name to the name
1110 // accepted by LLVM Mips backend.
1111 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001112 .Case("32", "o32")
1113 .Case("64", "n64")
1114 .Default(ABIName);
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +00001115 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001116
1117 // Setup default CPU and ABI names.
1118 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +00001119 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001120 default:
1121 llvm_unreachable("Unexpected triple arch name");
1122 case llvm::Triple::mips:
1123 case llvm::Triple::mipsel:
1124 CPUName = DefMips32CPU;
1125 break;
1126 case llvm::Triple::mips64:
1127 case llvm::Triple::mips64el:
1128 CPUName = DefMips64CPU;
1129 break;
1130 }
1131 }
1132
Stephen Hinesef822542014-07-21 00:47:37 -07001133 if (ABIName.empty()) {
1134 // Deduce ABI name from the target triple.
1135 if (Triple.getArch() == llvm::Triple::mips ||
1136 Triple.getArch() == llvm::Triple::mipsel)
1137 ABIName = "o32";
1138 else
1139 ABIName = "n64";
Simon Atanasyan89d83ff2012-09-10 08:32:41 +00001140 }
1141
Stephen Hinesef822542014-07-21 00:47:37 -07001142 if (CPUName.empty()) {
1143 // Deduce CPU name from ABI name.
1144 CPUName = llvm::StringSwitch<const char *>(ABIName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001145 .Cases("o32", "eabi", DefMips32CPU)
1146 .Cases("n32", "n64", DefMips64CPU)
1147 .Default("");
Stephen Hinesef822542014-07-21 00:47:37 -07001148 }
Stephen Hines176edba2014-12-01 14:53:08 -08001149
1150 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyana2768be2012-04-07 22:09:23 +00001151}
1152
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001153std::string mips::getMipsABILibSuffix(const ArgList &Args,
1154 const llvm::Triple &Triple) {
1155 StringRef CPUName, ABIName;
1156 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1157 return llvm::StringSwitch<std::string>(ABIName)
1158 .Case("o32", "")
1159 .Case("n32", "32")
1160 .Case("n64", "64");
1161}
1162
Simon Atanasyane9616a42013-02-27 14:55:49 +00001163// Convert ABI name to the GNU tools acceptable variant.
1164static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1165 return llvm::StringSwitch<llvm::StringRef>(ABI)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001166 .Case("o32", "32")
1167 .Case("n64", "64")
1168 .Default(ABI);
Simon Atanasyane9616a42013-02-27 14:55:49 +00001169}
1170
Simon Atanasyan5e627792012-06-02 15:06:29 +00001171// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1172// and -mfloat-abi=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001173static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1174 mips::FloatABI ABI = mips::FloatABI::Invalid;
1175 if (Arg *A =
1176 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1177 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +00001178 if (A->getOption().matches(options::OPT_msoft_float))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001179 ABI = mips::FloatABI::Soft;
Eric Christophered734732010-03-02 02:41:08 +00001180 else if (A->getOption().matches(options::OPT_mhard_float))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001181 ABI = mips::FloatABI::Hard;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001182 else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001183 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1184 .Case("soft", mips::FloatABI::Soft)
1185 .Case("hard", mips::FloatABI::Hard)
1186 .Default(mips::FloatABI::Invalid);
1187 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001188 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001189 ABI = mips::FloatABI::Hard;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001190 }
1191 }
Eric Christophered734732010-03-02 02:41:08 +00001192 }
1193
1194 // If unspecified, choose the default based on the platform.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001195 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001196 // Assume "hard", because it's a default value used by gcc.
1197 // When we start to recognize specific target MIPS processors,
1198 // we will be able to select the default more correctly.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001199 ABI = mips::FloatABI::Hard;
Eric Christophered734732010-03-02 02:41:08 +00001200 }
1201
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001202 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1203 return ABI;
Simon Atanasyan5e627792012-06-02 15:06:29 +00001204}
1205
Simon Atanasyandc536f52012-07-05 18:51:43 +00001206static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001207 std::vector<const char *> &Features,
1208 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +00001209 StringRef FeatureName) {
1210 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +00001211 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001212 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001213 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001214 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001215 }
1216}
1217
Stephen Hines176edba2014-12-01 14:53:08 -08001218static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1219 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001220 std::vector<const char *> &Features) {
Stephen Hines176edba2014-12-01 14:53:08 -08001221 StringRef CPUName;
1222 StringRef ABIName;
1223 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1224 ABIName = getGnuCompatibleMipsABIName(ABIName);
1225
Stephen Hines176edba2014-12-01 14:53:08 -08001226 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1227 options::OPT_mabicalls, "noabicalls");
1228
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001229 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1230 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001231 // FIXME: Note, this is a hack. We need to pass the selected float
1232 // mode to the MipsTargetInfoBase to define appropriate macros there.
1233 // Now it is the only method.
1234 Features.push_back("+soft-float");
1235 }
1236
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001237 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001238 StringRef Val = StringRef(A->getValue());
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001239 if (Val == "2008") {
1240 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1241 Features.push_back("+nan2008");
1242 else {
1243 Features.push_back("-nan2008");
1244 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1245 }
1246 } else if (Val == "legacy") {
1247 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1248 Features.push_back("-nan2008");
1249 else {
1250 Features.push_back("+nan2008");
1251 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1252 }
1253 } else
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001254 D.Diag(diag::err_drv_unsupported_option_argument)
1255 << A->getOption().getName() << Val;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001256 }
1257
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001258 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1259 options::OPT_mdouble_float, "single-float");
1260 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1261 "mips16");
1262 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1263 options::OPT_mno_micromips, "micromips");
1264 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1265 "dsp");
1266 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1267 "dspr2");
1268 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1269 "msa");
Stephen Hines176edba2014-12-01 14:53:08 -08001270
1271 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1272 // pass -mfpxx
1273 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1274 options::OPT_mfp64)) {
1275 if (A->getOption().matches(options::OPT_mfp32))
1276 Features.push_back(Args.MakeArgString("-fp64"));
1277 else if (A->getOption().matches(options::OPT_mfpxx)) {
1278 Features.push_back(Args.MakeArgString("+fpxx"));
1279 Features.push_back(Args.MakeArgString("+nooddspreg"));
1280 } else
1281 Features.push_back(Args.MakeArgString("+fp64"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001282 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Stephen Hines176edba2014-12-01 14:53:08 -08001283 Features.push_back(Args.MakeArgString("+fpxx"));
1284 Features.push_back(Args.MakeArgString("+nooddspreg"));
1285 }
1286
Stephen Hinesef822542014-07-21 00:47:37 -07001287 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1288 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001289}
1290
Simon Atanasyan5e627792012-06-02 15:06:29 +00001291void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001292 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001293 const Driver &D = getToolChain().getDriver();
1294 StringRef CPUName;
1295 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001296 const llvm::Triple &Triple = getToolChain().getTriple();
Stephen Hines176edba2014-12-01 14:53:08 -08001297 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001298
1299 CmdArgs.push_back("-target-abi");
1300 CmdArgs.push_back(ABIName.data());
1301
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001302 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1303 if (ABI == mips::FloatABI::Soft) {
Eric Christophered734732010-03-02 02:41:08 +00001304 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001305 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001306 CmdArgs.push_back("-mfloat-abi");
1307 CmdArgs.push_back("soft");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001308 } else {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001309 // Floating point operations and argument passing are hard.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001310 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001311 CmdArgs.push_back("-mfloat-abi");
1312 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001313 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001314
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001315 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1316 if (A->getOption().matches(options::OPT_mxgot)) {
1317 CmdArgs.push_back("-mllvm");
1318 CmdArgs.push_back("-mxgot");
1319 }
1320 }
1321
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001322 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1323 options::OPT_mno_ldc1_sdc1)) {
1324 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1325 CmdArgs.push_back("-mllvm");
1326 CmdArgs.push_back("-mno-ldc1-sdc1");
1327 }
1328 }
1329
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001330 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1331 options::OPT_mno_check_zero_division)) {
1332 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1333 CmdArgs.push_back("-mllvm");
1334 CmdArgs.push_back("-mno-check-zero-division");
1335 }
1336 }
1337
Simon Atanasyan9804b762012-08-27 20:55:56 +00001338 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001339 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001340 CmdArgs.push_back("-mllvm");
1341 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1342 A->claim();
1343 }
Eric Christophered734732010-03-02 02:41:08 +00001344}
1345
Hal Finkel02a84272012-06-11 22:35:19 +00001346/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1347static std::string getPPCTargetCPU(const ArgList &Args) {
1348 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001349 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001350
1351 if (CPUName == "native") {
1352 std::string CPU = llvm::sys::getHostCPUName();
1353 if (!CPU.empty() && CPU != "generic")
1354 return CPU;
1355 else
1356 return "";
1357 }
1358
1359 return llvm::StringSwitch<const char *>(CPUName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001360 .Case("common", "generic")
1361 .Case("440", "440")
1362 .Case("440fp", "440")
1363 .Case("450", "450")
1364 .Case("601", "601")
1365 .Case("602", "602")
1366 .Case("603", "603")
1367 .Case("603e", "603e")
1368 .Case("603ev", "603ev")
1369 .Case("604", "604")
1370 .Case("604e", "604e")
1371 .Case("620", "620")
1372 .Case("630", "pwr3")
1373 .Case("G3", "g3")
1374 .Case("7400", "7400")
1375 .Case("G4", "g4")
1376 .Case("7450", "7450")
1377 .Case("G4+", "g4+")
1378 .Case("750", "750")
1379 .Case("970", "970")
1380 .Case("G5", "g5")
1381 .Case("a2", "a2")
1382 .Case("a2q", "a2q")
1383 .Case("e500mc", "e500mc")
1384 .Case("e5500", "e5500")
1385 .Case("power3", "pwr3")
1386 .Case("power4", "pwr4")
1387 .Case("power5", "pwr5")
1388 .Case("power5x", "pwr5x")
1389 .Case("power6", "pwr6")
1390 .Case("power6x", "pwr6x")
1391 .Case("power7", "pwr7")
1392 .Case("power8", "pwr8")
1393 .Case("pwr3", "pwr3")
1394 .Case("pwr4", "pwr4")
1395 .Case("pwr5", "pwr5")
1396 .Case("pwr5x", "pwr5x")
1397 .Case("pwr6", "pwr6")
1398 .Case("pwr6x", "pwr6x")
1399 .Case("pwr7", "pwr7")
1400 .Case("pwr8", "pwr8")
1401 .Case("powerpc", "ppc")
1402 .Case("powerpc64", "ppc64")
1403 .Case("powerpc64le", "ppc64le")
1404 .Default("");
Hal Finkel02a84272012-06-11 22:35:19 +00001405 }
1406
1407 return "";
1408}
1409
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001410static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1411 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001412 std::vector<const char *> &Features) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001413 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1414 StringRef Name = A->getOption().getName();
1415 A->claim();
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001416
1417 // Skip over "-m".
1418 assert(Name.startswith("m") && "Invalid feature name.");
1419 Name = Name.substr(1);
1420
1421 bool IsNegative = Name.startswith("no-");
1422 if (IsNegative)
1423 Name = Name.substr(3);
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001424 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1425 }
1426
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001427 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1428 if (FloatABI == ppc::FloatABI::Soft &&
1429 !(Triple.getArch() == llvm::Triple::ppc64 ||
1430 Triple.getArch() == llvm::Triple::ppc64le))
1431 Features.push_back("+soft-float");
1432 else if (FloatABI == ppc::FloatABI::Soft &&
1433 (Triple.getArch() == llvm::Triple::ppc64 ||
1434 Triple.getArch() == llvm::Triple::ppc64le))
1435 D.Diag(diag::err_drv_invalid_mfloat_abi)
1436 << "soft float is not supported for ppc64";
1437
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001438 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001439 AddTargetFeature(Args, Features, options::OPT_faltivec,
1440 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001441}
1442
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001443ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1444 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1445 if (Arg *A =
1446 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1447 options::OPT_mfloat_abi_EQ)) {
1448 if (A->getOption().matches(options::OPT_msoft_float))
1449 ABI = ppc::FloatABI::Soft;
1450 else if (A->getOption().matches(options::OPT_mhard_float))
1451 ABI = ppc::FloatABI::Hard;
1452 else {
1453 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1454 .Case("soft", ppc::FloatABI::Soft)
1455 .Case("hard", ppc::FloatABI::Hard)
1456 .Default(ppc::FloatABI::Invalid);
1457 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1458 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1459 ABI = ppc::FloatABI::Hard;
1460 }
1461 }
1462 }
1463
1464 // If unspecified, choose the default based on the platform.
1465 if (ABI == ppc::FloatABI::Invalid) {
1466 ABI = ppc::FloatABI::Hard;
1467 }
1468
1469 return ABI;
1470}
1471
Stephen Hines176edba2014-12-01 14:53:08 -08001472void Clang::AddPPCTargetArgs(const ArgList &Args,
1473 ArgStringList &CmdArgs) const {
1474 // Select the ABI to use.
1475 const char *ABIName = nullptr;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001476 if (getToolChain().getTriple().isOSLinux())
1477 switch (getToolChain().getArch()) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001478 case llvm::Triple::ppc64: {
1479 // When targeting a processor that supports QPX, or if QPX is
1480 // specifically enabled, default to using the ABI that supports QPX (so
1481 // long as it is not specifically disabled).
1482 bool HasQPX = false;
1483 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1484 HasQPX = A->getValue() == StringRef("a2q");
1485 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1486 if (HasQPX) {
1487 ABIName = "elfv1-qpx";
1488 break;
1489 }
1490
Stephen Hines176edba2014-12-01 14:53:08 -08001491 ABIName = "elfv1";
1492 break;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001493 }
Stephen Hines176edba2014-12-01 14:53:08 -08001494 case llvm::Triple::ppc64le:
1495 ABIName = "elfv2";
1496 break;
1497 default:
1498 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001499 }
1500
1501 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1502 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1503 // the option if given as we don't have backend support for any targets
1504 // that don't use the altivec abi.
1505 if (StringRef(A->getValue()) != "altivec")
1506 ABIName = A->getValue();
1507
1508 ppc::FloatABI FloatABI =
1509 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1510
1511 if (FloatABI == ppc::FloatABI::Soft) {
1512 // Floating point operations and argument passing are soft.
1513 CmdArgs.push_back("-msoft-float");
1514 CmdArgs.push_back("-mfloat-abi");
1515 CmdArgs.push_back("soft");
1516 } else {
1517 // Floating point operations and argument passing are hard.
1518 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1519 CmdArgs.push_back("-mfloat-abi");
1520 CmdArgs.push_back("hard");
Stephen Hines176edba2014-12-01 14:53:08 -08001521 }
1522
1523 if (ABIName) {
1524 CmdArgs.push_back("-target-abi");
1525 CmdArgs.push_back(ABIName);
1526 }
1527}
1528
1529bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1530 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1531 return A && (A->getValue() == StringRef(Value));
1532}
1533
Tom Stellarde25d2f62013-04-01 20:56:53 +00001534/// Get the (LLVM) name of the R600 gpu we are targeting.
1535static std::string getR600TargetGPU(const ArgList &Args) {
1536 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001537 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001538 return llvm::StringSwitch<const char *>(GPUName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001539 .Cases("rv630", "rv635", "r600")
1540 .Cases("rv610", "rv620", "rs780", "rs880")
1541 .Case("rv740", "rv770")
1542 .Case("palm", "cedar")
1543 .Cases("sumo", "sumo2", "sumo")
1544 .Case("hemlock", "cypress")
1545 .Case("aruba", "cayman")
1546 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001547 }
1548 return "";
1549}
1550
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001551void Clang::AddSparcTargetArgs(const ArgList &Args,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001552 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001553 const Driver &D = getToolChain().getDriver();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001554 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001555
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001556 bool SoftFloatABI = false;
1557 if (Arg *A =
1558 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001559 if (A->getOption().matches(options::OPT_msoft_float))
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001560 SoftFloatABI = true;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001561 }
1562
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001563 // Only the hard-float ABI on Sparc is standardized, and it is the
1564 // default. GCC also supports a nonstandard soft-float ABI mode, and
1565 // perhaps LLVM should implement that, too. However, since llvm
1566 // currently does not support Sparc soft-float, at all, display an
1567 // error if it's requested.
1568 if (SoftFloatABI) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001569 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1570 << Triple;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001571 }
1572}
1573
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001574static const char *getSystemZTargetCPU(const ArgList &Args) {
1575 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1576 return A->getValue();
1577 return "z10";
1578}
1579
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001580static void getSystemZTargetFeatures(const ArgList &Args,
1581 std::vector<const char *> &Features) {
1582 // -m(no-)htm overrides use of the transactional-execution facility.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001583 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001584 if (A->getOption().matches(options::OPT_mhtm))
1585 Features.push_back("+transactional-execution");
1586 else
1587 Features.push_back("-transactional-execution");
1588 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001589 // -m(no-)vx overrides use of the vector facility.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001590 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001591 if (A->getOption().matches(options::OPT_mvx))
1592 Features.push_back("+vector");
1593 else
1594 Features.push_back("-vector");
1595 }
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001596}
1597
Chandler Carruth700d4e42013-01-13 11:46:33 +00001598static const char *getX86TargetCPU(const ArgList &Args,
1599 const llvm::Triple &Triple) {
1600 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001601 if (StringRef(A->getValue()) != "native") {
1602 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1603 return "core-avx2";
1604
Chandler Carruth700d4e42013-01-13 11:46:33 +00001605 return A->getValue();
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001606 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001607
1608 // FIXME: Reject attempts to use -march=native unless the target matches
1609 // the host.
1610 //
1611 // FIXME: We should also incorporate the detected target features for use
1612 // with -native.
1613 std::string CPU = llvm::sys::getHostCPUName();
1614 if (!CPU.empty() && CPU != "generic")
1615 return Args.MakeArgString(CPU);
1616 }
1617
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001618 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1619 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1620 StringRef Arch = A->getValue();
1621 const char *CPU;
1622 if (Triple.getArch() == llvm::Triple::x86) {
1623 CPU = llvm::StringSwitch<const char *>(Arch)
1624 .Case("IA32", "i386")
1625 .Case("SSE", "pentium3")
1626 .Case("SSE2", "pentium4")
1627 .Case("AVX", "sandybridge")
1628 .Case("AVX2", "haswell")
1629 .Default(nullptr);
1630 } else {
1631 CPU = llvm::StringSwitch<const char *>(Arch)
1632 .Case("AVX", "sandybridge")
1633 .Case("AVX2", "haswell")
1634 .Default(nullptr);
1635 }
1636 if (CPU)
1637 return CPU;
1638 }
1639
Chandler Carruth700d4e42013-01-13 11:46:33 +00001640 // Select the default CPU if none was given (or detection failed).
1641
1642 if (Triple.getArch() != llvm::Triple::x86_64 &&
1643 Triple.getArch() != llvm::Triple::x86)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001644 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth700d4e42013-01-13 11:46:33 +00001645
1646 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1647
1648 // FIXME: Need target hooks.
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001649 if (Triple.isOSDarwin()) {
1650 if (Triple.getArchName() == "x86_64h")
1651 return "core-avx2";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001652 return Is64Bit ? "core2" : "yonah";
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001653 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001654
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001655 // Set up default CPU name for PS4 compilers.
1656 if (Triple.isPS4CPU())
1657 return "btver2";
1658
Stephen Hines651f13c2014-04-23 16:59:28 -07001659 // On Android use targets compatible with gcc
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001660 if (Triple.isAndroid())
Stephen Hines651f13c2014-04-23 16:59:28 -07001661 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001662
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001663 // Everything else goes to x86-64 in 64-bit mode.
1664 if (Is64Bit)
1665 return "x86-64";
1666
1667 switch (Triple.getOS()) {
1668 case llvm::Triple::FreeBSD:
1669 case llvm::Triple::NetBSD:
1670 case llvm::Triple::OpenBSD:
1671 return "i486";
1672 case llvm::Triple::Haiku:
1673 return "i586";
1674 case llvm::Triple::Bitrig:
1675 return "i686";
1676 default:
1677 // Fallback to p4.
1678 return "pentium4";
1679 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001680}
1681
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001682/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1683static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1684 // If we have -mcpu=, use that.
1685 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1686 StringRef CPU = A->getValue();
1687
1688#ifdef __wasm__
1689 // Handle "native" by examining the host. "native" isn't meaningful when
1690 // cross compiling, so only support this when the host is also WebAssembly.
1691 if (CPU == "native")
1692 return llvm::sys::getHostCPUName();
1693#endif
1694
1695 return CPU;
1696 }
1697
1698 return "generic";
1699}
1700
1701static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1702 bool FromAs = false) {
1703 switch (T.getArch()) {
Rafael Espindolab330e402013-08-20 22:12:08 +00001704 default:
1705 return "";
1706
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001707 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07001708 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001709 return getAArch64TargetCPU(Args);
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001710
Rafael Espindolab330e402013-08-20 22:12:08 +00001711 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07001712 case llvm::Triple::armeb:
Rafael Espindolab330e402013-08-20 22:12:08 +00001713 case llvm::Triple::thumb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001714 case llvm::Triple::thumbeb: {
1715 StringRef MArch, MCPU;
1716 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
1717 return arm::getARMTargetCPU(MCPU, MArch, T);
1718 }
Rafael Espindolab330e402013-08-20 22:12:08 +00001719 case llvm::Triple::mips:
1720 case llvm::Triple::mipsel:
1721 case llvm::Triple::mips64:
1722 case llvm::Triple::mips64el: {
1723 StringRef CPUName;
1724 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08001725 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindolab330e402013-08-20 22:12:08 +00001726 return CPUName;
1727 }
1728
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001729 case llvm::Triple::nvptx:
1730 case llvm::Triple::nvptx64:
1731 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1732 return A->getValue();
1733 return "";
1734
Rafael Espindolab330e402013-08-20 22:12:08 +00001735 case llvm::Triple::ppc:
1736 case llvm::Triple::ppc64:
1737 case llvm::Triple::ppc64le: {
1738 std::string TargetCPUName = getPPCTargetCPU(Args);
1739 // LLVM may default to generating code for the native CPU,
1740 // but, like gcc, we default to a more generic option for
1741 // each architecture. (except on Darwin)
1742 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1743 if (T.getArch() == llvm::Triple::ppc64)
1744 TargetCPUName = "ppc64";
1745 else if (T.getArch() == llvm::Triple::ppc64le)
1746 TargetCPUName = "ppc64le";
1747 else
1748 TargetCPUName = "ppc";
1749 }
1750 return TargetCPUName;
1751 }
1752
1753 case llvm::Triple::sparc:
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001754 case llvm::Triple::sparcel:
Stephen Hines651f13c2014-04-23 16:59:28 -07001755 case llvm::Triple::sparcv9:
1756 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindolab330e402013-08-20 22:12:08 +00001757 return A->getValue();
1758 return "";
1759
1760 case llvm::Triple::x86:
1761 case llvm::Triple::x86_64:
1762 return getX86TargetCPU(Args, T);
1763
1764 case llvm::Triple::hexagon:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001765 return "hexagon" +
1766 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindolab330e402013-08-20 22:12:08 +00001767
1768 case llvm::Triple::systemz:
1769 return getSystemZTargetCPU(Args);
1770
1771 case llvm::Triple::r600:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001772 case llvm::Triple::amdgcn:
Rafael Espindolab330e402013-08-20 22:12:08 +00001773 return getR600TargetGPU(Args);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001774
1775 case llvm::Triple::wasm32:
1776 case llvm::Triple::wasm64:
1777 return getWebAssemblyTargetCPU(Args);
Rafael Espindolab330e402013-08-20 22:12:08 +00001778 }
1779}
1780
Stephen Hines651f13c2014-04-23 16:59:28 -07001781static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001782 ArgStringList &CmdArgs, bool IsThinLTO) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001783 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1784 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1785 // forward.
1786 CmdArgs.push_back("-plugin");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001787 std::string Plugin =
1788 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Stephen Hines651f13c2014-04-23 16:59:28 -07001789 CmdArgs.push_back(Args.MakeArgString(Plugin));
1790
1791 // Try to pass driver level flags relevant to LTO code generation down to
1792 // the plugin.
1793
1794 // Handle flags for selecting CPU variants.
1795 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1796 if (!CPU.empty())
1797 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001798
1799 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1800 StringRef OOpt;
1801 if (A->getOption().matches(options::OPT_O4) ||
1802 A->getOption().matches(options::OPT_Ofast))
1803 OOpt = "3";
1804 else if (A->getOption().matches(options::OPT_O))
1805 OOpt = A->getValue();
1806 else if (A->getOption().matches(options::OPT_O0))
1807 OOpt = "0";
1808 if (!OOpt.empty())
1809 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1810 }
1811
1812 if (IsThinLTO)
1813 CmdArgs.push_back("-plugin-opt=thinlto");
Stephen Hines651f13c2014-04-23 16:59:28 -07001814}
1815
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001816/// This is a helper function for validating the optional refinement step
1817/// parameter in reciprocal argument strings. Return false if there is an error
1818/// parsing the refinement step. Otherwise, return true and set the Position
1819/// of the refinement step in the input string.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001820static bool getRefinementStep(StringRef In, const Driver &D,
1821 const Arg &A, size_t &Position) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001822 const char RefinementStepToken = ':';
1823 Position = In.find(RefinementStepToken);
1824 if (Position != StringRef::npos) {
1825 StringRef Option = A.getOption().getName();
1826 StringRef RefStep = In.substr(Position + 1);
1827 // Allow exactly one numeric character for the additional refinement
1828 // step parameter. This is reasonable for all currently-supported
1829 // operations and architectures because we would expect that a larger value
1830 // of refinement steps would cause the estimate "optimization" to
1831 // under-perform the native operation. Also, if the estimate does not
1832 // converge quickly, it probably will not ever converge, so further
1833 // refinement steps will not produce a better answer.
1834 if (RefStep.size() != 1) {
1835 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1836 return false;
1837 }
1838 char RefStepChar = RefStep[0];
1839 if (RefStepChar < '0' || RefStepChar > '9') {
1840 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1841 return false;
1842 }
1843 }
1844 return true;
1845}
1846
1847/// The -mrecip flag requires processing of many optional parameters.
1848static void ParseMRecip(const Driver &D, const ArgList &Args,
1849 ArgStringList &OutStrings) {
1850 StringRef DisabledPrefixIn = "!";
1851 StringRef DisabledPrefixOut = "!";
1852 StringRef EnabledPrefixOut = "";
1853 StringRef Out = "-mrecip=";
1854
1855 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1856 if (!A)
1857 return;
1858
1859 unsigned NumOptions = A->getNumValues();
1860 if (NumOptions == 0) {
1861 // No option is the same as "all".
1862 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1863 return;
1864 }
1865
1866 // Pass through "all", "none", or "default" with an optional refinement step.
1867 if (NumOptions == 1) {
1868 StringRef Val = A->getValue(0);
1869 size_t RefStepLoc;
1870 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1871 return;
1872 StringRef ValBase = Val.slice(0, RefStepLoc);
1873 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1874 OutStrings.push_back(Args.MakeArgString(Out + Val));
1875 return;
1876 }
1877 }
1878
1879 // Each reciprocal type may be enabled or disabled individually.
1880 // Check each input value for validity, concatenate them all back together,
1881 // and pass through.
1882
1883 llvm::StringMap<bool> OptionStrings;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001884 OptionStrings.insert(std::make_pair("divd", false));
1885 OptionStrings.insert(std::make_pair("divf", false));
1886 OptionStrings.insert(std::make_pair("vec-divd", false));
1887 OptionStrings.insert(std::make_pair("vec-divf", false));
1888 OptionStrings.insert(std::make_pair("sqrtd", false));
1889 OptionStrings.insert(std::make_pair("sqrtf", false));
1890 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1891 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001892
1893 for (unsigned i = 0; i != NumOptions; ++i) {
1894 StringRef Val = A->getValue(i);
1895
1896 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1897 // Ignore the disablement token for string matching.
1898 if (IsDisabled)
1899 Val = Val.substr(1);
1900
1901 size_t RefStep;
1902 if (!getRefinementStep(Val, D, *A, RefStep))
1903 return;
1904
1905 StringRef ValBase = Val.slice(0, RefStep);
1906 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1907 if (OptionIter == OptionStrings.end()) {
1908 // Try again specifying float suffix.
1909 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1910 if (OptionIter == OptionStrings.end()) {
1911 // The input name did not match any known option string.
1912 D.Diag(diag::err_drv_unknown_argument) << Val;
1913 return;
1914 }
1915 // The option was specified without a float or double suffix.
1916 // Make sure that the double entry was not already specified.
1917 // The float entry will be checked below.
1918 if (OptionStrings[ValBase.str() + 'd']) {
1919 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1920 return;
1921 }
1922 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001923
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001924 if (OptionIter->second == true) {
1925 // Duplicate option specified.
1926 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1927 return;
1928 }
1929
1930 // Mark the matched option as found. Do not allow duplicate specifiers.
1931 OptionIter->second = true;
1932
1933 // If the precision was not specified, also mark the double entry as found.
1934 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1935 OptionStrings[ValBase.str() + 'd'] = true;
1936
1937 // Build the output string.
1938 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1939 Out = Args.MakeArgString(Out + Prefix + Val);
1940 if (i != NumOptions - 1)
1941 Out = Args.MakeArgString(Out + ",");
1942 }
1943
1944 OutStrings.push_back(Args.MakeArgString(Out));
1945}
1946
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001947static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001948 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001949 std::vector<const char *> &Features) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001950 // If -march=native, autodetect the feature list.
1951 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1952 if (StringRef(A->getValue()) == "native") {
1953 llvm::StringMap<bool> HostFeatures;
1954 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1955 for (auto &F : HostFeatures)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001956 Features.push_back(
1957 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07001958 }
1959 }
1960
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001961 if (Triple.getArchName() == "x86_64h") {
1962 // x86_64h implies quite a few of the more modern subtarget features
1963 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1964 Features.push_back("-rdrnd");
1965 Features.push_back("-aes");
1966 Features.push_back("-pclmul");
1967 Features.push_back("-rtm");
1968 Features.push_back("-hle");
1969 Features.push_back("-fsgsbase");
1970 }
1971
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001972 const llvm::Triple::ArchType ArchType = Triple.getArch();
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001973 // Add features to be compatible with gcc for Android.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08001974 if (Triple.isAndroid()) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001975 if (ArchType == llvm::Triple::x86_64) {
Stephen Hinesef822542014-07-21 00:47:37 -07001976 Features.push_back("+sse4.2");
1977 Features.push_back("+popcnt");
1978 } else
1979 Features.push_back("+ssse3");
Stephen Hines651f13c2014-04-23 16:59:28 -07001980 }
1981
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001982 // Set features according to the -arch flag on MSVC.
Stephen Hines176edba2014-12-01 14:53:08 -08001983 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1984 StringRef Arch = A->getValue();
1985 bool ArchUsed = false;
1986 // First, look for flags that are shared in x86 and x86-64.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001987 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Stephen Hines176edba2014-12-01 14:53:08 -08001988 if (Arch == "AVX" || Arch == "AVX2") {
1989 ArchUsed = true;
1990 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1991 }
1992 }
1993 // Then, look for x86-specific flags.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07001994 if (ArchType == llvm::Triple::x86) {
Stephen Hines176edba2014-12-01 14:53:08 -08001995 if (Arch == "IA32") {
1996 ArchUsed = true;
1997 } else if (Arch == "SSE" || Arch == "SSE2") {
1998 ArchUsed = true;
1999 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2000 }
2001 }
2002 if (!ArchUsed)
2003 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2004 }
2005
Jim Grosbach32ca73e2013-11-16 00:53:35 +00002006 // Now add any that the user explicitly requested on the command line,
2007 // which may override the defaults.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002008 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
2009 StringRef Name = A->getOption().getName();
2010 A->claim();
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002011
2012 // Skip over "-m".
2013 assert(Name.startswith("m") && "Invalid feature name.");
2014 Name = Name.substr(1);
2015
2016 bool IsNegative = Name.startswith("no-");
2017 if (IsNegative)
2018 Name = Name.substr(3);
2019
2020 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2021 }
2022}
2023
Daniel Dunbar6acda162009-09-09 22:33:08 +00002024void Clang::AddX86TargetArgs(const ArgList &Args,
2025 ArgStringList &CmdArgs) const {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002026 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00002027 Args.hasArg(options::OPT_mkernel) ||
2028 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002029 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00002030
Bob Wilsonf0c54562013-02-10 16:01:41 +00002031 // Default to avoid implicit floating-point for kernel/kext code, but allow
2032 // that to be overridden with -mno-soft-float.
2033 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2034 Args.hasArg(options::OPT_fapple_kext));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002035 if (Arg *A = Args.getLastArg(
2036 options::OPT_msoft_float, options::OPT_mno_soft_float,
2037 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilsonf0c54562013-02-10 16:01:41 +00002038 const Option &O = A->getOption();
2039 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2040 O.matches(options::OPT_msoft_float));
2041 }
2042 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00002043 CmdArgs.push_back("-no-implicit-float");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002044
2045 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2046 StringRef Value = A->getValue();
2047 if (Value == "intel" || Value == "att") {
2048 CmdArgs.push_back("-mllvm");
2049 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2050 } else {
2051 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2052 << A->getOption().getName() << Value;
2053 }
2054 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00002055}
2056
Tony Linthicum96319392011-12-12 21:14:55 +00002057void Clang::AddHexagonTargetArgs(const ArgList &Args,
2058 ArgStringList &CmdArgs) const {
Matthew Curtis1dbaef52012-12-07 13:52:44 +00002059 CmdArgs.push_back("-mqdsp6-compat");
2060 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00002061
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002062 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2063 std::string N = llvm::utostr(G.getValue());
2064 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
2065 CmdArgs.push_back("-mllvm");
2066 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum96319392011-12-12 21:14:55 +00002067 }
2068
Sirish Pande5f9688b2012-05-10 20:19:54 +00002069 if (!Args.hasArg(options::OPT_fno_short_enums))
2070 CmdArgs.push_back("-fshort-enums");
2071 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002072 CmdArgs.push_back("-mllvm");
2073 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande5f9688b2012-05-10 20:19:54 +00002074 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002075 CmdArgs.push_back("-mllvm");
2076 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum96319392011-12-12 21:14:55 +00002077}
2078
Stephen Hines176edba2014-12-01 14:53:08 -08002079// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
2080static bool DecodeAArch64Features(const Driver &D, StringRef text,
2081 std::vector<const char *> &Features) {
2082 SmallVector<StringRef, 8> Split;
2083 text.split(Split, StringRef("+"), -1, false);
2084
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002085 for (StringRef Feature : Split) {
2086 const char *result = llvm::StringSwitch<const char *>(Feature)
Stephen Hines176edba2014-12-01 14:53:08 -08002087 .Case("fp", "+fp-armv8")
2088 .Case("simd", "+neon")
2089 .Case("crc", "+crc")
2090 .Case("crypto", "+crypto")
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002091 .Case("fp16", "+fullfp16")
2092 .Case("profile", "+spe")
Stephen Hines176edba2014-12-01 14:53:08 -08002093 .Case("nofp", "-fp-armv8")
2094 .Case("nosimd", "-neon")
2095 .Case("nocrc", "-crc")
2096 .Case("nocrypto", "-crypto")
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002097 .Case("nofp16", "-fullfp16")
2098 .Case("noprofile", "-spe")
Stephen Hines176edba2014-12-01 14:53:08 -08002099 .Default(nullptr);
2100 if (result)
2101 Features.push_back(result);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002102 else if (Feature == "neon" || Feature == "noneon")
Stephen Hines176edba2014-12-01 14:53:08 -08002103 D.Diag(diag::err_drv_no_neon_modifier);
2104 else
2105 return false;
2106 }
2107 return true;
2108}
2109
2110// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2111// decode CPU and feature.
2112static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2113 std::vector<const char *> &Features) {
2114 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2115 CPU = Split.first;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002116 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
2117 CPU == "cortex-a72" || CPU == "cortex-a35") {
Stephen Hines176edba2014-12-01 14:53:08 -08002118 Features.push_back("+neon");
2119 Features.push_back("+crc");
2120 Features.push_back("+crypto");
2121 } else if (CPU == "generic") {
2122 Features.push_back("+neon");
2123 } else {
2124 return false;
2125 }
2126
2127 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2128 return false;
2129
2130 return true;
2131}
2132
2133static bool
2134getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2135 const ArgList &Args,
2136 std::vector<const char *> &Features) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002137 std::string MarchLowerCase = March.lower();
2138 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002139
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002140 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002141 // ok, no additional features.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002142 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002143 Features.push_back("+v8.1a");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002144 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2145 Features.push_back("+v8.2a");
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002146 } else {
Stephen Hines176edba2014-12-01 14:53:08 -08002147 return false;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002148 }
Stephen Hines176edba2014-12-01 14:53:08 -08002149
2150 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2151 return false;
2152
2153 return true;
2154}
2155
2156static bool
2157getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2158 const ArgList &Args,
2159 std::vector<const char *> &Features) {
2160 StringRef CPU;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002161 std::string McpuLowerCase = Mcpu.lower();
2162 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Stephen Hines176edba2014-12-01 14:53:08 -08002163 return false;
2164
2165 return true;
2166}
2167
2168static bool
2169getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2170 const ArgList &Args,
2171 std::vector<const char *> &Features) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002172 std::string MtuneLowerCase = Mtune.lower();
Stephen Hines176edba2014-12-01 14:53:08 -08002173 // Handle CPU name is 'native'.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002174 if (MtuneLowerCase == "native")
2175 MtuneLowerCase = llvm::sys::getHostCPUName();
2176 if (MtuneLowerCase == "cyclone") {
Stephen Hines176edba2014-12-01 14:53:08 -08002177 Features.push_back("+zcm");
2178 Features.push_back("+zcz");
2179 }
2180 return true;
2181}
2182
2183static bool
2184getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2185 const ArgList &Args,
2186 std::vector<const char *> &Features) {
2187 StringRef CPU;
2188 std::vector<const char *> DecodedFeature;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002189 std::string McpuLowerCase = Mcpu.lower();
2190 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Stephen Hines176edba2014-12-01 14:53:08 -08002191 return false;
2192
2193 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2194}
2195
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002196static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
2197 std::vector<const char *> &Features) {
Stephen Hines176edba2014-12-01 14:53:08 -08002198 Arg *A;
2199 bool success = true;
2200 // Enable NEON by default.
2201 Features.push_back("+neon");
2202 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2203 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2204 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2205 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
2206 else if (Args.hasArg(options::OPT_arch))
2207 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2208 Features);
2209
2210 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2211 success =
2212 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2213 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2214 success =
2215 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
2216 else if (Args.hasArg(options::OPT_arch))
2217 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2218 Args, Features);
2219
2220 if (!success)
2221 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07002222
2223 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2224 Features.push_back("-fp-armv8");
2225 Features.push_back("-crypto");
2226 Features.push_back("-neon");
2227 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002228
2229 // En/disable crc
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002230 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002231 if (A->getOption().matches(options::OPT_mcrc))
2232 Features.push_back("+crc");
2233 else
2234 Features.push_back("-crc");
2235 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002236
2237 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2238 options::OPT_munaligned_access))
2239 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2240 Features.push_back("+strict-align");
2241
2242 if (Args.hasArg(options::OPT_ffixed_x18))
2243 Features.push_back("+reserve-x18");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002244}
2245
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002246static void getHexagonTargetFeatures(const ArgList &Args,
2247 std::vector<const char *> &Features) {
2248 bool HasHVX = false, HasHVXD = false;
2249
2250 for (auto &A : Args) {
2251 auto &Opt = A->getOption();
2252 if (Opt.matches(options::OPT_mhexagon_hvx))
2253 HasHVX = true;
2254 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2255 HasHVXD = HasHVX = false;
2256 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2257 HasHVXD = HasHVX = true;
2258 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2259 HasHVXD = false;
2260 else
2261 continue;
2262 A->claim();
2263 }
2264
2265 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2266 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2267}
2268
2269static void getWebAssemblyTargetFeatures(const ArgList &Args,
2270 std::vector<const char *> &Features) {
2271 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2272 StringRef Name = A->getOption().getName();
2273 A->claim();
2274
2275 // Skip over "-m".
2276 assert(Name.startswith("m") && "Invalid feature name.");
2277 Name = Name.substr(1);
2278
2279 bool IsNegative = Name.startswith("no-");
2280 if (IsNegative)
2281 Name = Name.substr(3);
2282
2283 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2284 }
2285}
2286
2287static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Stephen Hines651f13c2014-04-23 16:59:28 -07002288 const ArgList &Args, ArgStringList &CmdArgs,
2289 bool ForAS) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002290 const Driver &D = TC.getDriver();
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002291 std::vector<const char *> Features;
2292 switch (Triple.getArch()) {
2293 default:
2294 break;
2295 case llvm::Triple::mips:
2296 case llvm::Triple::mipsel:
2297 case llvm::Triple::mips64:
2298 case llvm::Triple::mips64el:
Stephen Hines176edba2014-12-01 14:53:08 -08002299 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002300 break;
2301
2302 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07002303 case llvm::Triple::armeb:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002304 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07002305 case llvm::Triple::thumbeb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002306 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002307 break;
2308
2309 case llvm::Triple::ppc:
2310 case llvm::Triple::ppc64:
2311 case llvm::Triple::ppc64le:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002312 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002313 break;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002314 case llvm::Triple::systemz:
2315 getSystemZTargetFeatures(Args, Features);
2316 break;
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002317 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07002318 case llvm::Triple::aarch64_be:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002319 getAArch64TargetFeatures(D, Args, Features);
2320 break;
2321 case llvm::Triple::x86:
2322 case llvm::Triple::x86_64:
Stephen Hines176edba2014-12-01 14:53:08 -08002323 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002324 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002325 case llvm::Triple::hexagon:
2326 getHexagonTargetFeatures(Args, Features);
2327 break;
2328 case llvm::Triple::wasm32:
2329 case llvm::Triple::wasm64:
2330 getWebAssemblyTargetFeatures(Args, Features);
2331 break;
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002332 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00002333
2334 // Find the last of each feature.
2335 llvm::StringMap<unsigned> LastOpt;
2336 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2337 const char *Name = Features[I];
2338 assert(Name[0] == '-' || Name[0] == '+');
2339 LastOpt[Name + 1] = I;
2340 }
2341
2342 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2343 // If this feature was overridden, ignore it.
2344 const char *Name = Features[I];
2345 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2346 assert(LastI != LastOpt.end());
2347 unsigned Last = LastI->second;
2348 if (Last != I)
2349 continue;
2350
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002351 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00002352 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002353 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00002354}
2355
Eric Christopher88b7cf02011-08-19 00:30:14 +00002356static bool
John McCall260611a2012-06-20 06:18:46 +00002357shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00002358 const llvm::Triple &Triple) {
2359 // We use the zero-cost exception tables for Objective-C if the non-fragile
2360 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2361 // later.
John McCall260611a2012-06-20 06:18:46 +00002362 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00002363 return true;
2364
Stephen Hines651f13c2014-04-23 16:59:28 -07002365 if (!Triple.isMacOSX())
Anders Carlsson525544d2011-02-28 00:44:51 +00002366 return false;
2367
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002368 return (!Triple.isMacOSXVersionLT(10, 5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00002369 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00002370 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00002371}
2372
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002373/// Adds exception related arguments to the driver command arguments. There's a
2374/// master flag, -fexceptions and also language specific flags to enable/disable
2375/// C++ and Objective-C exceptions. This makes it possible to for example
2376/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlsson15348ae2011-02-28 02:27:16 +00002377static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002378 const ToolChain &TC, bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00002379 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00002380 ArgStringList &CmdArgs) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002381 const Driver &D = TC.getDriver();
2382 const llvm::Triple &Triple = TC.getTriple();
2383
Chad Rosierafc4baa2012-03-26 22:04:46 +00002384 if (KernelOrKext) {
2385 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2386 // arguments now to avoid warnings about unused arguments.
2387 Args.ClaimAllArgs(options::OPT_fexceptions);
2388 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2389 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2390 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2391 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2392 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002393 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00002394 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00002395
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002396 // See if the user explicitly enabled exceptions.
2397 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2398 false);
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00002399
Daniel Dunbard47ea692011-03-17 23:28:31 +00002400 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2401 // is not necessarily sensible, but follows GCC.
2402 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00002403 Args.hasFlag(options::OPT_fobjc_exceptions,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002404 options::OPT_fno_objc_exceptions, true)) {
Daniel Dunbard47ea692011-03-17 23:28:31 +00002405 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00002406
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002407 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002408 }
2409
2410 if (types::isCXX(InputType)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002411 // Disable C++ EH by default on XCore, PS4, and MSVC.
2412 // FIXME: Remove MSVC from this list once things work.
2413 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2414 !Triple.isPS4CPU() &&
2415 !Triple.isWindowsMSVCEnvironment();
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002416 Arg *ExceptionArg = Args.getLastArg(
2417 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2418 options::OPT_fexceptions, options::OPT_fno_exceptions);
2419 if (ExceptionArg)
2420 CXXExceptionsEnabled =
2421 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2422 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00002423
2424 if (CXXExceptionsEnabled) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002425 if (Triple.isPS4CPU()) {
2426 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2427 assert(ExceptionArg &&
2428 "On the PS4 exceptions should only be enabled if passing "
2429 "an argument");
2430 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2431 const Arg *RTTIArg = TC.getRTTIArg();
2432 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2433 D.Diag(diag::err_drv_argument_not_allowed_with)
2434 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2435 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2436 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2437 } else
2438 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2439
Anders Carlsson15348ae2011-02-28 02:27:16 +00002440 CmdArgs.push_back("-fcxx-exceptions");
2441
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002442 EH = true;
Anders Carlsson15348ae2011-02-28 02:27:16 +00002443 }
2444 }
2445
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002446 if (EH)
Anders Carlsson15348ae2011-02-28 02:27:16 +00002447 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00002448}
2449
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002450static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbarf4910132013-04-16 18:21:19 +00002451 bool Default = true;
2452 if (TC.getTriple().isOSDarwin()) {
2453 // The native darwin assembler doesn't support the linker_option directives,
2454 // so we disable them if we think the .s file will be passed to it.
2455 Default = TC.useIntegratedAs();
2456 }
2457 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2458 Default);
2459}
2460
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00002461static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2462 const ToolChain &TC) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002463 bool UseDwarfDirectory =
2464 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2465 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00002466 return !UseDwarfDirectory;
2467}
2468
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002469/// \brief Check whether the given input tree contains any compilation actions.
2470static bool ContainsCompileAction(const Action *A) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002471 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002472 return true;
2473
Stephen Hinesef822542014-07-21 00:47:37 -07002474 for (const auto &Act : *A)
2475 if (ContainsCompileAction(Act))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002476 return true;
2477
2478 return false;
2479}
2480
2481/// \brief Check if -relax-all should be passed to the internal assembler.
2482/// This is done by default when compiling non-assembler source with -O0.
2483static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2484 bool RelaxDefault = true;
2485
2486 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2487 RelaxDefault = A->getOption().matches(options::OPT_O0);
2488
2489 if (RelaxDefault) {
2490 RelaxDefault = false;
Stephen Hinesef822542014-07-21 00:47:37 -07002491 for (const auto &Act : C.getActions()) {
2492 if (ContainsCompileAction(Act)) {
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002493 RelaxDefault = true;
2494 break;
2495 }
2496 }
2497 }
2498
2499 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002500 RelaxDefault);
2501}
2502
2503// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2504// to the corresponding DebugInfoKind.
2505static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2506 assert(A.getOption().matches(options::OPT_gN_Group) &&
2507 "Not a -g option that specifies a debug-info level");
2508 if (A.getOption().matches(options::OPT_g0) ||
2509 A.getOption().matches(options::OPT_ggdb0))
2510 return CodeGenOptions::NoDebugInfo;
2511 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2512 A.getOption().matches(options::OPT_ggdb1))
2513 return CodeGenOptions::DebugLineTablesOnly;
2514 return CodeGenOptions::LimitedDebugInfo;
2515}
2516
2517// Extract the integer N from a string spelled "-dwarf-N", returning 0
2518// on mismatch. The StringRef input (rather than an Arg) allows
2519// for use by the "-Xassembler" option parser.
2520static unsigned DwarfVersionNum(StringRef ArgValue) {
2521 return llvm::StringSwitch<unsigned>(ArgValue)
2522 .Case("-gdwarf-2", 2)
2523 .Case("-gdwarf-3", 3)
2524 .Case("-gdwarf-4", 4)
2525 .Default(0);
2526}
2527
2528static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2529 CodeGenOptions::DebugInfoKind DebugInfoKind,
2530 unsigned DwarfVersion,
2531 llvm::DebuggerKind DebuggerTuning) {
2532 switch (DebugInfoKind) {
2533 case CodeGenOptions::DebugLineTablesOnly:
2534 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2535 break;
2536 case CodeGenOptions::LimitedDebugInfo:
2537 CmdArgs.push_back("-debug-info-kind=limited");
2538 break;
2539 case CodeGenOptions::FullDebugInfo:
2540 CmdArgs.push_back("-debug-info-kind=standalone");
2541 break;
2542 default:
2543 break;
2544 }
2545 if (DwarfVersion > 0)
2546 CmdArgs.push_back(
2547 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
2548 switch (DebuggerTuning) {
2549 case llvm::DebuggerKind::GDB:
2550 CmdArgs.push_back("-debugger-tuning=gdb");
2551 break;
2552 case llvm::DebuggerKind::LLDB:
2553 CmdArgs.push_back("-debugger-tuning=lldb");
2554 break;
2555 case llvm::DebuggerKind::SCE:
2556 CmdArgs.push_back("-debugger-tuning=sce");
2557 break;
2558 default:
2559 break;
2560 }
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00002561}
2562
David Blaikie73168db2013-07-25 21:19:01 +00002563static void CollectArgsForIntegratedAssembler(Compilation &C,
2564 const ArgList &Args,
2565 ArgStringList &CmdArgs,
2566 const Driver &D) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002567 if (UseRelaxAll(C, Args))
2568 CmdArgs.push_back("-mrelax-all");
David Blaikie73168db2013-07-25 21:19:01 +00002569
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002570 // Only default to -mincremental-linker-compatible if we think we are
2571 // targeting the MSVC linker.
2572 bool DefaultIncrementalLinkerCompatible =
2573 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2574 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2575 options::OPT_mno_incremental_linker_compatible,
2576 DefaultIncrementalLinkerCompatible))
2577 CmdArgs.push_back("-mincremental-linker-compatible");
David Peixotto4ca9eae2013-11-14 22:52:58 +00002578
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002579 // When passing -I arguments to the assembler we sometimes need to
2580 // unconditionally take the next argument. For example, when parsing
2581 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2582 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2583 // arg after parsing the '-I' arg.
2584 bool TakeNextArg = false;
David Blaikie73168db2013-07-25 21:19:01 +00002585
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002586 // When using an integrated assembler, translate -Wa, and -Xassembler
2587 // options.
2588 bool CompressDebugSections = false;
2589 for (const Arg *A :
2590 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2591 A->claim();
2592
2593 for (StringRef Value : A->getValues()) {
2594 if (TakeNextArg) {
2595 CmdArgs.push_back(Value.data());
2596 TakeNextArg = false;
2597 continue;
2598 }
2599
2600 switch (C.getDefaultToolChain().getArch()) {
2601 default:
2602 break;
2603 case llvm::Triple::mips:
2604 case llvm::Triple::mipsel:
2605 case llvm::Triple::mips64:
2606 case llvm::Triple::mips64el:
2607 if (Value == "--trap") {
2608 CmdArgs.push_back("-target-feature");
2609 CmdArgs.push_back("+use-tcc-in-div");
David Peixotto4ca9eae2013-11-14 22:52:58 +00002610 continue;
2611 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002612 if (Value == "--break") {
2613 CmdArgs.push_back("-target-feature");
2614 CmdArgs.push_back("-use-tcc-in-div");
2615 continue;
2616 }
2617 if (Value.startswith("-msoft-float")) {
2618 CmdArgs.push_back("-target-feature");
2619 CmdArgs.push_back("+soft-float");
2620 continue;
2621 }
2622 if (Value.startswith("-mhard-float")) {
2623 CmdArgs.push_back("-target-feature");
2624 CmdArgs.push_back("-soft-float");
2625 continue;
2626 }
2627 break;
2628 }
David Blaikie73168db2013-07-25 21:19:01 +00002629
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002630 if (Value == "-force_cpusubtype_ALL") {
2631 // Do nothing, this is the default and we don't support anything else.
2632 } else if (Value == "-L") {
2633 CmdArgs.push_back("-msave-temp-labels");
2634 } else if (Value == "--fatal-warnings") {
2635 CmdArgs.push_back("-massembler-fatal-warnings");
2636 } else if (Value == "--noexecstack") {
2637 CmdArgs.push_back("-mnoexecstack");
2638 } else if (Value == "-compress-debug-sections" ||
2639 Value == "--compress-debug-sections") {
2640 CompressDebugSections = true;
2641 } else if (Value == "-nocompress-debug-sections" ||
2642 Value == "--nocompress-debug-sections") {
2643 CompressDebugSections = false;
2644 } else if (Value.startswith("-I")) {
2645 CmdArgs.push_back(Value.data());
2646 // We need to consume the next argument if the current arg is a plain
2647 // -I. The next arg will be the include directory.
2648 if (Value == "-I")
2649 TakeNextArg = true;
2650 } else if (Value.startswith("-gdwarf-")) {
2651 // "-gdwarf-N" options are not cc1as options.
2652 unsigned DwarfVersion = DwarfVersionNum(Value);
2653 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002654 CmdArgs.push_back(Value.data());
David Blaikie73168db2013-07-25 21:19:01 +00002655 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002656 RenderDebugEnablingArgs(
2657 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2658 llvm::DebuggerKind::Default);
David Blaikie73168db2013-07-25 21:19:01 +00002659 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002660 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2661 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2662 // Do nothing, we'll validate it later.
2663 } else {
2664 D.Diag(diag::err_drv_unsupported_option_argument)
2665 << A->getOption().getName() << Value;
David Blaikie73168db2013-07-25 21:19:01 +00002666 }
2667 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002668 }
2669 if (CompressDebugSections) {
2670 if (llvm::zlib::isAvailable())
2671 CmdArgs.push_back("-compress-debug-sections");
2672 else
2673 D.Diag(diag::warn_debug_compression_unavailable);
2674 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002675}
2676
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002677// This adds the static libclang_rt.builtins-arch.a directly to the command line
Stephen Hines651f13c2014-04-23 16:59:28 -07002678// FIXME: Make sure we can also emit shared objects if they're requested
2679// and available, check for possible errors, etc.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002680static void addClangRT(const ToolChain &TC, const ArgList &Args,
2681 ArgStringList &CmdArgs) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002682 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Stephen Hines651f13c2014-04-23 16:59:28 -07002683}
2684
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002685namespace {
2686enum OpenMPRuntimeKind {
2687 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2688 /// without knowing what runtime to target.
2689 OMPRT_Unknown,
2690
2691 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2692 /// the default for Clang.
2693 OMPRT_OMP,
2694
2695 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2696 /// this runtime but can swallow the pragmas, and find and link against the
2697 /// runtime library itself.
2698 OMPRT_GOMP,
2699
2700 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
2701 /// OpenMP runtime. We support this mode for users with existing dependencies
2702 /// on this runtime library name.
2703 OMPRT_IOMP5
2704};
2705}
2706
2707/// Compute the desired OpenMP runtime from the flag provided.
2708static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2709 const ArgList &Args) {
2710 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2711
2712 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2713 if (A)
2714 RuntimeName = A->getValue();
2715
2716 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002717 .Case("libomp", OMPRT_OMP)
2718 .Case("libgomp", OMPRT_GOMP)
2719 .Case("libiomp5", OMPRT_IOMP5)
2720 .Default(OMPRT_Unknown);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002721
2722 if (RT == OMPRT_Unknown) {
2723 if (A)
2724 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002725 << A->getOption().getName() << A->getValue();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002726 else
2727 // FIXME: We could use a nicer diagnostic here.
2728 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2729 }
2730
2731 return RT;
2732}
2733
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002734static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2735 const ArgList &Args) {
2736 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2737 options::OPT_fno_openmp, false))
2738 return;
2739
2740 switch (getOpenMPRuntime(TC, Args)) {
2741 case OMPRT_OMP:
2742 CmdArgs.push_back("-lomp");
2743 break;
2744 case OMPRT_GOMP:
2745 CmdArgs.push_back("-lgomp");
2746 break;
2747 case OMPRT_IOMP5:
2748 CmdArgs.push_back("-liomp5");
2749 break;
2750 case OMPRT_Unknown:
2751 // Already diagnosed.
2752 break;
2753 }
2754}
2755
Stephen Hines176edba2014-12-01 14:53:08 -08002756static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2757 ArgStringList &CmdArgs, StringRef Sanitizer,
2758 bool IsShared) {
Stephen Hines176edba2014-12-01 14:53:08 -08002759 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournebf548552013-10-20 21:29:13 +00002760 // whole-archive.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002761 if (!IsShared) CmdArgs.push_back("-whole-archive");
2762 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2763 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonov86143042013-02-27 11:14:55 +00002764}
2765
Stephen Hines176edba2014-12-01 14:53:08 -08002766// Tries to use a file with the list of dynamic symbols that need to be exported
2767// from the runtime library. Returns true if the file was found.
2768static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2769 ArgStringList &CmdArgs,
2770 StringRef Sanitizer) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002771 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002772 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2773 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Stephen Hines176edba2014-12-01 14:53:08 -08002774 return true;
2775 }
2776 return false;
2777}
2778
2779static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2780 ArgStringList &CmdArgs) {
2781 // Force linking against the system libraries sanitizers depends on
2782 // (see PR15823 why this is necessary).
2783 CmdArgs.push_back("--no-as-needed");
2784 CmdArgs.push_back("-lpthread");
2785 CmdArgs.push_back("-lrt");
2786 CmdArgs.push_back("-lm");
2787 // There's no libdl on FreeBSD.
2788 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2789 CmdArgs.push_back("-ldl");
2790}
2791
2792static void
2793collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2794 SmallVectorImpl<StringRef> &SharedRuntimes,
2795 SmallVectorImpl<StringRef> &StaticRuntimes,
2796 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2797 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2798 // Collect shared runtimes.
2799 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2800 SharedRuntimes.push_back("asan");
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00002801 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002802
Stephen Hines176edba2014-12-01 14:53:08 -08002803 // Collect static runtimes.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002804 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Stephen Hines176edba2014-12-01 14:53:08 -08002805 // Don't link static runtimes into DSOs or if compiling for Android.
Stephen Hines651f13c2014-04-23 16:59:28 -07002806 return;
Stephen Hines176edba2014-12-01 14:53:08 -08002807 }
2808 if (SanArgs.needsAsanRt()) {
2809 if (SanArgs.needsSharedAsanRt()) {
2810 HelperStaticRuntimes.push_back("asan-preinit");
2811 } else {
2812 StaticRuntimes.push_back("asan");
2813 if (SanArgs.linkCXXRuntimes())
2814 StaticRuntimes.push_back("asan_cxx");
2815 }
2816 }
2817 if (SanArgs.needsDfsanRt())
2818 StaticRuntimes.push_back("dfsan");
2819 if (SanArgs.needsLsanRt())
2820 StaticRuntimes.push_back("lsan");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002821 if (SanArgs.needsMsanRt()) {
Stephen Hines176edba2014-12-01 14:53:08 -08002822 StaticRuntimes.push_back("msan");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002823 if (SanArgs.linkCXXRuntimes())
2824 StaticRuntimes.push_back("msan_cxx");
2825 }
2826 if (SanArgs.needsTsanRt()) {
Stephen Hines176edba2014-12-01 14:53:08 -08002827 StaticRuntimes.push_back("tsan");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002828 if (SanArgs.linkCXXRuntimes())
2829 StaticRuntimes.push_back("tsan_cxx");
2830 }
Stephen Hines176edba2014-12-01 14:53:08 -08002831 if (SanArgs.needsUbsanRt()) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07002832 StaticRuntimes.push_back("ubsan_standalone");
2833 if (SanArgs.linkCXXRuntimes())
2834 StaticRuntimes.push_back("ubsan_standalone_cxx");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002835 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002836 if (SanArgs.needsSafeStackRt())
2837 StaticRuntimes.push_back("safestack");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002838 if (SanArgs.needsCfiRt())
2839 StaticRuntimes.push_back("cfi");
2840 if (SanArgs.needsCfiDiagRt())
2841 StaticRuntimes.push_back("cfi_diag");
Kostya Serebryanydff466c2011-11-30 01:39:16 +00002842}
2843
Stephen Hines176edba2014-12-01 14:53:08 -08002844// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2845// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2846static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Stephen Hines651f13c2014-04-23 16:59:28 -07002847 ArgStringList &CmdArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08002848 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2849 HelperStaticRuntimes;
2850 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2851 HelperStaticRuntimes);
2852 for (auto RT : SharedRuntimes)
2853 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2854 for (auto RT : HelperStaticRuntimes)
2855 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2856 bool AddExportDynamic = false;
2857 for (auto RT : StaticRuntimes) {
2858 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2859 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2860 }
2861 // If there is a static runtime with no dynamic list, force all the symbols
2862 // to be dynamic to be sure we export sanitizer interface functions.
2863 if (AddExportDynamic)
2864 CmdArgs.push_back("-export-dynamic");
2865 return !StaticRuntimes.empty();
Peter Collingbourne2eeed712013-08-07 22:47:34 +00002866}
2867
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002868static bool areOptimizationsEnabled(const ArgList &Args) {
2869 // Find the last -O arg and see if it is non-zero.
2870 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2871 return !A->getOption().matches(options::OPT_O0);
2872 // Defaults to -O0.
2873 return false;
2874}
2875
Benjamin Kramer5322a552013-10-16 17:42:39 +00002876static bool shouldUseFramePointerForTarget(const ArgList &Args,
2877 const llvm::Triple &Triple) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002878 switch (Triple.getArch()) {
2879 case llvm::Triple::xcore:
2880 case llvm::Triple::wasm32:
2881 case llvm::Triple::wasm64:
2882 // XCore never wants frame pointers, regardless of OS.
2883 // WebAssembly never wants frame pointers.
Benjamin Kramer5322a552013-10-16 17:42:39 +00002884 return false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002885 default:
2886 break;
Benjamin Kramer5322a552013-10-16 17:42:39 +00002887 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002888
2889 if (Triple.isOSLinux()) {
2890 switch (Triple.getArch()) {
2891 // Don't use a frame pointer on linux if optimizing for certain targets.
2892 case llvm::Triple::mips64:
2893 case llvm::Triple::mips64el:
2894 case llvm::Triple::mips:
2895 case llvm::Triple::mipsel:
2896 case llvm::Triple::systemz:
2897 case llvm::Triple::x86:
2898 case llvm::Triple::x86_64:
2899 return !areOptimizationsEnabled(Args);
2900 default:
2901 return true;
2902 }
2903 }
2904
2905 if (Triple.isOSWindows()) {
2906 switch (Triple.getArch()) {
2907 case llvm::Triple::x86:
2908 return !areOptimizationsEnabled(Args);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002909 case llvm::Triple::arm:
2910 case llvm::Triple::thumb:
2911 // Windows on ARM builds with FPO disabled to aid fast stack walking
2912 return true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002913 default:
2914 // All other supported Windows ISAs use xdata unwind information, so frame
2915 // pointers are not generally useful.
2916 return false;
2917 }
2918 }
2919
2920 return true;
Benjamin Kramer5322a552013-10-16 17:42:39 +00002921}
2922
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002923static bool shouldUseFramePointer(const ArgList &Args,
2924 const llvm::Triple &Triple) {
2925 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2926 options::OPT_fomit_frame_pointer))
2927 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002928 if (Args.hasArg(options::OPT_pg))
2929 return true;
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002930
Benjamin Kramer5322a552013-10-16 17:42:39 +00002931 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002932}
2933
Eric Christopherd3e22df2013-04-03 01:58:53 +00002934static bool shouldUseLeafFramePointer(const ArgList &Args,
2935 const llvm::Triple &Triple) {
2936 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2937 options::OPT_momit_leaf_frame_pointer))
2938 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002939 if (Args.hasArg(options::OPT_pg))
2940 return true;
Eric Christopherd3e22df2013-04-03 01:58:53 +00002941
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002942 if (Triple.isPS4CPU())
2943 return false;
2944
Benjamin Kramer5322a552013-10-16 17:42:39 +00002945 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00002946}
2947
Rafael Espindolaa2148242013-08-10 01:40:10 +00002948/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00002949static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00002950 SmallString<128> cwd;
2951 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00002952 CmdArgs.push_back("-fdebug-compilation-dir");
2953 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00002954 }
2955}
2956
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002957static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopher80190392013-02-22 20:12:52 +00002958 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2959 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2960 SmallString<128> T(FinalOutput->getValue());
2961 llvm::sys::path::replace_extension(T, "dwo");
2962 return Args.MakeArgString(T);
2963 } else {
2964 // Use the compilation dir.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002965 SmallString<128> T(
2966 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07002967 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopher80190392013-02-22 20:12:52 +00002968 llvm::sys::path::replace_extension(F, "dwo");
2969 T += F;
2970 return Args.MakeArgString(F);
2971 }
2972}
2973
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002974static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2975 const JobAction &JA, const ArgList &Args,
2976 const InputInfo &Output, const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00002977 ArgStringList ExtractArgs;
2978 ExtractArgs.push_back("--extract-dwo");
2979
2980 ArgStringList StripArgs;
2981 StripArgs.push_back("--strip-dwo");
2982
2983 // Grabbing the output of the earlier compile step.
2984 StripArgs.push_back(Output.getFilename());
2985 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00002986 ExtractArgs.push_back(OutFile);
2987
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002988 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
2989 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00002990
2991 // First extract the dwo sections.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002992 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher59320e72013-02-21 22:35:01 +00002993
2994 // Then remove them from the original .o file.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08002995 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher59320e72013-02-21 22:35:01 +00002996}
2997
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002998/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002999/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3000static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003001 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00003002 if (A->getOption().matches(options::OPT_O4) ||
3003 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003004 return true;
3005
3006 if (A->getOption().matches(options::OPT_O0))
3007 return false;
3008
3009 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3010
Rafael Espindola168de192013-08-26 14:05:41 +00003011 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003012 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00003013 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003014 return true;
3015
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003016 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003017 if (S == "z")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003018 return isSlpVec;
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003019
3020 unsigned OptLevel = 0;
3021 if (S.getAsInteger(10, OptLevel))
3022 return false;
3023
3024 return OptLevel > 1;
3025 }
3026
3027 return false;
3028}
3029
Stephen Hines651f13c2014-04-23 16:59:28 -07003030/// Add -x lang to \p CmdArgs for \p Input.
3031static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3032 ArgStringList &CmdArgs) {
3033 // When using -verify-pch, we don't want to provide the type
3034 // 'precompiled-header' if it was inferred from the file extension
3035 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3036 return;
3037
3038 CmdArgs.push_back("-x");
3039 if (Args.hasArg(options::OPT_rewrite_objc))
3040 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3041 else
3042 CmdArgs.push_back(types::getTypeName(Input.getType()));
3043}
3044
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003045static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Stephen Hines176edba2014-12-01 14:53:08 -08003046 if (Version < 100)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003047 return VersionTuple(Version);
Stephen Hines176edba2014-12-01 14:53:08 -08003048
3049 if (Version < 10000)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003050 return VersionTuple(Version / 100, Version % 100);
Stephen Hines176edba2014-12-01 14:53:08 -08003051
3052 unsigned Build = 0, Factor = 1;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003053 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Stephen Hines176edba2014-12-01 14:53:08 -08003054 Build = Build + (Version % 10) * Factor;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003055 return VersionTuple(Version / 100, Version % 100, Build);
Stephen Hines176edba2014-12-01 14:53:08 -08003056}
3057
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003058// Claim options we don't want to warn if they are unused. We do this for
3059// options that build systems might add but are unused when assembling or only
3060// running the preprocessor for example.
3061static void claimNoWarnArgs(const ArgList &Args) {
3062 // Don't warn about unused -f(no-)?lto. This can happen when we're
3063 // preprocessing, precompiling or assembling.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003064 Args.ClaimAllArgs(options::OPT_flto_EQ);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003065 Args.ClaimAllArgs(options::OPT_flto);
3066 Args.ClaimAllArgs(options::OPT_fno_lto);
3067}
3068
3069static void appendUserToPath(SmallVectorImpl<char> &Result) {
3070#ifdef LLVM_ON_UNIX
3071 const char *Username = getenv("LOGNAME");
3072#else
3073 const char *Username = getenv("USERNAME");
3074#endif
3075 if (Username) {
3076 // Validate that LoginName can be used in a path, and get its length.
3077 size_t Len = 0;
3078 for (const char *P = Username; *P; ++P, ++Len) {
3079 if (!isAlphanumeric(*P) && *P != '_') {
3080 Username = nullptr;
3081 break;
3082 }
3083 }
3084
3085 if (Username && Len > 0) {
3086 Result.append(Username, Username + Len);
3087 return;
3088 }
3089 }
3090
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003091// Fallback to user id.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003092#ifdef LLVM_ON_UNIX
3093 std::string UID = llvm::utostr(getuid());
3094#else
3095 // FIXME: Windows seems to have an 'SID' that might work.
3096 std::string UID = "9999";
3097#endif
3098 Result.append(UID.begin(), UID.end());
3099}
3100
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003101VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3102 const llvm::Triple &Triple,
3103 const llvm::opt::ArgList &Args,
3104 bool IsWindowsMSVC) {
3105 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3106 IsWindowsMSVC) ||
3107 Args.hasArg(options::OPT_fmsc_version) ||
3108 Args.hasArg(options::OPT_fms_compatibility_version)) {
3109 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3110 const Arg *MSCompatibilityVersion =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003111 Args.getLastArg(options::OPT_fms_compatibility_version);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003112
3113 if (MSCVersion && MSCompatibilityVersion) {
3114 if (D)
3115 D->Diag(diag::err_drv_argument_not_allowed_with)
3116 << MSCVersion->getAsString(Args)
3117 << MSCompatibilityVersion->getAsString(Args);
3118 return VersionTuple();
3119 }
3120
3121 if (MSCompatibilityVersion) {
3122 VersionTuple MSVT;
3123 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3124 D->Diag(diag::err_drv_invalid_value)
3125 << MSCompatibilityVersion->getAsString(Args)
3126 << MSCompatibilityVersion->getValue();
3127 return MSVT;
3128 }
3129
3130 if (MSCVersion) {
3131 unsigned Version = 0;
3132 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3133 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3134 << MSCVersion->getValue();
3135 return getMSCompatibilityVersion(Version);
3136 }
3137
3138 unsigned Major, Minor, Micro;
3139 Triple.getEnvironmentVersion(Major, Minor, Micro);
3140 if (Major || Minor || Micro)
3141 return VersionTuple(Major, Minor, Micro);
3142
3143 return VersionTuple(18);
3144 }
3145 return VersionTuple();
3146}
3147
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003148static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3149 const InputInfo &Output, const ArgList &Args,
3150 ArgStringList &CmdArgs) {
3151 auto *ProfileGenerateArg = Args.getLastArg(
3152 options::OPT_fprofile_instr_generate,
3153 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
3154 options::OPT_fprofile_generate_EQ,
3155 options::OPT_fno_profile_instr_generate);
3156 if (ProfileGenerateArg &&
3157 ProfileGenerateArg->getOption().matches(
3158 options::OPT_fno_profile_instr_generate))
3159 ProfileGenerateArg = nullptr;
3160
3161 auto *ProfileUseArg = Args.getLastArg(
3162 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
3163 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3164 options::OPT_fno_profile_instr_use);
3165 if (ProfileUseArg &&
3166 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3167 ProfileUseArg = nullptr;
3168
3169 if (ProfileGenerateArg && ProfileUseArg)
3170 D.Diag(diag::err_drv_argument_not_allowed_with)
3171 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
3172
3173 if (ProfileGenerateArg) {
3174 if (ProfileGenerateArg->getOption().matches(
3175 options::OPT_fprofile_instr_generate_EQ))
3176 ProfileGenerateArg->render(Args, CmdArgs);
3177 else if (ProfileGenerateArg->getOption().matches(
3178 options::OPT_fprofile_generate_EQ)) {
3179 SmallString<128> Path(ProfileGenerateArg->getValue());
3180 llvm::sys::path::append(Path, "default.profraw");
3181 CmdArgs.push_back(
3182 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3183 } else
3184 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3185 }
3186
3187 if (ProfileUseArg) {
3188 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3189 ProfileUseArg->render(Args, CmdArgs);
3190 else if ((ProfileUseArg->getOption().matches(
3191 options::OPT_fprofile_use_EQ) ||
3192 ProfileUseArg->getOption().matches(
3193 options::OPT_fprofile_instr_use))) {
3194 SmallString<128> Path(
3195 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3196 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3197 llvm::sys::path::append(Path, "default.profdata");
3198 CmdArgs.push_back(
3199 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3200 }
3201 }
3202
3203 if (Args.hasArg(options::OPT_ftest_coverage) ||
3204 Args.hasArg(options::OPT_coverage))
3205 CmdArgs.push_back("-femit-coverage-notes");
3206 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3207 false) ||
3208 Args.hasArg(options::OPT_coverage))
3209 CmdArgs.push_back("-femit-coverage-data");
3210
3211 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3212 options::OPT_fno_coverage_mapping, false) &&
3213 !ProfileGenerateArg)
3214 D.Diag(diag::err_drv_argument_only_allowed_with)
3215 << "-fcoverage-mapping"
3216 << "-fprofile-instr-generate";
3217
3218 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3219 options::OPT_fno_coverage_mapping, false))
3220 CmdArgs.push_back("-fcoverage-mapping");
3221
3222 if (C.getArgs().hasArg(options::OPT_c) ||
3223 C.getArgs().hasArg(options::OPT_S)) {
3224 if (Output.isFilename()) {
3225 CmdArgs.push_back("-coverage-file");
3226 SmallString<128> CoverageFilename;
3227 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3228 CoverageFilename = FinalOutput->getValue();
3229 } else {
3230 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3231 }
3232 if (llvm::sys::path::is_relative(CoverageFilename)) {
3233 SmallString<128> Pwd;
3234 if (!llvm::sys::fs::current_path(Pwd)) {
3235 llvm::sys::path::append(Pwd, CoverageFilename);
3236 CoverageFilename.swap(Pwd);
3237 }
3238 }
3239 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3240 }
3241 }
3242}
3243
3244static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3245 ArgStringList &CmdArgs) {
3246 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3247 false) ||
3248 Args.hasFlag(options::OPT_fprofile_generate,
3249 options::OPT_fno_profile_instr_generate, false) ||
3250 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3251 options::OPT_fno_profile_instr_generate, false) ||
3252 Args.hasFlag(options::OPT_fprofile_instr_generate,
3253 options::OPT_fno_profile_instr_generate, false) ||
3254 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3255 options::OPT_fno_profile_instr_generate, false) ||
3256 Args.hasArg(options::OPT_fcreate_profile) ||
3257 Args.hasArg(options::OPT_coverage)))
3258 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3259}
3260
3261/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3262/// smooshes them together with platform defaults, to decide whether
3263/// this compile should be using PIC mode or not. Returns a tuple of
3264/// (RelocationModel, PICLevel, IsPIE).
3265static std::tuple<llvm::Reloc::Model, unsigned, bool>
3266ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3267 const ArgList &Args) {
3268 // FIXME: why does this code...and so much everywhere else, use both
3269 // ToolChain.getTriple() and Triple?
3270 bool PIE = ToolChain.isPIEDefault();
3271 bool PIC = PIE || ToolChain.isPICDefault();
3272 // The Darwin default to use PIC does not apply when using -static.
3273 if (ToolChain.getTriple().isOSDarwin() && Args.hasArg(options::OPT_static))
3274 PIE = PIC = false;
3275 bool IsPICLevelTwo = PIC;
3276
3277 bool KernelOrKext =
3278 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3279
3280 // Android-specific defaults for PIC/PIE
3281 if (ToolChain.getTriple().isAndroid()) {
3282 switch (ToolChain.getArch()) {
3283 case llvm::Triple::arm:
3284 case llvm::Triple::armeb:
3285 case llvm::Triple::thumb:
3286 case llvm::Triple::thumbeb:
3287 case llvm::Triple::aarch64:
3288 case llvm::Triple::mips:
3289 case llvm::Triple::mipsel:
3290 case llvm::Triple::mips64:
3291 case llvm::Triple::mips64el:
3292 PIC = true; // "-fpic"
3293 break;
3294
3295 case llvm::Triple::x86:
3296 case llvm::Triple::x86_64:
3297 PIC = true; // "-fPIC"
3298 IsPICLevelTwo = true;
3299 break;
3300
3301 default:
3302 break;
3303 }
3304 }
3305
3306 // OpenBSD-specific defaults for PIE
3307 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3308 switch (ToolChain.getArch()) {
3309 case llvm::Triple::mips64:
3310 case llvm::Triple::mips64el:
3311 case llvm::Triple::sparcel:
3312 case llvm::Triple::x86:
3313 case llvm::Triple::x86_64:
3314 IsPICLevelTwo = false; // "-fpie"
3315 break;
3316
3317 case llvm::Triple::ppc:
3318 case llvm::Triple::sparc:
3319 case llvm::Triple::sparcv9:
3320 IsPICLevelTwo = true; // "-fPIE"
3321 break;
3322
3323 default:
3324 break;
3325 }
3326 }
3327
3328 // The last argument relating to either PIC or PIE wins, and no
3329 // other argument is used. If the last argument is any flavor of the
3330 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3331 // option implicitly enables PIC at the same level.
3332 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3333 options::OPT_fpic, options::OPT_fno_pic,
3334 options::OPT_fPIE, options::OPT_fno_PIE,
3335 options::OPT_fpie, options::OPT_fno_pie);
3336 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3337 // is forced, then neither PIC nor PIE flags will have no effect.
3338 if (!ToolChain.isPICDefaultForced()) {
3339 if (LastPICArg) {
3340 Option O = LastPICArg->getOption();
3341 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3342 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3343 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3344 PIC =
3345 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3346 IsPICLevelTwo =
3347 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3348 } else {
3349 PIE = PIC = false;
3350 if (Triple.isPS4CPU()) {
3351 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3352 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3353 if (Model != "kernel") {
3354 PIC = true;
3355 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3356 << LastPICArg->getSpelling();
3357 }
3358 }
3359 }
3360 }
3361 }
3362
3363 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3364 // PIC level would've been set to level 1, force it back to level 2 PIC
3365 // instead.
3366 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
3367 IsPICLevelTwo |= ToolChain.isPICDefault();
3368
3369 // This kernel flags are a trump-card: they will disable PIC/PIE
3370 // generation, independent of the argument order.
3371 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3372 !Triple.isWatchOS()))
3373 PIC = PIE = false;
3374
3375 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3376 // This is a very special mode. It trumps the other modes, almost no one
3377 // uses it, and it isn't even valid on any OS but Darwin.
3378 if (!ToolChain.getTriple().isOSDarwin())
3379 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3380 << A->getSpelling() << ToolChain.getTriple().str();
3381
3382 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3383
3384 // Only a forced PIC mode can cause the actual compile to have PIC defines
3385 // etc., no flags are sufficient. This behavior was selected to closely
3386 // match that of llvm-gcc and Apple GCC before that.
3387 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3388
3389 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3390 }
3391
3392 if (PIC)
3393 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3394
3395 return std::make_tuple(llvm::Reloc::Static, 0, false);
3396}
3397
3398static const char *RelocationModelName(llvm::Reloc::Model Model) {
3399 switch (Model) {
3400 case llvm::Reloc::Default:
3401 return nullptr;
3402 case llvm::Reloc::Static:
3403 return "static";
3404 case llvm::Reloc::PIC_:
3405 return "pic";
3406 case llvm::Reloc::DynamicNoPIC:
3407 return "dynamic-no-pic";
3408 }
3409 llvm_unreachable("Unknown Reloc::Model kind");
3410}
3411
3412static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3413 ArgStringList &CmdArgs) {
3414 llvm::Reloc::Model RelocationModel;
3415 unsigned PICLevel;
3416 bool IsPIE;
3417 std::tie(RelocationModel, PICLevel, IsPIE) =
3418 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3419
3420 if (RelocationModel != llvm::Reloc::Static)
3421 CmdArgs.push_back("-KPIC");
3422}
3423
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003424void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003425 const InputInfo &Output, const InputInfoList &Inputs,
3426 const ArgList &Args, const char *LinkingOutput) const {
3427 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3428 const llvm::Triple Triple(TripleStr);
3429
3430 bool KernelOrKext =
3431 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00003432 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003433 ArgStringList CmdArgs;
3434
Stephen Hines651f13c2014-04-23 16:59:28 -07003435 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003436 bool IsWindowsCygnus =
3437 getToolChain().getTriple().isWindowsCygwinEnvironment();
Stephen Hines651f13c2014-04-23 16:59:28 -07003438 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003439 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Stephen Hines651f13c2014-04-23 16:59:28 -07003440
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003441 // Check number of inputs for sanity. We need at least one input.
3442 assert(Inputs.size() >= 1 && "Must have at least one input.");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003443 const InputInfo &Input = Inputs[0];
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003444 // CUDA compilation may have multiple inputs (source file + results of
3445 // device-side compilations). All other jobs are expected to have exactly one
3446 // input.
3447 bool IsCuda = types::isCuda(Input.getType());
3448 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00003449
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003450 // Invoke ourselves in -cc1 mode.
3451 //
3452 // FIXME: Implement custom jobs for internal actions.
3453 CmdArgs.push_back("-cc1");
3454
Daniel Dunbardd4fe002009-10-30 18:12:20 +00003455 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00003456 CmdArgs.push_back("-triple");
Daniel Dunbardd4fe002009-10-30 18:12:20 +00003457 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00003458
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003459 const ToolChain *AuxToolChain = nullptr;
3460 if (IsCuda) {
3461 // FIXME: We need a (better) way to pass information about
3462 // particular compilation pass we're constructing here. For now we
3463 // can check which toolchain we're using and pick the other one to
3464 // extract the triple.
3465 if (&getToolChain() == C.getCudaDeviceToolChain())
3466 AuxToolChain = C.getCudaHostToolChain();
3467 else if (&getToolChain() == C.getCudaHostToolChain())
3468 AuxToolChain = C.getCudaDeviceToolChain();
3469 else
3470 llvm_unreachable("Can't figure out CUDA compilation mode.");
3471 assert(AuxToolChain != nullptr && "No aux toolchain.");
3472 CmdArgs.push_back("-aux-triple");
3473 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3474 CmdArgs.push_back("-fcuda-target-overloads");
3475 CmdArgs.push_back("-fcuda-disable-target-call-checks");
3476 }
3477
3478 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3479 Triple.getArch() == llvm::Triple::thumb)) {
3480 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003481 unsigned Version;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003482 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003483 if (Version < 7)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003484 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003485 << TripleStr;
3486 }
3487
Stephen Hines651f13c2014-04-23 16:59:28 -07003488 // Push all default warning arguments that are specific to
3489 // the given target. These come before user provided warning options
3490 // are provided.
3491 getToolChain().addClangWarningOptions(CmdArgs);
3492
Daniel Dunbardd4fe002009-10-30 18:12:20 +00003493 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00003494 RewriteKind rewriteKind = RK_None;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003495
Daniel Dunbar1d460332009-03-18 10:01:51 +00003496 if (isa<AnalyzeJobAction>(JA)) {
3497 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3498 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00003499 } else if (isa<MigrateJobAction>(JA)) {
3500 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003501 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003502 if (Output.getType() == types::TY_Dependencies)
3503 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00003504 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003505 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00003506 if (Args.hasArg(options::OPT_rewrite_objc) &&
3507 !Args.hasArg(options::OPT_g_Group))
3508 CmdArgs.push_back("-P");
3509 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00003510 } else if (isa<AssembleJobAction>(JA)) {
3511 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00003512
David Blaikie73168db2013-07-25 21:19:01 +00003513 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00003514
3515 // Also ignore explicit -force_cpusubtype_ALL option.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003516 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003517 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00003518 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00003519 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00003520
Aaron Ballman761322b2012-07-31 01:21:00 +00003521 if (JA.getType() == types::TY_Nothing)
3522 CmdArgs.push_back("-fsyntax-only");
3523 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00003524 CmdArgs.push_back("-emit-pch");
3525 else
3526 CmdArgs.push_back("-emit-pth");
Stephen Hines651f13c2014-04-23 16:59:28 -07003527 } else if (isa<VerifyPCHJobAction>(JA)) {
3528 CmdArgs.push_back("-verify-pch");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003529 } else {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003530 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3531 "Invalid action for clang tool.");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003532 if (JA.getType() == types::TY_Nothing) {
3533 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003534 } else if (JA.getType() == types::TY_LLVM_IR ||
3535 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00003536 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00003537 } else if (JA.getType() == types::TY_LLVM_BC ||
3538 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00003539 CmdArgs.push_back("-emit-llvm-bc");
3540 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00003541 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00003542 } else if (JA.getType() == types::TY_AST) {
3543 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00003544 } else if (JA.getType() == types::TY_ModuleFile) {
3545 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00003546 } else if (JA.getType() == types::TY_RewrittenObjC) {
3547 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00003548 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00003549 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3550 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00003551 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00003552 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003553 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003554 }
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07003555
3556 // Preserve use-list order by default when emitting bitcode, so that
3557 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3558 // same result as running passes here. For LTO, we don't need to preserve
3559 // the use-list order, since serialization to bitcode is part of the flow.
3560 if (JA.getType() == types::TY_LLVM_BC)
3561 CmdArgs.push_back("-emit-llvm-uselists");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003562
3563 if (D.isUsingLTO())
3564 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
3565 }
3566
3567 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3568 if (!types::isLLVMIR(Input.getType()))
3569 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3570 << "-x ir";
3571 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003572 }
3573
Stephen Hinesef822542014-07-21 00:47:37 -07003574 // We normally speed up the clang process a bit by skipping destructors at
3575 // exit, but when we're generating diagnostics we can rely on some of the
3576 // cleanup.
3577 if (!C.isForDiagnostics())
3578 CmdArgs.push_back("-disable-free");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003579
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003580// Disable the verification pass in -asserts builds.
John McCallb689afb2010-02-13 03:50:24 +00003581#ifdef NDEBUG
3582 CmdArgs.push_back("-disable-llvm-verifier");
3583#endif
3584
Daniel Dunbarc9abc042009-04-08 05:11:16 +00003585 // Set the main file name, so that debug info works even with
3586 // -save-temps.
3587 CmdArgs.push_back("-main-file-name");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003588 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00003589
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00003590 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00003591 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00003592 if (Args.hasArg(options::OPT_static))
3593 CmdArgs.push_back("-static-define");
3594
Daniel Dunbar1d460332009-03-18 10:01:51 +00003595 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00003596 // Enable region store model by default.
3597 CmdArgs.push_back("-analyzer-store=region");
3598
Ted Kremenekb40d06d2009-12-07 22:26:14 +00003599 // Treat blocks as analysis entry points.
3600 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3601
Ted Kremenek51885072011-03-24 00:28:47 +00003602 CmdArgs.push_back("-analyzer-eagerly-assume");
3603
Daniel Dunbar1d460332009-03-18 10:01:51 +00003604 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00003605 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00003606 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00003607
Stephen Hines651f13c2014-04-23 16:59:28 -07003608 if (!IsWindowsMSVC)
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00003609 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00003610
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00003611 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00003612 CmdArgs.push_back("-analyzer-checker=osx");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003613
Ted Kremeneka8180e52012-01-20 06:00:17 +00003614 CmdArgs.push_back("-analyzer-checker=deadcode");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003615
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003616 if (types::isCXX(Input.getType()))
Jordan Rosee449edc2013-04-05 17:55:07 +00003617 CmdArgs.push_back("-analyzer-checker=cplusplus");
3618
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003619 // Enable the following experimental checkers for testing.
3620 CmdArgs.push_back(
3621 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek8dc05062012-01-26 02:27:38 +00003622 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3623 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003624 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek8dc05062012-01-26 02:27:38 +00003625 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3626 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003627
3628 // Default nullability checks.
3629 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3630 CmdArgs.push_back(
3631 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00003632 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003633
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00003634 // Set the output format. The default is plist, for (lame) historical
3635 // reasons.
3636 CmdArgs.push_back("-analyzer-output");
3637 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00003638 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00003639 else
3640 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00003641
Ted Kremenek0647a7b2010-03-22 22:32:05 +00003642 // Disable the presentation of standard compiler warnings when
3643 // using --analyze. We only want to show static analyzer diagnostics
3644 // or frontend errors.
3645 CmdArgs.push_back("-w");
3646
Daniel Dunbar1d460332009-03-18 10:01:51 +00003647 // Add -Xanalyzer arguments when running as analyzer.
3648 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00003649 }
3650
Daniel Dunbare2fd6642009-09-10 01:21:12 +00003651 CheckCodeGenerationOptions(D, Args);
3652
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003653 llvm::Reloc::Model RelocationModel;
3654 unsigned PICLevel;
3655 bool IsPIE;
3656 std::tie(RelocationModel, PICLevel, IsPIE) =
3657 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00003658
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003659 const char *RMName = RelocationModelName(RelocationModel);
3660 if (RMName) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003661 CmdArgs.push_back("-mrelocation-model");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003662 CmdArgs.push_back(RMName);
3663 }
3664 if (PICLevel > 0) {
3665 CmdArgs.push_back("-pic-level");
3666 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3667 if (IsPIE) {
3668 CmdArgs.push_back("-pie-level");
3669 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00003670 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003671 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00003672
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003673 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3674 CmdArgs.push_back("-meabi");
3675 CmdArgs.push_back(A->getValue());
Daniel Dunbarbc85be82009-04-29 18:32:25 +00003676 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00003677
Stephen Hines176edba2014-12-01 14:53:08 -08003678 CmdArgs.push_back("-mthread-model");
3679 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3680 CmdArgs.push_back(A->getValue());
3681 else
3682 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3683
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003684 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3685
Tanya Lattner59876c22009-11-04 01:18:09 +00003686 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3687 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00003688 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00003689
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003690 // LLVM Code Generator Options.
3691
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003692 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3693 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003694 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3695 options::OPT_frewrite_map_file_EQ)) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003696 CmdArgs.push_back("-frewrite-map-file");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003697 CmdArgs.push_back(A->getValue());
3698 A->claim();
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003699 }
3700 }
3701
Stephen Hinesef822542014-07-21 00:47:37 -07003702 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3703 StringRef v = A->getValue();
3704 CmdArgs.push_back("-mllvm");
3705 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3706 A->claim();
3707 }
3708
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00003709 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3710 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00003711 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00003712 }
3713
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003714 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3715 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003716 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00003717 D.Diag(diag::err_drv_unsupported_opt_for_target)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003718 << A->getSpelling() << getToolChain().getTriple().str();
John McCallb8b52972013-06-18 02:46:29 +00003719 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3720 CmdArgs.push_back("-fpcc-struct-return");
3721 } else {
3722 assert(A->getOption().matches(options::OPT_freg_struct_return));
3723 CmdArgs.push_back("-freg-struct-return");
3724 }
3725 }
3726
Roman Divackycfe9af22011-03-01 17:40:53 +00003727 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3728 CmdArgs.push_back("-mrtd");
3729
Rafael Espindola6af27ec2011-12-14 21:02:23 +00003730 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003731 CmdArgs.push_back("-mdisable-fp-elim");
3732 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3733 options::OPT_fno_zero_initialized_in_bss))
3734 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00003735
3736 bool OFastEnabled = isOptimizationLevelFast(Args);
3737 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3738 // enabled. This alias option is being used to simplify the hasFlag logic.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003739 OptSpecifier StrictAliasingAliasOption =
3740 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003741 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3742 // doesn't do any TBAA.
3743 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb82e1172013-04-24 18:09:54 +00003744 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003745 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman4d5625e2010-10-14 22:36:56 +00003746 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00003747 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3748 options::OPT_fno_struct_path_tbaa))
3749 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00003750 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3751 false))
3752 CmdArgs.push_back("-fstrict-enums");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003753 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3754 options::OPT_fno_strict_vtable_pointers,
3755 false))
3756 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1db772b2012-01-23 08:29:12 +00003757 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3758 options::OPT_fno_optimize_sibling_calls))
3759 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00003760
Eric Christopher31056272013-04-04 06:29:47 +00003761 // Handle segmented stacks.
3762 if (Args.hasArg(options::OPT_fsplit_stack))
3763 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00003764
3765 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3766 // This alias option is being used to simplify the getLastArg logic.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003767 OptSpecifier FastMathAliasOption =
3768 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3769
Chandler Carruthabf07a72012-01-02 14:19:45 +00003770 // Handle various floating point optimization flags, mapping them to the
3771 // appropriate LLVM code generation flags. The pattern for all of these is to
3772 // default off the codegen optimizations, and if any flag enables them and no
3773 // flag disables them after the flag enabling them, enable the codegen
3774 // optimization. This is complicated by several "umbrella" flags.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003775 if (Arg *A = Args.getLastArg(
3776 options::OPT_ffast_math, FastMathAliasOption,
3777 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3778 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3779 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003780 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3781 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003782 A->getOption().getID() != options::OPT_fhonor_infinities)
3783 CmdArgs.push_back("-menable-no-infs");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003784 if (Arg *A = Args.getLastArg(
3785 options::OPT_ffast_math, FastMathAliasOption,
3786 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3787 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3788 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003789 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3790 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003791 A->getOption().getID() != options::OPT_fhonor_nans)
3792 CmdArgs.push_back("-menable-no-nans");
3793
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00003794 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3795 bool MathErrno = getToolChain().IsMathErrnoDefault();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003796 if (Arg *A =
3797 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3798 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3799 options::OPT_fno_math_errno)) {
Chandler Carruthb69557e2013-05-18 20:47:36 +00003800 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3801 // However, turning *off* -ffast_math merely restores the toolchain default
3802 // (which may be false).
3803 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3804 A->getOption().getID() == options::OPT_ffast_math ||
3805 A->getOption().getID() == options::OPT_Ofast)
3806 MathErrno = false;
3807 else if (A->getOption().getID() == options::OPT_fmath_errno)
3808 MathErrno = true;
3809 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00003810 if (MathErrno)
3811 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00003812
3813 // There are several flags which require disabling very specific
3814 // optimizations. Any of these being disabled forces us to turn off the
3815 // entire set of LLVM optimizations, so collect them through all the flag
3816 // madness.
3817 bool AssociativeMath = false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003818 if (Arg *A = Args.getLastArg(
3819 options::OPT_ffast_math, FastMathAliasOption,
3820 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3821 options::OPT_fno_unsafe_math_optimizations,
3822 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003823 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3824 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003825 A->getOption().getID() != options::OPT_fno_associative_math)
3826 AssociativeMath = true;
3827 bool ReciprocalMath = false;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003828 if (Arg *A = Args.getLastArg(
3829 options::OPT_ffast_math, FastMathAliasOption,
3830 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3831 options::OPT_fno_unsafe_math_optimizations,
3832 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003833 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3834 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003835 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3836 ReciprocalMath = true;
3837 bool SignedZeros = true;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003838 if (Arg *A = Args.getLastArg(
3839 options::OPT_ffast_math, FastMathAliasOption,
3840 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3841 options::OPT_fno_unsafe_math_optimizations,
3842 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003843 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3844 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003845 A->getOption().getID() != options::OPT_fsigned_zeros)
3846 SignedZeros = false;
3847 bool TrappingMath = true;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003848 if (Arg *A = Args.getLastArg(
3849 options::OPT_ffast_math, FastMathAliasOption,
3850 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3851 options::OPT_fno_unsafe_math_optimizations,
3852 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003853 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3854 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00003855 A->getOption().getID() != options::OPT_ftrapping_math)
3856 TrappingMath = false;
3857 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3858 !TrappingMath)
3859 CmdArgs.push_back("-menable-unsafe-fp-math");
3860
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003861 if (!SignedZeros)
3862 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesc9686712012-07-06 00:59:19 +00003863
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07003864 if (ReciprocalMath)
3865 CmdArgs.push_back("-freciprocal-math");
3866
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003867 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00003868 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003869 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00003870 options::OPT_ffp_contract)) {
3871 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003872 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00003873 if (Val == "fast" || Val == "on" || Val == "off") {
3874 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3875 } else {
3876 D.Diag(diag::err_drv_unsupported_option_argument)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003877 << A->getOption().getName() << Val;
Lang Hamesc9686712012-07-06 00:59:19 +00003878 }
Chad Rosierb82e1172013-04-24 18:09:54 +00003879 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3880 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00003881 // If fast-math is set then set the fp-contract mode to fast.
3882 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3883 }
3884 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003885
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003886 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesc9686712012-07-06 00:59:19 +00003887
Bob Wilson455e72e2012-07-19 03:52:53 +00003888 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3889 // and if we find them, tell the frontend to provide the appropriate
3890 // preprocessor macros. This is distinct from enabling any optimizations as
3891 // these options induce language changes which must survive serialization
3892 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00003893 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3894 options::OPT_fno_fast_math))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003895 if (!A->getOption().matches(options::OPT_fno_fast_math))
3896 CmdArgs.push_back("-ffast-math");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003897 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3898 options::OPT_fno_fast_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00003899 if (A->getOption().matches(options::OPT_ffinite_math_only))
3900 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00003901
Daniel Dunbar1b718482010-05-14 22:00:22 +00003902 // Decide whether to use verbose asm. Verbose assembly is the default on
3903 // toolchains which have the integrated assembler on by default.
Stephen Hines651f13c2014-04-23 16:59:28 -07003904 bool IsIntegratedAssemblerDefault =
3905 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar1b718482010-05-14 22:00:22 +00003906 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Stephen Hines651f13c2014-04-23 16:59:28 -07003907 IsIntegratedAssemblerDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00003908 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003909 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00003910
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07003911 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3912 IsIntegratedAssemblerDefault))
Stephen Hines651f13c2014-04-23 16:59:28 -07003913 CmdArgs.push_back("-no-integrated-as");
3914
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003915 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3916 CmdArgs.push_back("-mdebug-pass");
3917 CmdArgs.push_back("Structure");
3918 }
3919 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3920 CmdArgs.push_back("-mdebug-pass");
3921 CmdArgs.push_back("Arguments");
3922 }
3923
John McCalld0c2ec42010-02-19 02:45:38 +00003924 // Enable -mconstructor-aliases except on darwin, where we have to
3925 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00003926 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00003927 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003928
John McCall32096692011-03-18 02:56:14 +00003929 // Darwin's kernel doesn't support guard variables; just die if we
3930 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00003931 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00003932 CmdArgs.push_back("-fforbid-guard-variables");
3933
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003934 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3935 false)) {
Douglas Gregor6f755502011-02-01 15:15:22 +00003936 CmdArgs.push_back("-mms-bitfields");
3937 }
John McCalld0c2ec42010-02-19 02:45:38 +00003938
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00003939 // This is a coarse approximation of what llvm-gcc actually does, both
3940 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3941 // complicated ways.
3942 bool AsynchronousUnwindTables =
Stephen Hines651f13c2014-04-23 16:59:28 -07003943 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3944 options::OPT_fno_asynchronous_unwind_tables,
3945 (getToolChain().IsUnwindTablesDefault() ||
3946 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3947 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00003948 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3949 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003950 CmdArgs.push_back("-munwind-tables");
3951
Chandler Carrutha6b25812012-11-21 23:40:23 +00003952 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00003953
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003954 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3955 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00003956 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003957 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00003958
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00003959 // FIXME: Handle -mtune=.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003960 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00003961
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00003962 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00003963 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00003964 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00003965 }
3966
Rafael Espindolab330e402013-08-20 22:12:08 +00003967 // Add the target cpu
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003968 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindolab330e402013-08-20 22:12:08 +00003969 if (!CPU.empty()) {
3970 CmdArgs.push_back("-target-cpu");
3971 CmdArgs.push_back(Args.MakeArgString(CPU));
3972 }
3973
Rafael Espindola5389b842013-08-21 21:59:03 +00003974 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3975 CmdArgs.push_back("-mfpmath");
3976 CmdArgs.push_back(A->getValue());
3977 }
3978
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003979 // Add the target features
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003980 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003981
Rafael Espindolab330e402013-08-20 22:12:08 +00003982 // Add target specific flags.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003983 switch (getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00003984 default:
3985 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00003986
Daniel Dunbarb163ef72009-09-10 04:57:17 +00003987 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07003988 case llvm::Triple::armeb:
Daniel Dunbarb163ef72009-09-10 04:57:17 +00003989 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07003990 case llvm::Triple::thumbeb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08003991 // Use the effective triple, which takes into account the deployment target.
3992 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00003993 break;
3994
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003995 case llvm::Triple::aarch64:
3996 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003997 AddAArch64TargetArgs(Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07003998 break;
3999
Eric Christophered734732010-03-02 02:41:08 +00004000 case llvm::Triple::mips:
4001 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00004002 case llvm::Triple::mips64:
4003 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00004004 AddMIPSTargetArgs(Args, CmdArgs);
4005 break;
4006
Stephen Hines176edba2014-12-01 14:53:08 -08004007 case llvm::Triple::ppc:
4008 case llvm::Triple::ppc64:
4009 case llvm::Triple::ppc64le:
4010 AddPPCTargetArgs(Args, CmdArgs);
4011 break;
4012
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004013 case llvm::Triple::sparc:
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004014 case llvm::Triple::sparcel:
Stephen Hines176edba2014-12-01 14:53:08 -08004015 case llvm::Triple::sparcv9:
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004016 AddSparcTargetArgs(Args, CmdArgs);
4017 break;
4018
Daniel Dunbar6acda162009-09-09 22:33:08 +00004019 case llvm::Triple::x86:
4020 case llvm::Triple::x86_64:
4021 AddX86TargetArgs(Args, CmdArgs);
4022 break;
Tony Linthicum96319392011-12-12 21:14:55 +00004023
4024 case llvm::Triple::hexagon:
4025 AddHexagonTargetArgs(Args, CmdArgs);
4026 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00004027 }
4028
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004029 // The 'g' groups options involve a somewhat intricate sequence of decisions
4030 // about what to pass from the driver to the frontend, but by the time they
4031 // reach cc1 they've been factored into three well-defined orthogonal choices:
4032 // * what level of debug info to generate
4033 // * what dwarf version to write
4034 // * what debugger tuning to use
4035 // This avoids having to monkey around further in cc1 other than to disable
4036 // codeview if not running in a Windows environment. Perhaps even that
4037 // decision should be made in the driver as well though.
4038 unsigned DwarfVersion = 0;
4039 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4040 // These two are potentially updated by AddClangCLArgs.
4041 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4042 CodeGenOptions::NoDebugInfo;
4043 bool EmitCodeView = false;
4044
Hans Wennborgb3574792013-08-08 00:17:41 +00004045 // Add clang-cl arguments.
4046 if (getToolChain().getDriver().IsCLMode())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004047 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborgb3574792013-08-08 00:17:41 +00004048
Daniel Dunbarc176bc62010-08-11 23:07:47 +00004049 // Pass the linker version in use.
4050 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4051 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00004052 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00004053 }
4054
Eric Christopherd3e22df2013-04-03 01:58:53 +00004055 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00004056 CmdArgs.push_back("-momit-leaf-frame-pointer");
4057
Daniel Dunbarb30575c2010-05-12 18:19:58 +00004058 // Explicitly error on some things we know we don't support and can't just
4059 // ignore.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004060 types::ID InputType = Input.getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00004061 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4062 Arg *Unsupported;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004063 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004064 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00004065 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4066 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004067 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004068 << Unsupported->getOption().getName();
Daniel Dunbare94db472010-09-24 19:39:37 +00004069 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00004070 }
4071
Daniel Dunbar1d460332009-03-18 10:01:51 +00004072 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00004073 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00004074 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00004075 CmdArgs.push_back("-header-include-file");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004076 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4077 : "-");
Daniel Dunbar322c29f2011-02-02 21:11:35 +00004078 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004079 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00004080 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004081
Chad Rosier2b819102011-08-02 17:58:04 +00004082 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00004083 CmdArgs.push_back("-diagnostic-log-file");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004084 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4085 : "-");
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00004086 }
4087
Rafael Espindola18f36d92010-03-07 04:46:18 +00004088 Args.ClaimAllArgs(options::OPT_g_Group);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004089 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00004090 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004091 // If the last option explicitly specified a debug-info level, use it.
4092 if (A->getOption().matches(options::OPT_gN_Group)) {
4093 DebugInfoKind = DebugLevelToInfoKind(*A);
4094 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4095 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4096 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4097 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4098 A->getIndex() > SplitDwarfArg->getIndex())
4099 SplitDwarfArg = nullptr;
4100 } else
4101 // For any other 'g' option, use Limited.
4102 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
4103 }
4104
4105 // If a debugger tuning argument appeared, remember it.
4106 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4107 options::OPT_ggdbN_Group)) {
4108 if (A->getOption().matches(options::OPT_glldb))
4109 DebuggerTuning = llvm::DebuggerKind::LLDB;
4110 else if (A->getOption().matches(options::OPT_gsce))
4111 DebuggerTuning = llvm::DebuggerKind::SCE;
4112 else
4113 DebuggerTuning = llvm::DebuggerKind::GDB;
4114 }
4115
4116 // If a -gdwarf argument appeared, remember it.
4117 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
4118 options::OPT_gdwarf_4))
4119 DwarfVersion = DwarfVersionNum(A->getSpelling());
4120
4121 // Forward -gcodeview.
4122 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4123 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4124 // DwarfVersion remains at 0 if no explicit choice was made.
4125 CmdArgs.push_back("-gcodeview");
4126 } else if (DwarfVersion == 0 &&
4127 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4128 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00004129 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004130
Alexey Samsonov7f326072012-06-21 08:22:39 +00004131 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4132 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004133
4134 // PS4 defaults to no column info
Stephen Hines176edba2014-12-01 14:53:08 -08004135 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004136 /*Default=*/ !IsPS4CPU))
Eric Christopherda3301e2012-10-18 21:52:18 +00004137 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00004138
Eric Christopher0f43a6d2013-09-13 22:37:55 +00004139 // FIXME: Move backend command line options to the module.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004140 if (Args.hasArg(options::OPT_gmodules)) {
4141 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
4142 CmdArgs.push_back("-dwarf-ext-refs");
4143 CmdArgs.push_back("-fmodule-format=obj");
4144 }
4145
Eric Christopherc706c8e2013-02-05 07:29:57 +00004146 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4147 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00004148 // FIXME: Currently only works on Linux.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004149 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
4150 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopherc706c8e2013-02-05 07:29:57 +00004151 CmdArgs.push_back("-backend-option");
4152 CmdArgs.push_back("-split-dwarf=Enable");
4153 }
4154
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004155 // After we've dealt with all combinations of things that could
4156 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4157 // figure out if we need to "upgrade" it to standalone debug info.
4158 // We parse these two '-f' options whether or not they will be used,
4159 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4160 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4161 options::OPT_fno_standalone_debug,
4162 getToolChain().GetDefaultStandaloneDebug());
4163 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4164 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4165 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4166 DebuggerTuning);
4167
Eric Christopher0f43a6d2013-09-13 22:37:55 +00004168 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4169 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4170 CmdArgs.push_back("-backend-option");
4171 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4172 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00004173
Stephen Hines651f13c2014-04-23 16:59:28 -07004174 // -gdwarf-aranges turns on the emission of the aranges section in the
4175 // backend.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004176 // Always enabled on the PS4.
4177 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004178 CmdArgs.push_back("-backend-option");
4179 CmdArgs.push_back("-generate-arange-section");
4180 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00004181
Stephen Hines651f13c2014-04-23 16:59:28 -07004182 if (Args.hasFlag(options::OPT_fdebug_types_section,
4183 options::OPT_fno_debug_types_section, false)) {
4184 CmdArgs.push_back("-backend-option");
4185 CmdArgs.push_back("-generate-type-units");
4186 }
4187
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004188 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4189 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4190
Stephen Hines651f13c2014-04-23 16:59:28 -07004191 if (Args.hasFlag(options::OPT_ffunction_sections,
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004192 options::OPT_fno_function_sections, UseSeparateSections)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004193 CmdArgs.push_back("-ffunction-sections");
4194 }
4195
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004196 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4197 UseSeparateSections)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004198 CmdArgs.push_back("-fdata-sections");
4199 }
Rafael Espindola9cf933a2010-05-06 21:06:04 +00004200
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004201 if (!Args.hasFlag(options::OPT_funique_section_names,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004202 options::OPT_fno_unique_section_names, true))
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004203 CmdArgs.push_back("-fno-unique-section-names");
4204
Chris Lattner7255a2d2010-06-22 00:03:40 +00004205 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4206
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004207 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07004208
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004209 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4210 if (getToolChain().getTriple().isPS4CPU())
4211 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
Nick Lewycky5ea4f442011-05-04 20:46:58 +00004212
Daniel Dunbara268fc02011-10-11 18:20:10 +00004213 // Pass options for controlling the default header search paths.
4214 if (Args.hasArg(options::OPT_nostdinc)) {
4215 CmdArgs.push_back("-nostdsysteminc");
4216 CmdArgs.push_back("-nobuiltininc");
4217 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00004218 if (Args.hasArg(options::OPT_nostdlibinc))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004219 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00004220 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4221 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4222 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004223
Daniel Dunbar5f122322009-12-15 01:02:52 +00004224 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00004225 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00004226 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00004227
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00004228 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4229
Ted Kremenek30660a82012-03-06 20:06:33 +00004230 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00004231 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00004232 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00004233 options::OPT_ccc_arcmt_modify,
4234 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00004235 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00004236 switch (A->getOption().getID()) {
4237 default:
4238 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00004239 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00004240 CmdArgs.push_back("-arcmt-check");
4241 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00004242 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00004243 CmdArgs.push_back("-arcmt-modify");
4244 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00004245 case options::OPT_ccc_arcmt_migrate:
4246 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00004247 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00004248 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00004249
4250 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4251 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00004252 break;
John McCall8f0e8d22011-06-15 23:25:17 +00004253 }
4254 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00004255 } else {
4256 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4257 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4258 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00004259 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00004260
Ted Kremenek30660a82012-03-06 20:06:33 +00004261 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4262 if (ARCMTEnabled) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004263 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4264 << "-ccc-arcmt-migrate";
Ted Kremenek30660a82012-03-06 20:06:33 +00004265 }
4266 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00004267 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00004268
4269 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00004270 options::OPT_objcmt_migrate_subscripting,
4271 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00004272 // None specified, means enable them all.
4273 CmdArgs.push_back("-objcmt-migrate-literals");
4274 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00004275 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00004276 } else {
4277 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4278 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00004279 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00004280 }
Argyrios Kyrtzidis17c384c2013-11-13 23:38:20 +00004281 } else {
4282 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4283 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4284 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4285 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4286 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4287 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004288 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis17c384c2013-11-13 23:38:20 +00004289 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4290 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4291 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4292 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4293 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4294 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4295 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Stephen Hines651f13c2014-04-23 16:59:28 -07004296 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
4297 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenek30660a82012-03-06 20:06:33 +00004298 }
4299
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004300 // Add preprocessing options like -I, -D, etc. if we are using the
4301 // preprocessor.
4302 //
4303 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004304 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004305 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4306 AuxToolChain);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004307
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00004308 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4309 // that "The compiler can only warn and ignore the option if not recognized".
4310 // When building with ccache, it will pass -D options to clang even on
4311 // preprocessed inputs and configure concludes that -fPIC is not supported.
4312 Args.ClaimAllArgs(options::OPT_D);
4313
Alp Tokere22017e2013-11-15 20:40:58 +00004314 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00004315 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4316 if (A->getOption().matches(options::OPT_O4)) {
4317 CmdArgs.push_back("-O3");
4318 D.Diag(diag::warn_O4_is_O3);
4319 } else {
4320 A->render(Args, CmdArgs);
4321 }
4322 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004323
Stephen Hines176edba2014-12-01 14:53:08 -08004324 // Warn about ignored options to clang.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004325 for (const Arg *A :
4326 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4327 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004328 A->claim();
Stephen Hines176edba2014-12-01 14:53:08 -08004329 }
4330
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004331 claimNoWarnArgs(Args);
Chad Rosierb2c08872012-12-12 20:06:31 +00004332
Stephen Hines176edba2014-12-01 14:53:08 -08004333 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00004334 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00004335 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4336 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00004337 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004338 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00004339
4340 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00004341 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00004342 //
4343 // If a std is supplied, only add -trigraphs if it follows the
4344 // option.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004345 bool ImplyVCPPCXXVer = false;
Daniel Dunbard573d262009-04-07 22:13:21 +00004346 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4347 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00004348 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00004349 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00004350 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00004351 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00004352 else
4353 Std->render(Args, CmdArgs);
4354
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004355 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar0e100312010-06-14 21:23:08 +00004356 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004357 options::OPT_ftrigraphs,
4358 options::OPT_fno_trigraphs))
Daniel Dunbar0e100312010-06-14 21:23:08 +00004359 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00004360 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00004361 } else {
4362 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00004363 //
4364 // FIXME: Clang doesn't correctly handle -std= when the input language
4365 // doesn't match. For the time being just ignore this for C++ inputs;
4366 // eventually we want to do all the standard defaulting here instead of
4367 // splitting it between the driver and clang -cc1.
4368 if (!types::isCXX(InputType))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004369 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4370 /*Joined=*/true);
Stephen Hines651f13c2014-04-23 16:59:28 -07004371 else if (IsWindowsMSVC)
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004372 ImplyVCPPCXXVer = true;
Nico Weber50f88b92012-08-30 02:08:31 +00004373
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004374 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4375 options::OPT_fno_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00004376 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004377
Richard Smithe9813b32013-09-04 22:50:31 +00004378 // GCC's behavior for -Wwrite-strings is a bit strange:
4379 // * In C, this "warning flag" changes the types of string literals from
4380 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4381 // for the discarded qualifier.
4382 // * In C++, this is just a normal warning flag.
4383 //
4384 // Implementing this warning correctly in C is hard, so we follow GCC's
4385 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4386 // a non-const char* in C, rather than using this crude hack.
4387 if (!types::isCXX(InputType)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004388 // FIXME: This should behave just like a warning flag, and thus should also
4389 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4390 Arg *WriteStrings =
4391 Args.getLastArg(options::OPT_Wwrite_strings,
4392 options::OPT_Wno_write_strings, options::OPT_w);
4393 if (WriteStrings &&
4394 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smithe9813b32013-09-04 22:50:31 +00004395 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00004396 }
4397
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00004398 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00004399 // during C++ compilation, which it is by default. GCC keeps this define even
4400 // in the presence of '-w', match this behavior bug-for-bug.
4401 if (types::isCXX(InputType) &&
4402 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4403 true)) {
4404 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00004405 }
4406
Chandler Carruthc304ba32010-05-22 02:21:53 +00004407 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4408 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4409 if (Asm->getOption().matches(options::OPT_fasm))
4410 CmdArgs.push_back("-fgnu-keywords");
4411 else
4412 CmdArgs.push_back("-fno-gnu-keywords");
4413 }
4414
Nick Lewyckyea523d72011-10-17 23:05:52 +00004415 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4416 CmdArgs.push_back("-fno-dwarf-directory-asm");
4417
Daniel Dunbarf4910132013-04-16 18:21:19 +00004418 if (ShouldDisableAutolink(Args, getToolChain()))
4419 CmdArgs.push_back("-fno-autolink");
4420
Chandler Carruthd566df62012-12-17 21:40:04 +00004421 // Add in -fdebug-compilation-dir if necessary.
4422 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00004423
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004424 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4425 StringRef Map = A->getValue();
4426 if (Map.find('=') == StringRef::npos)
4427 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4428 else
4429 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4430 A->claim();
4431 }
4432
Richard Smithc18c4232011-11-21 19:36:32 +00004433 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4434 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00004435 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00004436 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00004437 }
4438
Richard Smith195dd7c2013-11-06 19:31:51 +00004439 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4440 CmdArgs.push_back("-foperator-arrow-depth");
4441 CmdArgs.push_back(A->getValue());
4442 }
4443
Richard Smithc18c4232011-11-21 19:36:32 +00004444 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4445 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00004446 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00004447 }
4448
Richard Smithe7565632013-05-08 02:12:03 +00004449 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4450 CmdArgs.push_back("-fconstexpr-steps");
4451 CmdArgs.push_back(A->getValue());
4452 }
4453
Richard Smith9e738cc2013-02-22 01:59:51 +00004454 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4455 CmdArgs.push_back("-fbracket-depth");
4456 CmdArgs.push_back(A->getValue());
4457 }
4458
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00004459 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4460 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00004461 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004462 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00004463 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4464 } else
4465 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00004466 }
4467
Michael J. Spencerc6357102012-10-22 22:13:48 +00004468 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00004469 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00004470
Daniel Dunbar294691e2009-11-04 06:24:38 +00004471 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4472 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00004473 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00004474 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00004475
Chris Lattner124fca52010-01-09 21:54:33 +00004476 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4477 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00004478 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00004479 }
4480
Chris Lattner0f0c9632010-04-07 20:49:23 +00004481 CmdArgs.push_back("-ferror-limit");
4482 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00004483 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00004484 else
4485 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00004486
Chandler Carruthc40f73c2010-05-06 04:55:18 +00004487 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4488 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00004489 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00004490 }
4491
4492 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4493 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00004494 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00004495 }
4496
Richard Smith08d6e032011-12-16 19:06:07 +00004497 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4498 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00004499 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00004500 }
4501
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004502 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4503 CmdArgs.push_back("-fspell-checking-limit");
4504 CmdArgs.push_back(A->getValue());
4505 }
4506
Daniel Dunbar55efe142009-11-04 06:24:47 +00004507 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00004508 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00004509 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004510 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00004511 } else {
4512 // If -fmessage-length=N was not specified, determine whether this is a
4513 // terminal and, if so, implicitly define -fmessage-length appropriately.
4514 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00004515 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00004516 }
4517
John McCalla880b192013-02-19 01:57:35 +00004518 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4519 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4520 options::OPT_fvisibility_ms_compat)) {
4521 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4522 CmdArgs.push_back("-fvisibility");
4523 CmdArgs.push_back(A->getValue());
4524 } else {
4525 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4526 CmdArgs.push_back("-fvisibility");
4527 CmdArgs.push_back("hidden");
4528 CmdArgs.push_back("-ftype-visibility");
4529 CmdArgs.push_back("default");
4530 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00004531 }
4532
Douglas Gregor7cf84d62010-06-15 17:05:35 +00004533 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00004534
Hans Wennborgde981f32012-06-28 08:01:44 +00004535 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4536
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00004537 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00004538 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4539 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00004540 CmdArgs.push_back("-ffreestanding");
4541
Daniel Dunbarba8d8612009-12-03 18:42:11 +00004542 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00004543 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00004544 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christophere88c4512011-10-25 07:13:06 +00004545 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004546 // Emulated TLS is enabled by default on Android, and can be enabled manually
4547 // with -femulated-tls.
4548 bool EmulatedTLSDefault = Triple.isAndroid();
4549 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4550 EmulatedTLSDefault))
4551 CmdArgs.push_back("-femulated-tls");
4552 // AltiVec-like language extensions aren't relevant for assembling.
4553 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidt9e0b6472013-07-03 15:36:02 +00004554 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004555 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4556 }
Richard Trieu246b6aa2012-06-26 18:18:47 +00004557 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4558 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00004559
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004560 // Forward flags for OpenMP
4561 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4562 options::OPT_fno_openmp, false))
4563 switch (getOpenMPRuntime(getToolChain(), Args)) {
4564 case OMPRT_OMP:
4565 case OMPRT_IOMP5:
4566 // Clang can generate useful OpenMP code for these two runtime libraries.
4567 CmdArgs.push_back("-fopenmp");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004568
4569 // If no option regarding the use of TLS in OpenMP codegeneration is
4570 // given, decide a default based on the target. Otherwise rely on the
4571 // options and pass the right information to the frontend.
4572 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4573 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
4574 CmdArgs.push_back("-fnoopenmp-use-tls");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004575 break;
4576 default:
4577 // By default, if Clang doesn't know how to generate useful OpenMP code
4578 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4579 // down to the actual compilation.
4580 // FIXME: It would be better to have a mode which *only* omits IR
4581 // generation based on the OpenMP support so that we get consistent
4582 // semantic analysis, etc.
4583 break;
4584 }
4585
Peter Collingbournec6911a22013-11-01 18:16:25 +00004586 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004587 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smithc4dabad2012-11-05 22:04:41 +00004588
Eric Christopher98654c92013-02-19 06:16:53 +00004589 // Report an error for -faltivec on anything other than PowerPC.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004590 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4591 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4592 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4593 Arch == llvm::Triple::ppc64le))
4594 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4595 << "ppc/ppc64/ppc64le";
4596 }
Chad Rosier4574c3d2012-03-13 23:45:51 +00004597
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004598 // -fzvector is incompatible with -faltivec.
4599 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4600 if (Args.hasArg(options::OPT_faltivec))
4601 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4602 << "-faltivec";
4603
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004604 if (getToolChain().SupportsProfiling())
4605 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00004606
4607 // -flax-vector-conversions is default.
4608 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4609 options::OPT_fno_lax_vector_conversions))
4610 CmdArgs.push_back("-fno-lax-vector-conversions");
4611
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004612 if (Args.getLastArg(options::OPT_fapple_kext) ||
4613 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00004614 CmdArgs.push_back("-fapple-kext");
4615
Fariborz Jahanian34e65772009-05-22 20:17:16 +00004616 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00004617 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00004618 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00004619 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4620 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00004621
4622 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4623 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00004624 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00004625 }
4626
Bob Wilson71fd6cc2012-02-03 06:27:22 +00004627 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00004628
Chandler Carruth5adb5a82011-03-27 00:04:55 +00004629 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4630 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004631 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth5adb5a82011-03-27 00:04:55 +00004632 if (A->getOption().matches(options::OPT_fwrapv))
4633 CmdArgs.push_back("-fwrapv");
4634 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4635 options::OPT_fno_strict_overflow)) {
4636 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4637 CmdArgs.push_back("-fwrapv");
4638 }
Hal Finkelce5b5f12013-11-17 16:03:29 +00004639
4640 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4641 options::OPT_fno_reroll_loops))
4642 if (A->getOption().matches(options::OPT_freroll_loops))
4643 CmdArgs.push_back("-freroll-loops");
4644
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00004645 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00004646 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4647 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004648
Daniel Dunbar5345c392009-09-03 04:54:28 +00004649 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4650
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00004651 // -stack-protector=0 is default.
4652 unsigned StackProtectorLevel = 0;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004653 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4654 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4655 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4656 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4657 Args.ClaimAllArgs(options::OPT_fstack_protector);
4658 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004659 options::OPT_fstack_protector_all,
4660 options::OPT_fstack_protector_strong,
4661 options::OPT_fstack_protector)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004662 if (A->getOption().matches(options::OPT_fstack_protector)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004663 StackProtectorLevel = std::max<unsigned>(
4664 LangOptions::SSPOn,
4665 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004666 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Stephen Hines651f13c2014-04-23 16:59:28 -07004667 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00004668 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Stephen Hines651f13c2014-04-23 16:59:28 -07004669 StackProtectorLevel = LangOptions::SSPReq;
Nico Weber2fef1112011-08-23 07:38:27 +00004670 } else {
4671 StackProtectorLevel =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004672 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weber2fef1112011-08-23 07:38:27 +00004673 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00004674 if (StackProtectorLevel) {
4675 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00004676 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00004677 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00004678
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00004679 // --param ssp-buffer-size=
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004680 for (const Arg *A : Args.filtered(options::OPT__param)) {
4681 StringRef Str(A->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00004682 if (Str.startswith("ssp-buffer-size=")) {
4683 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00004684 CmdArgs.push_back("-stack-protector-buffer-size");
4685 // FIXME: Verify the argument is a valid integer.
4686 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00004687 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004688 A->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00004689 }
Bill Wendling45483f72009-06-28 07:36:13 +00004690 }
4691
Nick Lewycky4e785c92011-12-06 03:33:03 +00004692 // Translate -mstackrealign
4693 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004694 false))
Nick Lewycky4e785c92011-12-06 03:33:03 +00004695 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewycky4e785c92011-12-06 03:33:03 +00004696
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00004697 if (Args.hasArg(options::OPT_mstack_alignment)) {
4698 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4699 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00004700 }
Stephen Hines176edba2014-12-01 14:53:08 -08004701
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004702 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4703 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4704
4705 if (!Size.empty())
4706 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4707 else
4708 CmdArgs.push_back("-mstack-probe-size=0");
4709 }
4710
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004711 switch (getToolChain().getArch()) {
4712 case llvm::Triple::aarch64:
4713 case llvm::Triple::aarch64_be:
4714 case llvm::Triple::arm:
4715 case llvm::Triple::armeb:
4716 case llvm::Triple::thumb:
4717 case llvm::Triple::thumbeb:
Stephen Hines176edba2014-12-01 14:53:08 -08004718 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004719 break;
4720
4721 default:
4722 break;
4723 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00004724
Weiming Zhao7792fde2013-11-13 18:31:23 +00004725 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4726 options::OPT_mno_restrict_it)) {
4727 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4728 CmdArgs.push_back("-backend-option");
4729 CmdArgs.push_back("-arm-restrict-it");
4730 } else {
4731 CmdArgs.push_back("-backend-option");
4732 CmdArgs.push_back("-arm-no-restrict-it");
4733 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004734 } else if (Triple.isOSWindows() &&
4735 (Triple.getArch() == llvm::Triple::arm ||
4736 Triple.getArch() == llvm::Triple::thumb)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004737 // Windows on ARM expects restricted IT blocks
4738 CmdArgs.push_back("-backend-option");
4739 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao7792fde2013-11-13 18:31:23 +00004740 }
4741
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00004742 // Forward -f options with positive and negative forms; we translate
4743 // these by hand.
Diego Novillob85a9ec2013-11-13 12:22:39 +00004744 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4745 StringRef fname = A->getValue();
4746 if (!llvm::sys::fs::exists(fname))
4747 D.Diag(diag::err_drv_no_such_file) << fname;
4748 else
4749 A->render(Args, CmdArgs);
4750 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00004751
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004752 // -fbuiltin is default unless -mkernel is used
4753 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4754 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar53e84842009-11-19 04:55:23 +00004755 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00004756
Nuno Lopesfc284482009-12-16 16:59:22 +00004757 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4758 options::OPT_fno_assume_sane_operator_new))
4759 CmdArgs.push_back("-fno-assume-sane-operator-new");
4760
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00004761 // -fblocks=0 is default.
4762 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00004763 getToolChain().IsBlocksDefault()) ||
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004764 (Args.hasArg(options::OPT_fgnu_runtime) &&
4765 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4766 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00004767 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00004768
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004769 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall13db5cf2011-09-09 20:41:01 +00004770 !getToolChain().hasBlocksRuntime())
4771 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00004772 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00004773
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004774 // -fmodules enables the use of precompiled modules (off by default).
Stephen Hines176edba2014-12-01 14:53:08 -08004775 // Users can pass -fno-cxx-modules to turn off modules support for
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004776 // C++/Objective-C++ programs.
Douglas Gregorf43b7212013-01-16 01:23:41 +00004777 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00004778 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004779 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4780 options::OPT_fno_cxx_modules, true);
Douglas Gregorf43b7212013-01-16 01:23:41 +00004781 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00004782 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00004783 HaveModules = true;
4784 }
4785 }
4786
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004787 // -fmodule-maps enables implicit reading of module map files. By default,
4788 // this is enabled if we are using precompiled modules.
4789 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4790 options::OPT_fno_implicit_module_maps, HaveModules)) {
4791 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper056ec122013-08-05 20:26:17 +00004792 }
4793
Daniel Jasper95411412013-10-21 06:34:34 +00004794 // -fmodules-decluse checks that modules used are declared so (off by
4795 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00004796 if (Args.hasFlag(options::OPT_fmodules_decluse,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004797 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00004798 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00004799 }
4800
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004801 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4802 // all #included headers are part of modules.
4803 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004804 options::OPT_fno_modules_strict_decluse, false)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004805 CmdArgs.push_back("-fmodules-strict-decluse");
4806 }
4807
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004808 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4809 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4810 options::OPT_fno_implicit_modules)) {
4811 CmdArgs.push_back("-fno-implicit-modules");
4812 }
4813
Daniel Jasper95411412013-10-21 06:34:34 +00004814 // -fmodule-name specifies the module that is currently being built (or
4815 // used for header checking by -fmodule-maps).
Stephen Hines176edba2014-12-01 14:53:08 -08004816 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasper95411412013-10-21 06:34:34 +00004817
Stephen Hines176edba2014-12-01 14:53:08 -08004818 // -fmodule-map-file can be used to specify files containing module
Daniel Jasper95411412013-10-21 06:34:34 +00004819 // definitions.
Stephen Hines176edba2014-12-01 14:53:08 -08004820 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasper95411412013-10-21 06:34:34 +00004821
Stephen Hines176edba2014-12-01 14:53:08 -08004822 // -fmodule-file can be used to specify files containing precompiled modules.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004823 if (HaveModules)
4824 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4825 else
4826 Args.ClaimAllArgs(options::OPT_fmodule_file);
Stephen Hines176edba2014-12-01 14:53:08 -08004827
4828 // -fmodule-cache-path specifies where our implicitly-built module files
4829 // should be written.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004830 SmallString<128> Path;
Stephen Hinesef822542014-07-21 00:47:37 -07004831 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004832 Path = A->getValue();
Stephen Hinesef822542014-07-21 00:47:37 -07004833 if (HaveModules) {
4834 if (C.isForDiagnostics()) {
4835 // When generating crash reports, we want to emit the modules along with
4836 // the reproduction sources, so we ignore any provided module path.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004837 Path = Output.getFilename();
4838 llvm::sys::path::replace_extension(Path, ".cache");
4839 llvm::sys::path::append(Path, "modules");
4840 } else if (Path.empty()) {
Stephen Hinesef822542014-07-21 00:47:37 -07004841 // No module path was provided: use the default.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004842 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
4843 llvm::sys::path::append(Path, "org.llvm.clang.");
4844 appendUserToPath(Path);
4845 llvm::sys::path::append(Path, "ModuleCache");
Douglas Gregor953a61f2013-02-07 19:01:24 +00004846 }
Douglas Gregor250172a2013-02-07 22:59:12 +00004847 const char Arg[] = "-fmodules-cache-path=";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004848 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4849 CmdArgs.push_back(Args.MakeArgString(Path));
Douglas Gregor953a61f2013-02-07 19:01:24 +00004850 }
4851
Stephen Hinesef822542014-07-21 00:47:37 -07004852 // When building modules and generating crashdumps, we need to dump a module
4853 // dependency VFS alongside the output.
4854 if (HaveModules && C.isForDiagnostics()) {
4855 SmallString<128> VFSDir(Output.getFilename());
4856 llvm::sys::path::replace_extension(VFSDir, ".cache");
Stephen Hines176edba2014-12-01 14:53:08 -08004857 // Add the cache directory as a temp so the crash diagnostics pick it up.
4858 C.addTempFile(Args.MakeArgString(VFSDir));
4859
Stephen Hinesef822542014-07-21 00:47:37 -07004860 llvm::sys::path::append(VFSDir, "vfs");
4861 CmdArgs.push_back("-module-dependency-dir");
4862 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Stephen Hines651f13c2014-04-23 16:59:28 -07004863 }
4864
Stephen Hines176edba2014-12-01 14:53:08 -08004865 if (HaveModules)
4866 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Stephen Hinesef822542014-07-21 00:47:37 -07004867
Douglas Gregor953a61f2013-02-07 19:01:24 +00004868 // Pass through all -fmodules-ignore-macro arguments.
4869 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00004870 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4871 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00004872
Stephen Hines651f13c2014-04-23 16:59:28 -07004873 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4874
Stephen Hines176edba2014-12-01 14:53:08 -08004875 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4876 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4877 D.Diag(diag::err_drv_argument_not_allowed_with)
4878 << A->getAsString(Args) << "-fbuild-session-timestamp";
4879
4880 llvm::sys::fs::file_status Status;
4881 if (llvm::sys::fs::status(A->getValue(), Status))
4882 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004883 CmdArgs.push_back(Args.MakeArgString(
4884 "-fbuild-session-timestamp=" +
4885 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Stephen Hines176edba2014-12-01 14:53:08 -08004886 }
4887
Stephen Hines651f13c2014-04-23 16:59:28 -07004888 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Stephen Hines176edba2014-12-01 14:53:08 -08004889 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4890 options::OPT_fbuild_session_file))
Stephen Hines651f13c2014-04-23 16:59:28 -07004891 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4892
4893 Args.AddLastArg(CmdArgs,
4894 options::OPT_fmodules_validate_once_per_build_session);
4895 }
4896
4897 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4898
John McCall32579cf2010-04-09 19:12:06 +00004899 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00004900 if (Args.hasFlag(options::OPT_fno_access_control,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004901 options::OPT_faccess_control, false))
John McCall7002f4c2010-04-09 19:03:51 +00004902 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00004903
Anders Carlssona4c24752010-11-21 00:09:52 +00004904 // -felide-constructors is the default.
4905 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004906 options::OPT_felide_constructors, false))
Anders Carlssona4c24752010-11-21 00:09:52 +00004907 CmdArgs.push_back("-fno-elide-constructors");
4908
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004909 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Mike Stump738f8c22009-07-31 23:15:31 +00004910
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004911 if (KernelOrKext || (types::isCXX(InputType) &&
4912 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4913 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004914 CmdArgs.push_back("-fno-rtti");
Richard Smithc4dabad2012-11-05 22:04:41 +00004915
Tony Linthicum96319392011-12-12 21:14:55 +00004916 // -fshort-enums=0 is default for all architectures except Hexagon.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004917 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4918 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00004919 CmdArgs.push_back("-fshort-enums");
4920
Daniel Dunbar1f95e652009-11-17 06:37:03 +00004921 // -fsigned-char is default.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004922 if (Arg *A = Args.getLastArg(
4923 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4924 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4925 if (A->getOption().matches(options::OPT_funsigned_char) ||
4926 A->getOption().matches(options::OPT_fno_signed_char)) {
4927 CmdArgs.push_back("-fno-signed-char");
4928 }
4929 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar76743522009-11-29 02:39:08 +00004930 CmdArgs.push_back("-fno-signed-char");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004931 }
Eli Friedman5a779732009-06-05 07:21:14 +00004932
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00004933 // -fuse-cxa-atexit is default.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004934 if (!Args.hasFlag(
4935 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4936 !IsWindowsCygnus && !IsWindowsGNU &&
4937 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4938 getToolChain().getArch() != llvm::Triple::hexagon &&
4939 getToolChain().getArch() != llvm::Triple::xcore &&
4940 ((getToolChain().getTriple().getVendor() !=
4941 llvm::Triple::MipsTechnologies) ||
4942 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00004943 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00004944 CmdArgs.push_back("-fno-use-cxa-atexit");
4945
Daniel Dunbar0be42c42009-11-17 07:06:20 +00004946 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00004947 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Stephen Hines651f13c2014-04-23 16:59:28 -07004948 IsWindowsMSVC))
Daniel Dunbar0be42c42009-11-17 07:06:20 +00004949 CmdArgs.push_back("-fms-extensions");
4950
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004951 // -fno-use-line-directives is default.
4952 if (Args.hasFlag(options::OPT_fuse_line_directives,
4953 options::OPT_fno_use_line_directives, false))
4954 CmdArgs.push_back("-fuse-line-directives");
4955
Francois Pichetae556082011-09-17 04:32:15 +00004956 // -fms-compatibility=0 is default.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004957 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregorba97b6e2011-10-24 15:49:38 +00004958 options::OPT_fno_ms_compatibility,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004959 (IsWindowsMSVC &&
4960 Args.hasFlag(options::OPT_fms_extensions,
4961 options::OPT_fno_ms_extensions, true))))
Francois Pichetae556082011-09-17 04:32:15 +00004962 CmdArgs.push_back("-fms-compatibility");
4963
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004964 // -fms-compatibility-version=18.00 is default.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004965 VersionTuple MSVT = visualstudio::getMSVCVersion(
4966 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4967 if (!MSVT.empty())
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004968 CmdArgs.push_back(
4969 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004970
4971 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4972 if (ImplyVCPPCXXVer) {
4973 if (IsMSVC2015Compatible)
4974 CmdArgs.push_back("-std=c++14");
4975 else
4976 CmdArgs.push_back("-std=c++11");
Stephen Hines176edba2014-12-01 14:53:08 -08004977 }
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00004978
Eric Christophercfc01e42013-02-18 00:38:31 +00004979 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00004980 if (Args.hasFlag(options::OPT_fborland_extensions,
4981 options::OPT_fno_borland_extensions, false))
4982 CmdArgs.push_back("-fborland-extensions");
4983
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08004984 // -fno-declspec is default, except for PS4.
4985 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4986 getToolChain().getTriple().isPS4()))
4987 CmdArgs.push_back("-fdeclspec");
4988 else if (Args.hasArg(options::OPT_fno_declspec))
4989 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4990
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004991 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4992 // than 19.
4993 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4994 options::OPT_fno_threadsafe_statics,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07004995 !IsWindowsMSVC || IsMSVC2015Compatible))
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004996 CmdArgs.push_back("-fno-threadsafe-statics");
4997
Francois Pichet8efcc012011-09-01 16:38:08 +00004998 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4999 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00005000 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Stephen Hines651f13c2014-04-23 16:59:28 -07005001 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet805bc1f2011-08-26 00:22:34 +00005002 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00005003
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00005004 // -fgnu-keywords default varies depending on language; only pass if
5005 // specified.
5006 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00005007 options::OPT_fno_gnu_keywords))
5008 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00005009
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005010 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola01ba8542011-06-02 17:30:53 +00005011 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00005012 CmdArgs.push_back("-fgnu89-inline");
5013
Chad Rosierfc055f92012-03-15 22:31:42 +00005014 if (Args.hasArg(options::OPT_fno_inline))
5015 CmdArgs.push_back("-fno-inline");
5016
Chad Rosier634a4b12012-03-06 21:17:19 +00005017 if (Args.hasArg(options::OPT_fno_inline_functions))
5018 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00005019
John McCall260611a2012-06-20 06:18:46 +00005020 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00005021
John McCall260611a2012-06-20 06:18:46 +00005022 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Stephen Hines651f13c2014-04-23 16:59:28 -07005023 // legacy is the default. Except for deployment taget of 10.5,
5024 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5025 // gets ignored silently.
5026 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00005027 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5028 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00005029 objcRuntime.isLegacyDispatchDefaultForArch(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005030 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00005031 if (getToolChain().UseObjCMixedDispatch())
5032 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5033 else
5034 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5035 }
5036 }
Rafael Espindola669496b2013-11-12 04:33:56 +00005037
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00005038 // When ObjectiveC legacy runtime is in effect on MacOSX,
5039 // turn on the option to do Array/Dictionary subscripting
5040 // by default.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005041 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanian08d86e92013-11-12 20:50:26 +00005042 getToolChain().getTriple().isMacOSX() &&
5043 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5044 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00005045 objcRuntime.isNeXTFamily())
5046 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005047
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00005048 // -fencode-extended-block-signature=1 is default.
5049 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5050 CmdArgs.push_back("-fencode-extended-block-signature");
5051 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005052
John McCall9f084a32011-07-06 00:26:06 +00005053 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5054 // NOTE: This logic is duplicated in ToolChains.cpp.
5055 bool ARC = isObjCAutoRefCount(Args);
5056 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00005057 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00005058
John McCall9f084a32011-07-06 00:26:06 +00005059 CmdArgs.push_back("-fobjc-arc");
5060
Chandler Carruth7ffa0322011-11-04 07:34:47 +00005061 // FIXME: It seems like this entire block, and several around it should be
5062 // wrapped in isObjC, but for now we just use it here as this is where it
5063 // was being used previously.
5064 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5065 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5066 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5067 else
5068 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5069 }
5070
John McCall9f084a32011-07-06 00:26:06 +00005071 // Allow the user to enable full exceptions code emission.
5072 // We define off for Objective-CC, on for Objective-C++.
5073 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5074 options::OPT_fno_objc_arc_exceptions,
5075 /*default*/ types::isCXX(InputType)))
5076 CmdArgs.push_back("-fobjc-arc-exceptions");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005077
John McCall9f084a32011-07-06 00:26:06 +00005078 }
5079
5080 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5081 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00005082 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00005083 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005084
John McCall9f084a32011-07-06 00:26:06 +00005085 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5086 // takes precedence.
5087 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5088 if (!GCArg)
5089 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5090 if (GCArg) {
5091 if (ARC) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005092 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall9f084a32011-07-06 00:26:06 +00005093 } else if (getToolChain().SupportsObjCGC()) {
5094 GCArg->render(Args, CmdArgs);
5095 } else {
5096 // FIXME: We should move this to a hard error.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005097 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
5098 }
5099 }
5100
5101 // Pass down -fobjc-weak or -fno-objc-weak if present.
5102 if (types::isObjC(InputType)) {
5103 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5104 options::OPT_fno_objc_weak);
5105 if (!WeakArg) {
5106 // nothing to do
5107 } else if (GCArg) {
5108 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5109 D.Diag(diag::err_objc_weak_with_gc);
5110 } else if (!objcRuntime.allowsWeak()) {
5111 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5112 D.Diag(diag::err_objc_weak_unsupported);
5113 } else {
5114 WeakArg->render(Args, CmdArgs);
John McCall9f084a32011-07-06 00:26:06 +00005115 }
5116 }
5117
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005118 if (Args.hasFlag(options::OPT_fapplication_extension,
5119 options::OPT_fno_application_extension, false))
5120 CmdArgs.push_back("-fapplication-extension");
5121
Stephen Hinesef822542014-07-21 00:47:37 -07005122 // Handle GCC-style exception args.
5123 if (!C.getDriver().IsCLMode())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005124 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5125 CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00005126
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005127 if (getToolChain().UseSjLjExceptions(Args))
John McCalld71315c2011-06-22 00:53:57 +00005128 CmdArgs.push_back("-fsjlj-exceptions");
5129
5130 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00005131 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5132 options::OPT_fno_assume_sane_operator_new))
5133 CmdArgs.push_back("-fno-assume-sane-operator-new");
5134
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005135 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5136 // most platforms.
5137 if (Args.hasFlag(options::OPT_fsized_deallocation,
5138 options::OPT_fno_sized_deallocation, false))
5139 CmdArgs.push_back("-fsized-deallocation");
5140
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00005141 // -fconstant-cfstrings is default, and may be subject to argument translation
5142 // on Darwin.
5143 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5144 options::OPT_fno_constant_cfstrings) ||
5145 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5146 options::OPT_mno_constant_cfstrings))
5147 CmdArgs.push_back("-fno-constant-cfstrings");
5148
John Thompsona6fda122009-11-05 20:14:16 +00005149 // -fshort-wchar default varies depending on platform; only
5150 // pass if specified.
Stephen Hines651f13c2014-04-23 16:59:28 -07005151 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5152 options::OPT_fno_short_wchar))
Daniel Dunbar1744a352010-04-27 15:35:03 +00005153 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00005154
Hans Wennborgb087a5d2013-07-31 23:39:13 +00005155 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005156 if (Args.hasFlag(options::OPT_fpascal_strings,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005157 options::OPT_fno_pascal_strings, false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005158 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00005159
Daniel Dunbar88934e82011-10-05 21:04:55 +00005160 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5161 // -fno-pack-struct doesn't apply to -fpack-struct=.
5162 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00005163 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00005164 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00005165 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00005166 } else if (Args.hasFlag(options::OPT_fpack_struct,
5167 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00005168 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00005169 }
5170
Stephen Hines176edba2014-12-01 14:53:08 -08005171 // Handle -fmax-type-align=N and -fno-type-align
5172 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5173 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5174 if (!SkipMaxTypeAlign) {
5175 std::string MaxTypeAlignStr = "-fmax-type-align=";
5176 MaxTypeAlignStr += A->getValue();
5177 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5178 }
5179 } else if (getToolChain().getTriple().isOSDarwin()) {
5180 if (!SkipMaxTypeAlign) {
5181 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5182 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5183 }
5184 }
5185
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005186 // -fcommon is the default unless compiling kernel code or the target says so
5187 bool NoCommonDefault =
5188 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5189 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5190 !NoCommonDefault))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00005191 CmdArgs.push_back("-fno-common");
5192
Daniel Dunbar70d3c922009-04-15 02:37:43 +00005193 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00005194 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00005195 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00005196 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005197 D.Diag(diag::warn_drv_clang_unsupported)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005198 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar70d3c922009-04-15 02:37:43 +00005199
Daniel Dunbar06205ca2010-10-15 22:30:42 +00005200 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005201 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005202 D.Diag(diag::err_drv_clang_unsupported)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005203 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar06205ca2010-10-15 22:30:42 +00005204
Stephen Hinesef822542014-07-21 00:47:37 -07005205 // -finput_charset=UTF-8 is default. Reject others
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005206 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5207 StringRef value = inputCharset->getValue();
5208 if (value != "UTF-8")
5209 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5210 << value;
Stephen Hinesef822542014-07-21 00:47:37 -07005211 }
5212
Stephen Hines176edba2014-12-01 14:53:08 -08005213 // -fexec_charset=UTF-8 is default. Reject others
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005214 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5215 StringRef value = execCharset->getValue();
5216 if (value != "UTF-8")
5217 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5218 << value;
Stephen Hines176edba2014-12-01 14:53:08 -08005219 }
5220
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00005221 // -fcaret-diagnostics is default.
5222 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5223 options::OPT_fno_caret_diagnostics, true))
5224 CmdArgs.push_back("-fno-caret-diagnostics");
5225
Daniel Dunbar49138fc2009-04-19 21:09:34 +00005226 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00005227 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00005228 options::OPT_fno_diagnostics_fixit_info))
5229 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005230
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00005231 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00005232 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00005233 options::OPT_fno_diagnostics_show_option))
5234 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00005235
Chris Lattner6fbe8392010-05-04 21:55:25 +00005236 if (const Arg *A =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005237 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattner6fbe8392010-05-04 21:55:25 +00005238 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00005239 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00005240 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00005241
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005242 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregorc9471b02011-05-21 17:07:29 +00005243 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00005244 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00005245 }
5246
Chandler Carruthabaca7a2011-03-27 01:50:55 +00005247 if (Arg *A = Args.getLastArg(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005248 options::OPT_fdiagnostics_show_note_include_stack,
5249 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthabaca7a2011-03-27 01:50:55 +00005250 if (A->getOption().matches(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005251 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthabaca7a2011-03-27 01:50:55 +00005252 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5253 else
5254 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5255 }
5256
Daniel Dunbar838be482009-11-04 06:24:57 +00005257 // Color diagnostics are the default, unless the terminal doesn't support
5258 // them.
Nico Weber9753d462013-04-17 21:52:44 +00005259 // Support both clang's -f[no-]color-diagnostics and gcc's
5260 // -f[no-]diagnostics-colors[=never|always|auto].
5261 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Stephen Hinesef822542014-07-21 00:47:37 -07005262 for (const auto &Arg : Args) {
5263 const Option &O = Arg->getOption();
Nico Weber9753d462013-04-17 21:52:44 +00005264 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5265 !O.matches(options::OPT_fdiagnostics_color) &&
5266 !O.matches(options::OPT_fno_color_diagnostics) &&
5267 !O.matches(options::OPT_fno_diagnostics_color) &&
5268 !O.matches(options::OPT_fdiagnostics_color_EQ))
5269 continue;
5270
Stephen Hinesef822542014-07-21 00:47:37 -07005271 Arg->claim();
Nico Weber9753d462013-04-17 21:52:44 +00005272 if (O.matches(options::OPT_fcolor_diagnostics) ||
5273 O.matches(options::OPT_fdiagnostics_color)) {
5274 ShowColors = Colors_On;
5275 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5276 O.matches(options::OPT_fno_diagnostics_color)) {
5277 ShowColors = Colors_Off;
5278 } else {
5279 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Stephen Hinesef822542014-07-21 00:47:37 -07005280 StringRef value(Arg->getValue());
Nico Weber9753d462013-04-17 21:52:44 +00005281 if (value == "always")
5282 ShowColors = Colors_On;
5283 else if (value == "never")
5284 ShowColors = Colors_Off;
5285 else if (value == "auto")
5286 ShowColors = Colors_Auto;
5287 else
5288 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005289 << ("-fdiagnostics-color=" + value).str();
Nico Weber9753d462013-04-17 21:52:44 +00005290 }
5291 }
5292 if (ShowColors == Colors_On ||
5293 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00005294 CmdArgs.push_back("-fcolor-diagnostics");
5295
Nico Rieck2956ef42013-09-11 00:38:02 +00005296 if (Args.hasArg(options::OPT_fansi_escape_codes))
5297 CmdArgs.push_back("-fansi-escape-codes");
5298
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00005299 if (!Args.hasFlag(options::OPT_fshow_source_location,
5300 options::OPT_fno_show_source_location))
5301 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00005302
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005303 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregorc9471b02011-05-21 17:07:29 +00005304 true))
5305 CmdArgs.push_back("-fno-show-column");
5306
Douglas Gregora0068fc2010-07-09 17:35:33 +00005307 if (!Args.hasFlag(options::OPT_fspell_checking,
5308 options::OPT_fno_spell_checking))
5309 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00005310
Chad Rosier15490fd2012-12-05 21:08:21 +00005311 // -fno-asm-blocks is default.
5312 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5313 false))
5314 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00005315
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005316 // -fgnu-inline-asm is default.
5317 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5318 options::OPT_fno_gnu_inline_asm, true))
5319 CmdArgs.push_back("-fno-gnu-inline-asm");
5320
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00005321 // Enable vectorization per default according to the optimization level
5322 // selected. For optimization levels that want vectorization we use the alias
5323 // option to simplify the hasFlag logic.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005324 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005325 OptSpecifier VectorizeAliasOption =
5326 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00005327 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00005328 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00005329 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00005330
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005331 // -fslp-vectorize is enabled based on the optimization level selected.
5332 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005333 OptSpecifier SLPVectAliasOption =
5334 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005335 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
5336 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem50ea9632013-04-15 04:57:18 +00005337 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00005338
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00005339 // -fno-slp-vectorize-aggressive is default.
5340 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00005341 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00005342 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00005343
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00005344 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5345 A->render(Args, CmdArgs);
5346
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005347 // -fdollars-in-identifiers default varies depending on platform and
5348 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00005349 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005350 options::OPT_fno_dollars_in_identifiers)) {
5351 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00005352 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005353 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00005354 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00005355 }
5356
Daniel Dunbare027a4b2009-05-22 19:02:20 +00005357 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5358 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00005359 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00005360 options::OPT_fno_unit_at_a_time)) {
5361 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005362 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00005363 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00005364
Eli Friedman19bda3a2011-11-02 01:53:16 +00005365 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5366 options::OPT_fno_apple_pragma_pack, false))
5367 CmdArgs.push_back("-fapple-pragma-pack");
5368
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005369 // le32-specific flags:
Eli Benderskyf3ecf892013-07-24 18:20:14 +00005370 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5371 // by default.
5372 if (getToolChain().getArch() == llvm::Triple::le32) {
5373 CmdArgs.push_back("-fno-math-builtin");
5374 }
5375
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005376// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5377//
5378// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00005379#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00005380 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00005381 (getToolChain().getArch() == llvm::Triple::arm ||
5382 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00005383 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5384 CmdArgs.push_back("-fno-builtin-strcat");
5385 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5386 CmdArgs.push_back("-fno-builtin-strcpy");
5387 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00005388#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00005389
Stephen Hinesef822542014-07-21 00:47:37 -07005390 // Enable rewrite includes if the user's asked for it or if we're generating
5391 // diagnostics.
5392 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5393 // nice to enable this when doing a crashdump for modules as well.
5394 if (Args.hasFlag(options::OPT_frewrite_includes,
5395 options::OPT_fno_rewrite_includes, false) ||
5396 (C.isForDiagnostics() && !HaveModules))
5397 CmdArgs.push_back("-frewrite-includes");
5398
Daniel Dunbard98750f2011-03-18 21:23:40 +00005399 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00005400 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00005401 options::OPT_traditional_cpp)) {
5402 if (isa<PreprocessJobAction>(JA))
5403 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00005404 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00005405 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00005406 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00005407
Daniel Dunbar1d460332009-03-18 10:01:51 +00005408 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00005409 Args.AddLastArg(CmdArgs, options::OPT_dD);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005410
Ted Kremenek36f6e302011-11-11 00:07:43 +00005411 // Handle serialized diagnostics.
5412 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5413 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00005414 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00005415 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00005416
Ted Kremenek127ff2e2012-09-13 06:41:18 +00005417 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5418 CmdArgs.push_back("-fretain-comments-from-system-headers");
5419
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00005420 // Forward -fcomment-block-commands to -cc1.
5421 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00005422 // Forward -fparse-all-comments to -cc1.
5423 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00005424
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005425 // Turn -fplugin=name.so into -load name.so
5426 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5427 CmdArgs.push_back("-load");
5428 CmdArgs.push_back(A->getValue());
5429 A->claim();
5430 }
5431
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005432 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5433 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00005434 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005435 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5436 A->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00005437
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005438 // We translate this by hand to the -cc1 argument, since nightly test uses
5439 // it and developers have been trained to spell it with -mllvm.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005440 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005441 CmdArgs.push_back("-disable-llvm-optzns");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005442 } else
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005443 A->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00005444 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00005445
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005446 // With -save-temps, we want to save the unoptimized bitcode output from the
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005447 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5448 // by the frontend.
5449 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5450 CmdArgs.push_back("-disable-llvm-passes");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005451
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00005452 if (Output.getType() == types::TY_Dependencies) {
5453 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00005454 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005455 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00005456 CmdArgs.push_back(Output.getFilename());
5457 } else {
5458 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00005459 }
5460
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005461 addDashXForInput(Args, Input, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07005462
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005463 if (Input.isFilename())
5464 CmdArgs.push_back(Input.getFilename());
5465 else
5466 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005467
Chris Lattnere6113de2009-11-03 19:50:27 +00005468 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5469
Daniel Dunbara001c1c2010-07-18 21:16:15 +00005470 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005471
5472 // Optionally embed the -cc1 level arguments into the debug info, for build
5473 // analysis.
5474 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00005475 ArgStringList OriginalArgs;
Stephen Hinesef822542014-07-21 00:47:37 -07005476 for (const auto &Arg : Args)
5477 Arg->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00005478
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00005479 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005480 Flags += Exec;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005481 for (const char *OriginalArg : OriginalArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08005482 SmallString<128> EscapedArg;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005483 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005484 Flags += " ";
Stephen Hines176edba2014-12-01 14:53:08 -08005485 Flags += EscapedArg;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005486 }
5487 CmdArgs.push_back("-dwarf-debug-flags");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07005488 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00005489 }
5490
Eric Christopher80190392013-02-22 20:12:52 +00005491 // Add the split debug info name to the command lines here so we
5492 // can propagate it to the backend.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005493 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
5494 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5495 isa<BackendJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00005496 const char *SplitDwarfOut;
5497 if (SplitDwarf) {
5498 CmdArgs.push_back("-split-dwarf-file");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005499 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopher80190392013-02-22 20:12:52 +00005500 CmdArgs.push_back(SplitDwarfOut);
5501 }
5502
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005503 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5504 // Include them with -fcuda-include-gpubinary.
5505 if (IsCuda && Inputs.size() > 1)
5506 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
5507 CmdArgs.push_back("-fcuda-include-gpubinary");
5508 CmdArgs.push_back(I->getFilename());
5509 }
5510
Eric Christopher80190392013-02-22 20:12:52 +00005511 // Finally add the compile command to the compilation.
Stephen Hines651f13c2014-04-23 16:59:28 -07005512 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005513 Output.getType() == types::TY_Object &&
5514 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Stephen Hines176edba2014-12-01 14:53:08 -08005515 auto CLCommand =
5516 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005517 C.addCommand(llvm::make_unique<FallbackCommand>(
5518 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00005519 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005520 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00005521 }
5522
Eric Christopherff971d72013-02-22 23:50:16 +00005523 // Handle the debug info splitting at object creation time if we're
5524 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00005525 // TODO: Currently only works on linux with newer objcopy.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005526 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00005527 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00005528
Roman Divackybe4c8702011-02-10 16:52:03 +00005529 if (Arg *A = Args.getLastArg(options::OPT_pg))
5530 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005531 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5532 << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005533
Daniel Dunbar68fb4692009-04-03 20:51:31 +00005534 // Claim some arguments which clang supports automatically.
5535
Daniel Dunbarf4046862010-04-15 06:18:42 +00005536 // -fpch-preprocess is used with gcc to add a special marker in the output to
5537 // include the PCH file. Clang's PTH solution is completely transparent, so we
5538 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00005539 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005540
Daniel Dunbara880db02009-03-23 19:03:36 +00005541 // Claim some arguments which clang doesn't support, but we don't
5542 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00005543 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5544 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00005545
Rafael Espindola6155fbe2013-09-04 19:37:35 +00005546 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005547 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00005548}
5549
John McCall260611a2012-06-20 06:18:46 +00005550/// Add options related to the Objective-C runtime/ABI.
5551///
5552/// Returns true if the runtime is non-fragile.
5553ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5554 ArgStringList &cmdArgs,
5555 RewriteKind rewriteKind) const {
5556 // Look for the controlling runtime option.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005557 Arg *runtimeArg =
5558 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5559 options::OPT_fobjc_runtime_EQ);
John McCall260611a2012-06-20 06:18:46 +00005560
5561 // Just forward -fobjc-runtime= to the frontend. This supercedes
5562 // options about fragility.
5563 if (runtimeArg &&
5564 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5565 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00005566 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00005567 if (runtime.tryParse(value)) {
5568 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005569 << value;
John McCall260611a2012-06-20 06:18:46 +00005570 }
5571
5572 runtimeArg->render(args, cmdArgs);
5573 return runtime;
5574 }
5575
5576 // Otherwise, we'll need the ABI "version". Version numbers are
5577 // slightly confusing for historical reasons:
5578 // 1 - Traditional "fragile" ABI
5579 // 2 - Non-fragile ABI, version 1
5580 // 3 - Non-fragile ABI, version 2
5581 unsigned objcABIVersion = 1;
5582 // If -fobjc-abi-version= is present, use that to set the version.
5583 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00005584 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00005585 if (value == "1")
5586 objcABIVersion = 1;
5587 else if (value == "2")
5588 objcABIVersion = 2;
5589 else if (value == "3")
5590 objcABIVersion = 3;
5591 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005592 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall260611a2012-06-20 06:18:46 +00005593 } else {
5594 // Otherwise, determine if we are using the non-fragile ABI.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005595 bool nonFragileABIIsDefault =
5596 (rewriteKind == RK_NonFragile ||
5597 (rewriteKind == RK_None &&
5598 getToolChain().IsObjCNonFragileABIDefault()));
John McCall260611a2012-06-20 06:18:46 +00005599 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5600 options::OPT_fno_objc_nonfragile_abi,
5601 nonFragileABIIsDefault)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005602// Determine the non-fragile ABI version to use.
John McCall260611a2012-06-20 06:18:46 +00005603#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5604 unsigned nonFragileABIVersion = 1;
5605#else
5606 unsigned nonFragileABIVersion = 2;
5607#endif
5608
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005609 if (Arg *abiArg =
5610 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00005611 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00005612 if (value == "1")
5613 nonFragileABIVersion = 1;
5614 else if (value == "2")
5615 nonFragileABIVersion = 2;
5616 else
5617 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005618 << value;
John McCall260611a2012-06-20 06:18:46 +00005619 }
5620
5621 objcABIVersion = 1 + nonFragileABIVersion;
5622 } else {
5623 objcABIVersion = 1;
5624 }
5625 }
5626
5627 // We don't actually care about the ABI version other than whether
5628 // it's non-fragile.
5629 bool isNonFragile = objcABIVersion != 1;
5630
5631 // If we have no runtime argument, ask the toolchain for its default runtime.
5632 // However, the rewriter only really supports the Mac runtime, so assume that.
5633 ObjCRuntime runtime;
5634 if (!runtimeArg) {
5635 switch (rewriteKind) {
5636 case RK_None:
5637 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5638 break;
5639 case RK_Fragile:
5640 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5641 break;
5642 case RK_NonFragile:
5643 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5644 break;
5645 }
5646
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005647 // -fnext-runtime
John McCall260611a2012-06-20 06:18:46 +00005648 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5649 // On Darwin, make this use the default behavior for the toolchain.
5650 if (getToolChain().getTriple().isOSDarwin()) {
5651 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5652
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005653 // Otherwise, build for a generic macosx port.
John McCall260611a2012-06-20 06:18:46 +00005654 } else {
5655 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5656 }
5657
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005658 // -fgnu-runtime
John McCall260611a2012-06-20 06:18:46 +00005659 } else {
5660 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00005661 // Legacy behaviour is to target the gnustep runtime if we are i
5662 // non-fragile mode or the GCC runtime in fragile mode.
5663 if (isNonFragile)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005664 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnalla422cd02012-07-04 10:37:03 +00005665 else
5666 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00005667 }
5668
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005669 cmdArgs.push_back(
5670 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall260611a2012-06-20 06:18:46 +00005671 return runtime;
5672}
5673
Stephen Hinesef822542014-07-21 00:47:37 -07005674static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5675 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5676 I += HaveDash;
5677 return !HaveDash;
5678}
5679
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005680namespace {
Stephen Hinesef822542014-07-21 00:47:37 -07005681struct EHFlags {
5682 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5683 bool Synch;
5684 bool Asynch;
5685 bool NoExceptC;
5686};
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005687} // end anonymous namespace
Stephen Hinesef822542014-07-21 00:47:37 -07005688
5689/// /EH controls whether to run destructor cleanups when exceptions are
5690/// thrown. There are three modifiers:
5691/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5692/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5693/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5694/// - c: Assume that extern "C" functions are implicitly noexcept. This
5695/// modifier is an optimization, so we ignore it for now.
5696/// The default is /EHs-c-, meaning cleanups are disabled.
5697static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5698 EHFlags EH;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005699
5700 std::vector<std::string> EHArgs =
5701 Args.getAllArgValues(options::OPT__SLASH_EH);
Stephen Hinesef822542014-07-21 00:47:37 -07005702 for (auto EHVal : EHArgs) {
5703 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5704 switch (EHVal[I]) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005705 case 'a':
5706 EH.Asynch = maybeConsumeDash(EHVal, I);
5707 continue;
5708 case 'c':
5709 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5710 continue;
5711 case 's':
5712 EH.Synch = maybeConsumeDash(EHVal, I);
5713 continue;
5714 default:
5715 break;
Stephen Hinesef822542014-07-21 00:47:37 -07005716 }
5717 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5718 break;
5719 }
5720 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005721
Stephen Hinesef822542014-07-21 00:47:37 -07005722 return EH;
5723}
5724
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005725void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5726 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5727 bool *EmitCodeView) const {
Hans Wennborgb3574792013-08-08 00:17:41 +00005728 unsigned RTOptionID = options::OPT__SLASH_MT;
5729
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00005730 if (Args.hasArg(options::OPT__SLASH_LDd))
5731 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5732 // but defining _DEBUG is sticky.
5733 RTOptionID = options::OPT__SLASH_MTd;
5734
Hans Wennborg76da1782013-09-18 22:26:39 +00005735 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00005736 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00005737
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005738 StringRef FlagForCRT;
5739 switch (RTOptionID) {
5740 case options::OPT__SLASH_MD:
5741 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborgb3574792013-08-08 00:17:41 +00005742 CmdArgs.push_back("-D_DEBUG");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005743 CmdArgs.push_back("-D_MT");
5744 CmdArgs.push_back("-D_DLL");
5745 FlagForCRT = "--dependent-lib=msvcrt";
5746 break;
5747 case options::OPT__SLASH_MDd:
5748 CmdArgs.push_back("-D_DEBUG");
5749 CmdArgs.push_back("-D_MT");
5750 CmdArgs.push_back("-D_DLL");
5751 FlagForCRT = "--dependent-lib=msvcrtd";
5752 break;
5753 case options::OPT__SLASH_MT:
5754 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborgb3574792013-08-08 00:17:41 +00005755 CmdArgs.push_back("-D_DEBUG");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005756 CmdArgs.push_back("-D_MT");
5757 FlagForCRT = "--dependent-lib=libcmt";
5758 break;
5759 case options::OPT__SLASH_MTd:
5760 CmdArgs.push_back("-D_DEBUG");
5761 CmdArgs.push_back("-D_MT");
5762 FlagForCRT = "--dependent-lib=libcmtd";
5763 break;
5764 default:
5765 llvm_unreachable("Unexpected option ID.");
Hans Wennborgb3574792013-08-08 00:17:41 +00005766 }
5767
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005768 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5769 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5770 } else {
5771 CmdArgs.push_back(FlagForCRT.data());
5772
5773 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5774 // users want. The /Za flag to cl.exe turns this off, but it's not
5775 // implemented in clang.
5776 CmdArgs.push_back("--dependent-lib=oldnames");
5777 }
Hans Wennborgf0f98912013-08-08 19:54:30 +00005778
Stephen Hines176edba2014-12-01 14:53:08 -08005779 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5780 // would produce interleaved output, so ignore /showIncludes in such cases.
5781 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5782 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5783 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00005784
Stephen Hinesef822542014-07-21 00:47:37 -07005785 // This controls whether or not we emit RTTI data for polymorphic types.
5786 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5787 /*default=*/false))
5788 CmdArgs.push_back("-fno-rtti-data");
Stephen Hines651f13c2014-04-23 16:59:28 -07005789
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005790 // Emit CodeView if -Z7 is present.
5791 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5792 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5793 // If we are emitting CV but not DWARF, don't build information that LLVM
5794 // can't yet process.
5795 if (*EmitCodeView && !EmitDwarf)
5796 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5797 if (*EmitCodeView)
5798 CmdArgs.push_back("-gcodeview");
5799
Stephen Hines651f13c2014-04-23 16:59:28 -07005800 const Driver &D = getToolChain().getDriver();
Stephen Hinesef822542014-07-21 00:47:37 -07005801 EHFlags EH = parseClangCLEHFlags(D, Args);
5802 // FIXME: Do something with NoExceptC.
5803 if (EH.Synch || EH.Asynch) {
Stephen Hinesef822542014-07-21 00:47:37 -07005804 CmdArgs.push_back("-fcxx-exceptions");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005805 CmdArgs.push_back("-fexceptions");
Stephen Hinesef822542014-07-21 00:47:37 -07005806 }
5807
5808 // /EP should expand to -E -P.
5809 if (Args.hasArg(options::OPT__SLASH_EP)) {
5810 CmdArgs.push_back("-E");
5811 CmdArgs.push_back("-P");
5812 }
5813
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005814 unsigned VolatileOptionID;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005815 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5816 getToolChain().getArch() == llvm::Triple::x86)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005817 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5818 else
5819 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5820
5821 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5822 VolatileOptionID = A->getOption().getID();
5823
5824 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5825 CmdArgs.push_back("-fms-volatile");
5826
Stephen Hines651f13c2014-04-23 16:59:28 -07005827 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5828 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5829 if (MostGeneralArg && BestCaseArg)
5830 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5831 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5832
5833 if (MostGeneralArg) {
5834 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5835 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5836 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5837
5838 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5839 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5840 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5841 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5842 << FirstConflict->getAsString(Args)
5843 << SecondConflict->getAsString(Args);
5844
5845 if (SingleArg)
5846 CmdArgs.push_back("-fms-memptr-rep=single");
5847 else if (MultipleArg)
5848 CmdArgs.push_back("-fms-memptr-rep=multiple");
5849 else
5850 CmdArgs.push_back("-fms-memptr-rep=virtual");
5851 }
5852
5853 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5854 A->render(Args, CmdArgs);
5855
Hans Wennborgb6475522013-09-10 01:07:07 +00005856 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5857 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00005858 if (Args.hasArg(options::OPT__SLASH_fallback))
5859 CmdArgs.push_back("msvc-fallback");
5860 else
5861 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00005862 }
Hans Wennborgb3574792013-08-08 00:17:41 +00005863}
5864
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005865visualstudio::Compiler *Clang::getCLFallback() const {
Stephen Hinesef822542014-07-21 00:47:37 -07005866 if (!CLFallback)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005867 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Stephen Hinesef822542014-07-21 00:47:37 -07005868 return CLFallback.get();
5869}
5870
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005871void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5872 ArgStringList &CmdArgs) const {
5873 StringRef CPUName;
5874 StringRef ABIName;
5875 const llvm::Triple &Triple = getToolChain().getTriple();
5876 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5877
5878 CmdArgs.push_back("-target-abi");
5879 CmdArgs.push_back(ABIName.data());
5880}
5881
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005882void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005883 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005884 const ArgList &Args,
5885 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005886 ArgStringList CmdArgs;
5887
5888 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5889 const InputInfo &Input = Inputs[0];
5890
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005891 std::string TripleStr =
5892 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5893 const llvm::Triple Triple(TripleStr);
5894
Rafael Espindoladbe80d92010-11-17 22:13:25 +00005895 // Don't warn about "clang -w -c foo.s"
5896 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00005897 // and "clang -emit-llvm -c foo.s"
5898 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00005899
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005900 claimNoWarnArgs(Args);
5901
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005902 // Invoke ourselves in -cc1as mode.
5903 //
5904 // FIXME: Implement custom jobs for internal actions.
5905 CmdArgs.push_back("-cc1as");
5906
5907 // Add the "effective" target triple.
5908 CmdArgs.push_back("-triple");
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005909 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5910
5911 // Set the output mode, we currently only expect to be used as a real
5912 // assembler.
5913 CmdArgs.push_back("-filetype");
5914 CmdArgs.push_back("obj");
5915
Eric Christopher27e2b982012-12-18 00:31:10 +00005916 // Set the main file name, so that debug info works even with
5917 // -save-temps or preprocessed assembly.
5918 CmdArgs.push_back("-main-file-name");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07005919 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher27e2b982012-12-18 00:31:10 +00005920
Rafael Espindolab330e402013-08-20 22:12:08 +00005921 // Add the target cpu
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005922 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindolab330e402013-08-20 22:12:08 +00005923 if (!CPU.empty()) {
5924 CmdArgs.push_back("-target-cpu");
5925 CmdArgs.push_back(Args.MakeArgString(CPU));
5926 }
5927
Rafael Espindola146dbbf2013-08-21 16:39:20 +00005928 // Add the target features
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005929 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbachfc308292012-02-10 20:37:10 +00005930
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00005931 // Ignore explicit -force_cpusubtype_ALL option.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005932 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
5933
5934 // Pass along any -I options so we get proper .include search paths.
5935 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00005936
Eric Christopher8f0a4032012-01-10 00:38:01 +00005937 // Determine the original source input.
5938 const Action *SourceAction = &JA;
5939 while (SourceAction->getKind() != Action::InputClass) {
5940 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5941 SourceAction = SourceAction->getInputs()[0];
5942 }
5943
Chandler Carruthd566df62012-12-17 21:40:04 +00005944 // Forward -g and handle debug info related flags, assuming we are dealing
5945 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00005946 if (SourceAction->getType() == types::TY_Asm ||
5947 SourceAction->getType() == types::TY_PP_Asm) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005948 bool WantDebug = false;
5949 unsigned DwarfVersion = 0;
Eric Christopher8f0a4032012-01-10 00:38:01 +00005950 Args.ClaimAllArgs(options::OPT_g_Group);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005951 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5952 WantDebug = !A->getOption().matches(options::OPT_g0) &&
5953 !A->getOption().matches(options::OPT_ggdb0);
5954 if (WantDebug)
5955 DwarfVersion = DwarfVersionNum(A->getSpelling());
5956 }
5957 if (DwarfVersion == 0)
5958 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
5959 RenderDebugEnablingArgs(Args, CmdArgs,
5960 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5961 : CodeGenOptions::NoDebugInfo),
5962 DwarfVersion, llvm::DebuggerKind::Default);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005963
Chandler Carruthd566df62012-12-17 21:40:04 +00005964 // Add the -fdebug-compilation-dir flag if needed.
5965 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00005966
5967 // Set the AT_producer to the clang version when using the integrated
5968 // assembler on assembly source files.
5969 CmdArgs.push_back("-dwarf-debug-producer");
5970 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08005971
5972 // And pass along -I options
5973 Args.AddAllArgs(CmdArgs, options::OPT_I);
5974 }
5975
5976 // Handle -fPIC et al -- the relocation-model affects the assembler
5977 // for some targets.
5978 llvm::Reloc::Model RelocationModel;
5979 unsigned PICLevel;
5980 bool IsPIE;
5981 std::tie(RelocationModel, PICLevel, IsPIE) =
5982 ParsePICArgs(getToolChain(), Triple, Args);
5983
5984 const char *RMName = RelocationModelName(RelocationModel);
5985 if (RMName) {
5986 CmdArgs.push_back("-mrelocation-model");
5987 CmdArgs.push_back(RMName);
Eric Christopher8f0a4032012-01-10 00:38:01 +00005988 }
Kevin Enderby567003e2011-12-22 19:31:58 +00005989
5990 // Optionally embed the -cc1as level arguments into the debug info, for build
5991 // analysis.
5992 if (getToolChain().UseDwarfDebugFlags()) {
5993 ArgStringList OriginalArgs;
Stephen Hinesef822542014-07-21 00:47:37 -07005994 for (const auto &Arg : Args)
5995 Arg->render(Args, OriginalArgs);
Kevin Enderby567003e2011-12-22 19:31:58 +00005996
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00005997 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00005998 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5999 Flags += Exec;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006000 for (const char *OriginalArg : OriginalArgs) {
Stephen Hines176edba2014-12-01 14:53:08 -08006001 SmallString<128> EscapedArg;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006002 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby567003e2011-12-22 19:31:58 +00006003 Flags += " ";
Stephen Hines176edba2014-12-01 14:53:08 -08006004 Flags += EscapedArg;
Kevin Enderby567003e2011-12-22 19:31:58 +00006005 }
6006 CmdArgs.push_back("-dwarf-debug-flags");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006007 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby567003e2011-12-22 19:31:58 +00006008 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006009
6010 // FIXME: Add -static support, once we have it.
6011
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006012 // Add target specific flags.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006013 switch (getToolChain().getArch()) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006014 default:
6015 break;
6016
6017 case llvm::Triple::mips:
6018 case llvm::Triple::mipsel:
6019 case llvm::Triple::mips64:
6020 case llvm::Triple::mips64el:
6021 AddMIPSTargetArgs(Args, CmdArgs);
6022 break;
6023 }
6024
Stephen Hines651f13c2014-04-23 16:59:28 -07006025 // Consume all the warning flags. Usually this would be handled more
6026 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6027 // doesn't handle that so rather than warning about unused flags that are
6028 // actually used, we'll lie by omission instead.
6029 // FIXME: Stop lying and consume only the appropriate driver flags
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006030 for (const Arg *A : Args.filtered(options::OPT_W_Group))
6031 A->claim();
Stephen Hines651f13c2014-04-23 16:59:28 -07006032
David Blaikie73168db2013-07-25 21:19:01 +00006033 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6034 getToolChain().getDriver());
6035
Daniel Dunbar3df23252011-04-29 17:53:18 +00006036 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006037
6038 assert(Output.isFilename() && "Unexpected lipo output.");
6039 CmdArgs.push_back("-o");
6040 CmdArgs.push_back(Output.getFilename());
6041
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006042 assert(Input.isFilename() && "Invalid input.");
6043 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006044
Daniel Dunbara001c1c2010-07-18 21:16:15 +00006045 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006046 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher708d72a2013-04-10 21:30:40 +00006047
6048 // Handle the debug info splitting at object creation time if we're
6049 // creating an object.
6050 // TODO: Currently only works on linux with newer objcopy.
6051 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006052 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00006053 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006054 SplitDebugName(Args, Input));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00006055}
6056
Stephen Hines176edba2014-12-01 14:53:08 -08006057void GnuTool::anchor() {}
6058
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006059void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006060 const InputInfo &Output,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006061 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006062 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006063 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006064 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006065
Stephen Hinesef822542014-07-21 00:47:37 -07006066 for (const auto &A : Args) {
Michael J. Spencer91e06da2012-10-19 22:37:06 +00006067 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00006068 // Don't forward any -g arguments to assembly steps.
6069 if (isa<AssembleJobAction>(JA) &&
6070 A->getOption().matches(options::OPT_g_Group))
6071 continue;
6072
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00006073 // Don't forward any -W arguments to assembly and link steps.
6074 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6075 A->getOption().matches(options::OPT_W_Group))
6076 continue;
6077
Daniel Dunbar75877192009-03-19 07:55:12 +00006078 // It is unfortunate that we have to claim here, as this means
6079 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006080 // platforms using a generic gcc, even if we are just using gcc
6081 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00006082 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00006083 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00006084 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006085 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006086
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006087 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006088
6089 // If using a driver driver, force the arch.
Bob Wilson905c45f2011-10-14 05:03:44 +00006090 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006091 CmdArgs.push_back("-arch");
Stephen Hines176edba2014-12-01 14:53:08 -08006092 CmdArgs.push_back(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006093 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006094 }
6095
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006096 // Try to force gcc to match the tool chain we want, if we recognize
6097 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00006098 //
6099 // FIXME: The triple class should directly provide the information we want
6100 // here.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006101 switch (getToolChain().getArch()) {
6102 default:
6103 break;
6104 case llvm::Triple::x86:
6105 case llvm::Triple::ppc:
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006106 CmdArgs.push_back("-m32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006107 break;
6108 case llvm::Triple::x86_64:
6109 case llvm::Triple::ppc64:
6110 case llvm::Triple::ppc64le:
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006111 CmdArgs.push_back("-m64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006112 break;
6113 case llvm::Triple::sparcel:
6114 CmdArgs.push_back("-EL");
6115 break;
6116 }
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00006117
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006118 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006119 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00006120 CmdArgs.push_back(Output.getFilename());
6121 } else {
6122 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006123 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00006124 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006125
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006126 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006127
6128 // Only pass -x if gcc will understand it; otherwise hope gcc
6129 // understands the suffix correctly. The main use case this would go
6130 // wrong in is for linker inputs if they happened to have an odd
6131 // suffix; really the only way to get this to happen is a command
6132 // like '-x foobar a.c' which will treat a.c like a linker input.
6133 //
6134 // FIXME: For the linker case specifically, can we safely convert
6135 // inputs into '-Wl,' options?
Stephen Hinesef822542014-07-21 00:47:37 -07006136 for (const auto &II : Inputs) {
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00006137 // Don't try to pass LLVM or AST inputs to a generic gcc.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006138 if (types::isLLVMIR(II.getType()))
Chris Lattner5f9e2722011-07-23 10:55:15 +00006139 D.Diag(diag::err_drv_no_linker_llvm_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006140 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00006141 else if (II.getType() == types::TY_AST)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006142 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00006143 else if (II.getType() == types::TY_ModuleFile)
6144 D.Diag(diag::err_drv_no_module_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006145 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00006146
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006147 if (types::canTypeBeUserSpecified(II.getType())) {
6148 CmdArgs.push_back("-x");
6149 CmdArgs.push_back(types::getTypeName(II.getType()));
6150 }
6151
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006152 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00006153 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00006154 else {
6155 const Arg &A = II.getInputArg();
6156
6157 // Reverse translate some rewritten options.
6158 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6159 CmdArgs.push_back("-lstdc++");
6160 continue;
6161 }
6162
Daniel Dunbar115a7922009-03-19 07:29:38 +00006163 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00006164 A.render(Args, CmdArgs);
6165 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006166 }
6167
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00006168 const std::string customGCCName = D.getCCCGenericGCCName();
6169 const char *GCCName;
6170 if (!customGCCName.empty())
6171 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00006172 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00006173 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00006174 } else
6175 GCCName = "gcc";
6176
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006177 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
6178 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006179}
6180
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006181void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6182 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006183 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006184}
6185
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006186void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6187 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00006188 const Driver &D = getToolChain().getDriver();
6189
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006190 switch (JA.getType()) {
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006191 // If -flto, etc. are present then make sure not to force assembly output.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006192 case types::TY_LLVM_IR:
6193 case types::TY_LTO_IR:
6194 case types::TY_LLVM_BC:
6195 case types::TY_LTO_BC:
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006196 CmdArgs.push_back("-c");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006197 break;
6198 case types::TY_PP_Asm:
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00006199 CmdArgs.push_back("-S");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006200 break;
6201 case types::TY_Nothing:
6202 CmdArgs.push_back("-fsyntax-only");
6203 break;
6204 default:
6205 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbar64952502010-02-11 03:16:21 +00006206 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00006207}
6208
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006209void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6210 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00006211 // The types are (hopefully) good enough.
6212}
6213
Tony Linthicum96319392011-12-12 21:14:55 +00006214// Hexagon tools start.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006215void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
6216 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00006217}
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006218
6219void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6220 const InputInfo &Output,
6221 const InputInfoList &Inputs,
6222 const ArgList &Args,
6223 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006224 claimNoWarnArgs(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00006225
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006226 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6227 const Driver &D = HTC.getDriver();
Tony Linthicum96319392011-12-12 21:14:55 +00006228 ArgStringList CmdArgs;
6229
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006230 std::string MArchString = "-march=hexagon";
6231 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum96319392011-12-12 21:14:55 +00006232
6233 RenderExtraToolArgs(JA, CmdArgs);
6234
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006235 std::string AsName = "hexagon-llvm-mc";
6236 std::string MCpuString = "-mcpu=hexagon" +
6237 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6238 CmdArgs.push_back("-filetype=obj");
6239 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6240
Tony Linthicum96319392011-12-12 21:14:55 +00006241 if (Output.isFilename()) {
6242 CmdArgs.push_back("-o");
6243 CmdArgs.push_back(Output.getFilename());
6244 } else {
6245 assert(Output.isNothing() && "Unexpected output");
6246 CmdArgs.push_back("-fsyntax-only");
6247 }
6248
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006249 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6250 std::string N = llvm::utostr(G.getValue());
6251 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6252 }
Tony Linthicum96319392011-12-12 21:14:55 +00006253
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006254 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtis3d8d4222012-12-07 17:23:04 +00006255
Tony Linthicum96319392011-12-12 21:14:55 +00006256 // Only pass -x if gcc will understand it; otherwise hope gcc
6257 // understands the suffix correctly. The main use case this would go
6258 // wrong in is for linker inputs if they happened to have an odd
6259 // suffix; really the only way to get this to happen is a command
6260 // like '-x foobar a.c' which will treat a.c like a linker input.
6261 //
6262 // FIXME: For the linker case specifically, can we safely convert
6263 // inputs into '-Wl,' options?
Stephen Hinesef822542014-07-21 00:47:37 -07006264 for (const auto &II : Inputs) {
Tony Linthicum96319392011-12-12 21:14:55 +00006265 // Don't try to pass LLVM or AST inputs to a generic gcc.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006266 if (types::isLLVMIR(II.getType()))
Tony Linthicum96319392011-12-12 21:14:55 +00006267 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006268 << HTC.getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00006269 else if (II.getType() == types::TY_AST)
6270 D.Diag(clang::diag::err_drv_no_ast_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006271 << HTC.getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00006272 else if (II.getType() == types::TY_ModuleFile)
6273 D.Diag(diag::err_drv_no_module_support)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006274 << HTC.getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00006275
6276 if (II.isFilename())
6277 CmdArgs.push_back(II.getFilename());
6278 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006279 // Don't render as input, we need gcc to do the translations.
6280 // FIXME: What is this?
Tony Linthicum96319392011-12-12 21:14:55 +00006281 II.getInputArg().render(Args, CmdArgs);
6282 }
6283
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006284 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
6285 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum96319392011-12-12 21:14:55 +00006286}
Stephen Hinesef822542014-07-21 00:47:37 -07006287
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006288void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6289 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00006290}
6291
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006292static void
6293constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6294 const toolchains::HexagonToolChain &HTC,
6295 const InputInfo &Output, const InputInfoList &Inputs,
6296 const ArgList &Args, ArgStringList &CmdArgs,
6297 const char *LinkingOutput) {
Tony Linthicum96319392011-12-12 21:14:55 +00006298
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006299 const Driver &D = HTC.getDriver();
Tony Linthicum96319392011-12-12 21:14:55 +00006300
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006301 //----------------------------------------------------------------------------
6302 //
6303 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006304 bool IsStatic = Args.hasArg(options::OPT_static);
6305 bool IsShared = Args.hasArg(options::OPT_shared);
6306 bool IsPIE = Args.hasArg(options::OPT_pie);
6307 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6308 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6309 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6310 bool UseG0 = false;
6311 bool UseShared = IsShared && !IsStatic;
Tony Linthicum96319392011-12-12 21:14:55 +00006312
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006313 //----------------------------------------------------------------------------
6314 // Silence warnings for various options
6315 //----------------------------------------------------------------------------
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006316 Args.ClaimAllArgs(options::OPT_g_Group);
6317 Args.ClaimAllArgs(options::OPT_emit_llvm);
6318 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6319 // handled somewhere else.
6320 Args.ClaimAllArgs(options::OPT_static_libgcc);
6321
6322 //----------------------------------------------------------------------------
6323 //
6324 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006325 if (Args.hasArg(options::OPT_s))
6326 CmdArgs.push_back("-s");
6327
6328 if (Args.hasArg(options::OPT_r))
6329 CmdArgs.push_back("-r");
6330
6331 for (const auto &Opt : HTC.ExtraOpts)
Stephen Hinesef822542014-07-21 00:47:37 -07006332 CmdArgs.push_back(Opt.c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00006333
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006334 CmdArgs.push_back("-march=hexagon");
6335 std::string CpuVer =
6336 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6337 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6338 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop43115d42012-01-13 20:37:10 +00006339
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006340 if (IsShared) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006341 CmdArgs.push_back("-shared");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006342 // The following should be the default, but doing as hexagon-gcc does.
6343 CmdArgs.push_back("-call_shared");
Tony Linthicum96319392011-12-12 21:14:55 +00006344 }
6345
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006346 if (IsStatic)
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006347 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00006348
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006349 if (IsPIE && !IsShared)
Matthew Curtis33c95f12012-12-06 17:49:03 +00006350 CmdArgs.push_back("-pie");
6351
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006352 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6353 std::string N = llvm::utostr(G.getValue());
6354 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6355 UseG0 = G.getValue() == 0;
Matthew Curtis33c95f12012-12-06 17:49:03 +00006356 }
6357
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006358 //----------------------------------------------------------------------------
6359 //
6360 //----------------------------------------------------------------------------
6361 CmdArgs.push_back("-o");
6362 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00006363
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006364 //----------------------------------------------------------------------------
6365 // moslib
6366 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006367 std::vector<std::string> OsLibs;
6368 bool HasStandalone = false;
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006369
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006370 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6371 A->claim();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006372 OsLibs.emplace_back(A->getValue());
6373 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00006374 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006375 if (OsLibs.empty()) {
6376 OsLibs.push_back("standalone");
6377 HasStandalone = true;
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006378 }
Tony Linthicum96319392011-12-12 21:14:55 +00006379
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006380 //----------------------------------------------------------------------------
6381 // Start Files
6382 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006383 const std::string MCpuSuffix = "/" + CpuVer;
6384 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6385 const std::string RootDir =
6386 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6387 const std::string StartSubDir =
6388 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006389
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006390 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6391 const char *Name) -> std::string {
6392 std::string RelName = SubDir + Name;
6393 std::string P = HTC.GetFilePath(RelName.c_str());
6394 if (llvm::sys::fs::exists(P))
6395 return P;
6396 return RootDir + RelName;
6397 };
6398
6399 if (IncStdLib && IncStartFiles) {
6400 if (!IsShared) {
6401 if (HasStandalone) {
6402 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6403 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006404 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006405 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6406 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006407 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006408 std::string Init = UseShared
6409 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6410 : Find(RootDir, StartSubDir, "/init.o");
6411 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006412 }
6413
6414 //----------------------------------------------------------------------------
6415 // Library Search Paths
6416 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006417 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
Stephen Hinesef822542014-07-21 00:47:37 -07006418 for (const auto &LibPath : LibPaths)
6419 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006420
6421 //----------------------------------------------------------------------------
6422 //
6423 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006424 Args.AddAllArgs(CmdArgs,
6425 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6426 options::OPT_t, options::OPT_u_Group});
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006427
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006428 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006429
6430 //----------------------------------------------------------------------------
6431 // Libraries
6432 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006433 if (IncStdLib && IncDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006434 if (D.CCCIsCXX()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006435 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006436 CmdArgs.push_back("-lm");
6437 }
6438
6439 CmdArgs.push_back("--start-group");
6440
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006441 if (!IsShared) {
6442 for (const std::string &Lib : OsLibs)
6443 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006444 CmdArgs.push_back("-lc");
6445 }
6446 CmdArgs.push_back("-lgcc");
6447
6448 CmdArgs.push_back("--end-group");
6449 }
6450
6451 //----------------------------------------------------------------------------
6452 // End files
6453 //----------------------------------------------------------------------------
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006454 if (IncStdLib && IncStartFiles) {
6455 std::string Fini = UseShared
6456 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6457 : Find(RootDir, StartSubDir, "/fini.o");
6458 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006459 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006460}
6461
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006462void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6463 const InputInfo &Output,
6464 const InputInfoList &Inputs,
6465 const ArgList &Args,
6466 const char *LinkingOutput) const {
6467 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006468
6469 ArgStringList CmdArgs;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006470 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006471 LinkingOutput);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00006472
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006473 std::string Linker = HTC.GetProgramPath("hexagon-link");
Stephen Hines176edba2014-12-01 14:53:08 -08006474 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006475 CmdArgs, Inputs));
Tony Linthicum96319392011-12-12 21:14:55 +00006476}
6477// Hexagon tools end.
6478
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006479void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6480 const InputInfo &Output,
6481 const InputInfoList &Inputs,
6482 const ArgList &Args,
6483 const char *LinkingOutput) const {
6484
6485 std::string Linker = getToolChain().GetProgramPath(getShortName());
6486 ArgStringList CmdArgs;
6487 CmdArgs.push_back("-flavor");
6488 CmdArgs.push_back("old-gnu");
6489 CmdArgs.push_back("-target");
6490 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
6491 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6492 CmdArgs.push_back("-o");
6493 CmdArgs.push_back(Output.getFilename());
6494 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6495 CmdArgs, Inputs));
6496}
6497// AMDGPU tools end.
6498
6499wasm::Linker::Linker(const ToolChain &TC)
6500 : GnuTool("wasm::Linker", "lld", TC) {}
6501
6502bool wasm::Linker::isLinkJob() const {
6503 return true;
6504}
6505
6506bool wasm::Linker::hasIntegratedCPP() const {
6507 return false;
6508}
6509
6510void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6511 const InputInfo &Output,
6512 const InputInfoList &Inputs,
6513 const ArgList &Args,
6514 const char *LinkingOutput) const {
6515 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6516 ArgStringList CmdArgs;
6517 CmdArgs.push_back("-flavor");
6518 CmdArgs.push_back("ld");
6519 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6520 CmdArgs.push_back("-o");
6521 CmdArgs.push_back(Output.getFilename());
6522 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6523}
6524
6525const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006526 std::string MArch;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006527 if (!Arch.empty())
6528 MArch = Arch;
6529 else
Stephen Hines651f13c2014-04-23 16:59:28 -07006530 MArch = Triple.getArchName();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006531 MArch = StringRef(MArch).split("+").first.lower();
Stephen Hines651f13c2014-04-23 16:59:28 -07006532
6533 // Handle -march=native.
6534 if (MArch == "native") {
6535 std::string CPU = llvm::sys::getHostCPUName();
6536 if (CPU != "generic") {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006537 // Translate the native cpu into the architecture suffix for that CPU.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006538 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006539 // If there is no valid architecture suffix for this CPU we don't know how
6540 // to handle it, so return no architecture.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006541 if (Suffix.empty())
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006542 MArch = "";
6543 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006544 MArch = std::string("arm") + Suffix.str();
Stephen Hines651f13c2014-04-23 16:59:28 -07006545 }
6546 }
6547
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006548 return MArch;
6549}
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006550
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006551/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006552StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
6553 std::string MArch = getARMArch(Arch, Triple);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006554 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6555 // here means an -march=native that we can't handle, so instead return no CPU.
6556 if (MArch.empty())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006557 return StringRef();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006558
6559 // We need to return an empty string here on invalid MArch values as the
6560 // various places that call this function can't cope with a null result.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006561 return Triple.getARMCPUForArch(MArch);
Stephen Hines651f13c2014-04-23 16:59:28 -07006562}
6563
6564/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006565std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
6566 const llvm::Triple &Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07006567 // FIXME: Warn on inconsistent use of -mcpu and -march.
6568 // If we have -mcpu=, use that.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006569 if (!CPU.empty()) {
6570 std::string MCPU = StringRef(CPU).split("+").first.lower();
Stephen Hines651f13c2014-04-23 16:59:28 -07006571 // Handle -mcpu=native.
6572 if (MCPU == "native")
6573 return llvm::sys::getHostCPUName();
6574 else
6575 return MCPU;
6576 }
6577
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006578 return getARMCPUForMArch(Arch, Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006579}
6580
6581/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006582/// CPU (or Arch, if CPU is generic).
Stephen Hines651f13c2014-04-23 16:59:28 -07006583// FIXME: This is redundant with -mcpu, why does LLVM use this.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006584StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6585 const llvm::Triple &Triple) {
6586 unsigned ArchKind;
6587 if (CPU == "generic") {
6588 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
6589 ArchKind = llvm::ARM::parseArch(ARMArch);
6590 if (ArchKind == llvm::ARM::AK_INVALID)
6591 // In case of generic Arch, i.e. "arm",
6592 // extract arch from default cpu of the Triple
6593 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
6594 } else {
6595 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6596 // armv7k triple if it's actually been specified via "-arch armv7k".
6597 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
6598 ? (unsigned)llvm::ARM::AK_ARMV7K
6599 : llvm::ARM::parseCPUArch(CPU);
6600 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006601 if (ArchKind == llvm::ARM::AK_INVALID)
6602 return "";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006603 return llvm::ARM::getSubArch(ArchKind);
Stephen Hines651f13c2014-04-23 16:59:28 -07006604}
6605
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006606void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006607 const llvm::Triple &Triple) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006608 if (Args.hasArg(options::OPT_r))
6609 return;
6610
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006611 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6612 // to generate BE-8 executables.
6613 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6614 CmdArgs.push_back("--be8");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006615}
6616
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07006617mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006618 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6619 // was first introduced in Release 3. However, other compilers have
6620 // traditionally allowed it for Release 2 so we should do the same.
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07006621 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6622 .Case("mips1", NanLegacy)
6623 .Case("mips2", NanLegacy)
6624 .Case("mips3", NanLegacy)
6625 .Case("mips4", NanLegacy)
6626 .Case("mips5", NanLegacy)
6627 .Case("mips32", NanLegacy)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006628 .Case("mips32r2", NanLegacy | Nan2008)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07006629 .Case("mips32r3", NanLegacy | Nan2008)
6630 .Case("mips32r5", NanLegacy | Nan2008)
6631 .Case("mips32r6", Nan2008)
6632 .Case("mips64", NanLegacy)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006633 .Case("mips64r2", NanLegacy | Nan2008)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07006634 .Case("mips64r3", NanLegacy | Nan2008)
6635 .Case("mips64r5", NanLegacy | Nan2008)
6636 .Case("mips64r6", Nan2008)
6637 .Default(NanLegacy);
6638}
6639
Stephen Hines651f13c2014-04-23 16:59:28 -07006640bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6641 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6642 return A && (A->getValue() == StringRef(Value));
6643}
6644
Stephen Hines176edba2014-12-01 14:53:08 -08006645bool mips::isUCLibc(const ArgList &Args) {
6646 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
6647 return A && A->getOption().matches(options::OPT_muclibc);
6648}
6649
Stephen Hinesef822542014-07-21 00:47:37 -07006650bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
6651 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6652 return llvm::StringSwitch<bool>(NaNArg->getValue())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006653 .Case("2008", true)
6654 .Case("legacy", false)
6655 .Default(false);
Stephen Hinesef822542014-07-21 00:47:37 -07006656
6657 // NaN2008 is the default for MIPS32r6/MIPS64r6.
6658 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006659 .Cases("mips32r6", "mips64r6", true)
6660 .Default(false);
Stephen Hinesef822542014-07-21 00:47:37 -07006661
6662 return false;
6663}
6664
Stephen Hines176edba2014-12-01 14:53:08 -08006665bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006666 StringRef ABIName, mips::FloatABI FloatABI) {
Stephen Hines176edba2014-12-01 14:53:08 -08006667 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
6668 Triple.getVendor() != llvm::Triple::MipsTechnologies)
6669 return false;
6670
6671 if (ABIName != "32")
6672 return false;
6673
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006674 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6675 // present.
6676 if (FloatABI == mips::FloatABI::Soft)
6677 return false;
6678
Stephen Hines176edba2014-12-01 14:53:08 -08006679 return llvm::StringSwitch<bool>(CPUName)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006680 .Cases("mips2", "mips3", "mips4", "mips5", true)
6681 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6682 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6683 .Default(false);
6684}
6685
6686bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6687 StringRef CPUName, StringRef ABIName,
6688 mips::FloatABI FloatABI) {
6689 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6690
6691 // FPXX shouldn't be used if -msingle-float is present.
6692 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6693 options::OPT_mdouble_float))
6694 if (A->getOption().matches(options::OPT_msingle_float))
6695 UseFPXX = false;
6696
6697 return UseFPXX;
Stephen Hines176edba2014-12-01 14:53:08 -08006698}
6699
Stephen Hines651f13c2014-04-23 16:59:28 -07006700llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindolacfed8282012-10-31 18:51:07 +00006701 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6702 // archs which Darwin doesn't use.
6703
6704 // The matching this routine does is fairly pointless, since it is neither the
6705 // complete architecture list, nor a reasonable subset. The problem is that
6706 // historically the driver driver accepts this and also ties its -march=
6707 // handling to the architecture name, so we need to be careful before removing
6708 // support for it.
6709
6710 // This code must be kept in sync with Clang's Darwin specific argument
6711 // translation.
6712
6713 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006714 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6715 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6716 .Case("ppc64", llvm::Triple::ppc64)
6717 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6718 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6719 llvm::Triple::x86)
6720 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6721 // This is derived from the driver driver.
6722 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6723 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6724 .Cases("armv7s", "xscale", llvm::Triple::arm)
6725 .Case("arm64", llvm::Triple::aarch64)
6726 .Case("r600", llvm::Triple::r600)
6727 .Case("amdgcn", llvm::Triple::amdgcn)
6728 .Case("nvptx", llvm::Triple::nvptx)
6729 .Case("nvptx64", llvm::Triple::nvptx64)
6730 .Case("amdil", llvm::Triple::amdil)
6731 .Case("spir", llvm::Triple::spir)
6732 .Default(llvm::Triple::UnknownArch);
Rafael Espindolacfed8282012-10-31 18:51:07 +00006733}
Tony Linthicum96319392011-12-12 21:14:55 +00006734
Stephen Hines651f13c2014-04-23 16:59:28 -07006735void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006736 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Stephen Hines651f13c2014-04-23 16:59:28 -07006737 T.setArch(Arch);
6738
6739 if (Str == "x86_64h")
6740 T.setArchName(Str);
6741 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6742 T.setOS(llvm::Triple::UnknownOS);
6743 T.setObjectFormat(llvm::Triple::MachO);
6744 }
6745}
6746
Bob Wilson66b8a662012-11-23 06:14:39 +00006747const char *Clang::getBaseInputName(const ArgList &Args,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006748 const InputInfo &Input) {
6749 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00006750}
6751
Bob Wilson66b8a662012-11-23 06:14:39 +00006752const char *Clang::getBaseInputStem(const ArgList &Args,
6753 const InputInfoList &Inputs) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07006754 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00006755
Chris Lattner657ca662011-01-16 08:14:11 +00006756 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00006757 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00006758
6759 return Str;
6760}
6761
Bob Wilson66b8a662012-11-23 06:14:39 +00006762const char *Clang::getDependencyFileName(const ArgList &Args,
6763 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00006764 // FIXME: Think about this more.
6765 std::string Res;
6766
6767 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00006768 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00006769 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00006770 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00006771 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00006772 }
Daniel Dunbar88137642009-09-09 22:32:48 +00006773 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00006774}
6775
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006776void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6777 const InputInfo &Output,
6778 const InputInfoList &Inputs,
6779 const ArgList &Args,
6780 const char *LinkingOutput) const {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006781 const ToolChain &ToolChain = getToolChain();
6782 const Driver &D = ToolChain.getDriver();
6783 ArgStringList CmdArgs;
6784
6785 // Silence warning for "clang -g foo.o -o foo"
6786 Args.ClaimAllArgs(options::OPT_g_Group);
6787 // and "clang -emit-llvm foo.o -o foo"
6788 Args.ClaimAllArgs(options::OPT_emit_llvm);
6789 // and for "clang -w foo.o -o foo". Other warning options are already
6790 // handled somewhere else.
6791 Args.ClaimAllArgs(options::OPT_w);
6792
6793 if (!D.SysRoot.empty())
6794 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6795
6796 // CloudABI only supports static linkage.
6797 CmdArgs.push_back("-Bstatic");
6798 CmdArgs.push_back("--eh-frame-hdr");
6799 CmdArgs.push_back("--gc-sections");
6800
6801 if (Output.isFilename()) {
6802 CmdArgs.push_back("-o");
6803 CmdArgs.push_back(Output.getFilename());
6804 } else {
6805 assert(Output.isNothing() && "Invalid output.");
6806 }
6807
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6810 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6811 }
6812
6813 Args.AddAllArgs(CmdArgs, options::OPT_L);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006814 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6815 Args.AddAllArgs(CmdArgs,
6816 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6817 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006818
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006819 if (D.isUsingLTO())
6820 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006821
6822 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6823
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006824 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006825 if (D.CCCIsCXX())
6826 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6827 CmdArgs.push_back("-lc");
6828 CmdArgs.push_back("-lcompiler_rt");
6829 }
6830
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006831 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006832 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6833
6834 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006835 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006836}
6837
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006838void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6839 const InputInfo &Output,
6840 const InputInfoList &Inputs,
6841 const ArgList &Args,
6842 const char *LinkingOutput) const {
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00006843 ArgStringList CmdArgs;
6844
6845 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6846 const InputInfo &Input = Inputs[0];
6847
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00006848 // Determine the original source input.
6849 const Action *SourceAction = &JA;
6850 while (SourceAction->getKind() != Action::InputClass) {
6851 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6852 SourceAction = SourceAction->getInputs()[0];
6853 }
6854
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006855 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00006856 // sure it runs its system assembler not clang's integrated assembler.
Stephen Hines651f13c2014-04-23 16:59:28 -07006857 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6858 // FIXME: at run-time detect assembler capabilities or rely on version
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006859 // information forwarded by -target-assembler-version.
Stephen Hines651f13c2014-04-23 16:59:28 -07006860 if (Args.hasArg(options::OPT_fno_integrated_as)) {
6861 const llvm::Triple &T(getToolChain().getTriple());
6862 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
6863 CmdArgs.push_back("-Q");
6864 }
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00006865
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00006866 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00006867 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00006868 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00006869 if (Args.hasArg(options::OPT_gstabs))
6870 CmdArgs.push_back("--gstabs");
6871 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00006872 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00006873 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006874
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00006875 // Derived from asm spec.
Stephen Hines651f13c2014-04-23 16:59:28 -07006876 AddMachOArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00006877
Daniel Dunbarf5438e32010-07-22 01:47:22 +00006878 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00006879 if (getToolChain().getArch() == llvm::Triple::x86 ||
6880 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00006881 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6882 CmdArgs.push_back("-force_cpusubtype_ALL");
6883
Eli Bendersky8f4269a2013-07-24 22:20:49 +00006884 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00006885 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00006886 Args.hasArg(options::OPT_fapple_kext)) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07006887 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00006888 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006889 CmdArgs.push_back("-static");
6890
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006891 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00006892
6893 assert(Output.isFilename() && "Unexpected lipo output.");
6894 CmdArgs.push_back("-o");
6895 CmdArgs.push_back(Output.getFilename());
6896
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006897 assert(Input.isFilename() && "Invalid input.");
6898 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00006899
6900 // asm_final spec is empty.
6901
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006902 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
6903 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00006904}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00006905
Stephen Hines651f13c2014-04-23 16:59:28 -07006906void darwin::MachOTool::anchor() {}
David Blaikie99ba9e32011-12-20 02:48:34 +00006907
Stephen Hines651f13c2014-04-23 16:59:28 -07006908void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6909 ArgStringList &CmdArgs) const {
6910 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00006911
Daniel Dunbar02633b52009-03-26 16:23:12 +00006912 // Derived from darwin_arch spec.
6913 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00006914 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00006915
Daniel Dunbareeff4062010-01-22 02:04:58 +00006916 // FIXME: Is this needed anymore?
6917 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00006918 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00006919}
6920
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006921bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling6acf8b42012-10-02 18:02:50 +00006922 // We only need to generate a temp path for LTO if we aren't compiling object
6923 // files. When compiling source files, we run 'dsymutil' after linking. We
6924 // don't run 'dsymutil' when compiling object files.
Stephen Hinesef822542014-07-21 00:47:37 -07006925 for (const auto &Input : Inputs)
6926 if (Input.getType() != types::TY_Object)
Bill Wendling6acf8b42012-10-02 18:02:50 +00006927 return true;
6928
6929 return false;
6930}
6931
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006932void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6933 ArgStringList &CmdArgs,
6934 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006935 const Driver &D = getToolChain().getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07006936 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00006937
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006938 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00006939 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6940 bool HadExtra;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006941 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6942 Version[2], HadExtra) ||
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00006943 HadExtra)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006944 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00006945 }
6946
Stephen Hines651f13c2014-04-23 16:59:28 -07006947 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00006948 // the user.
Stephen Hines651f13c2014-04-23 16:59:28 -07006949 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6950 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00006951
Bob Wilsonbd77c592013-08-02 22:25:34 +00006952 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6953 CmdArgs.push_back("-export_dynamic");
6954
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006955 // If we are using App Extension restrictions, pass a flag to the linker
6956 // telling it that the compiled code has been audited.
6957 if (Args.hasFlag(options::OPT_fapplication_extension,
6958 options::OPT_fno_application_extension, false))
6959 CmdArgs.push_back("-application_extension");
6960
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08006961 if (D.isUsingLTO()) {
6962 // If we are using LTO, then automatically create a temporary file path for
6963 // the linker to use, so that it's lifetime will extend past a possible
6964 // dsymutil step.
6965 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6966 const char *TmpPath = C.getArgs().MakeArgString(
6967 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6968 C.addTempFile(TmpPath);
6969 CmdArgs.push_back("-object_path_lto");
6970 CmdArgs.push_back(TmpPath);
6971 }
6972
6973 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6974 // it in clang installed libraries. If not found, the option is not used
6975 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6976 if (Version[0] >= 133) {
6977 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6978 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6979 SmallString<128> LibLTOPath(P);
6980 llvm::sys::path::append(LibLTOPath, "lib");
6981 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6982 if (llvm::sys::fs::exists(LibLTOPath)) {
6983 CmdArgs.push_back("-lto_library");
6984 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6985 } else {
6986 D.Diag(diag::warn_drv_lto_libpath);
6987 }
6988 }
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00006989 }
6990
Daniel Dunbar02633b52009-03-26 16:23:12 +00006991 // Derived from the "link" spec.
6992 Args.AddAllArgs(CmdArgs, options::OPT_static);
6993 if (!Args.hasArg(options::OPT_static))
6994 CmdArgs.push_back("-dynamic");
6995 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6996 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6997 // here. How do we wish to handle such things?
6998 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006999
Daniel Dunbar02633b52009-03-26 16:23:12 +00007000 if (!Args.hasArg(options::OPT_dynamiclib)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007001 AddMachOArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00007002 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00007003 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007004
7005 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7006 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7007 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7008
7009 Arg *A;
7010 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7011 (A = Args.getLastArg(options::OPT_current__version)) ||
7012 (A = Args.getLastArg(options::OPT_install__name)))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007013 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7014 << "-dynamiclib";
Daniel Dunbar02633b52009-03-26 16:23:12 +00007015
7016 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7017 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7018 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7019 } else {
7020 CmdArgs.push_back("-dylib");
7021
7022 Arg *A;
7023 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7024 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7025 (A = Args.getLastArg(options::OPT_client__name)) ||
7026 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7027 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7028 (A = Args.getLastArg(options::OPT_private__bundle)))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007029 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7030 << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007031
Daniel Dunbar02633b52009-03-26 16:23:12 +00007032 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7033 "-dylib_compatibility_version");
7034 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7035 "-dylib_current_version");
7036
Stephen Hines651f13c2014-04-23 16:59:28 -07007037 AddMachOArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007038
7039 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7040 "-dylib_install_name");
7041 }
7042
7043 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7044 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7045 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Stephen Hines651f13c2014-04-23 16:59:28 -07007046 if (MachOTC.isTargetIOSBased())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007047 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007048 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7049 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7050 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7051 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7052 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7053 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00007054 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007055 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7056 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7057 Args.AddAllArgs(CmdArgs, options::OPT_init);
7058
Daniel Dunbarce911f52011-04-28 21:23:41 +00007059 // Add the deployment target.
Stephen Hines651f13c2014-04-23 16:59:28 -07007060 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarce911f52011-04-28 21:23:41 +00007061
Daniel Dunbar02633b52009-03-26 16:23:12 +00007062 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7063 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7064 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7065 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7066 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007067
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007068 if (const Arg *A =
7069 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7070 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbar47e879d2010-07-13 23:31:40 +00007071 if (A->getOption().matches(options::OPT_fpie) ||
7072 A->getOption().matches(options::OPT_fPIE))
7073 CmdArgs.push_back("-pie");
7074 else
7075 CmdArgs.push_back("-no_pie");
7076 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00007077
7078 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7079 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7080 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7081 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7082 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7083 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7084 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7085 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7086 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7087 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7088 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7089 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7090 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7091 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7092 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7093 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007094
Daniel Dunbarcc957192011-05-02 21:03:47 +00007095 // Give --sysroot= preference, over the Apple specific behavior to also use
7096 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00007097 StringRef sysroot = C.getSysRoot();
7098 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00007099 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00007100 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00007101 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7102 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00007103 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007104 }
7105
Daniel Dunbar02633b52009-03-26 16:23:12 +00007106 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7107 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7108 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7109 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7110 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00007111 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007112 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7113 Args.AddAllArgs(CmdArgs, options::OPT_y);
7114 Args.AddLastArg(CmdArgs, options::OPT_w);
7115 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7116 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7117 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7118 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7119 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7120 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7121 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7122 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7123 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7124 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7125 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7126 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7127}
7128
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007129void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7130 const InputInfo &Output,
7131 const InputInfoList &Inputs,
7132 const ArgList &Args,
7133 const char *LinkingOutput) const {
Daniel Dunbar02633b52009-03-26 16:23:12 +00007134 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00007135
Stephen Hines176edba2014-12-01 14:53:08 -08007136 // If the number of arguments surpasses the system limits, we will encode the
7137 // input files in a separate file, shortening the command line. To this end,
7138 // build a list of input file names that can be passed via a file with the
7139 // -filelist linker option.
7140 llvm::opt::ArgStringList InputFileList;
7141
Daniel Dunbar02633b52009-03-26 16:23:12 +00007142 // The logic here is derived from gcc's behavior; most of which
7143 // comes from specs (starting with link_command). Consult gcc for
7144 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00007145 ArgStringList CmdArgs;
7146
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007147 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7148 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7149 options::OPT_ccc_arcmt_migrate)) {
Stephen Hinesef822542014-07-21 00:47:37 -07007150 for (const auto &Arg : Args)
7151 Arg->claim();
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007152 const char *Exec =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007153 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007154 CmdArgs.push_back(Output.getFilename());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007155 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00007156 return;
7157 }
7158
Daniel Dunbar02633b52009-03-26 16:23:12 +00007159 // I'm not sure why this particular decomposition exists in gcc, but
7160 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00007161 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007162
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007163 // It seems that the 'e' option is completely ignored for dynamic executables
7164 // (the default), and with static executables, the last one wins, as expected.
7165 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7166 options::OPT_Z_Flag, options::OPT_u_Group,
7167 options::OPT_e, options::OPT_r});
Daniel Dunbar02633b52009-03-26 16:23:12 +00007168
Daniel Dunbar270073c2010-10-18 22:08:36 +00007169 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7170 // members of static archive libraries which implement Objective-C classes or
7171 // categories.
7172 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7173 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00007174
Daniel Dunbar02633b52009-03-26 16:23:12 +00007175 CmdArgs.push_back("-o");
7176 CmdArgs.push_back(Output.getFilename());
7177
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007178 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Stephen Hines651f13c2014-04-23 16:59:28 -07007179 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007180
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007181 // SafeStack requires its own runtime libraries
7182 // These libraries should be linked first, to make sure the
7183 // __safestack_init constructor executes before everything else
7184 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7185 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7186 "libclang_rt.safestack_osx.a",
7187 /*AlwaysLink=*/true);
7188 }
7189
Daniel Dunbar02633b52009-03-26 16:23:12 +00007190 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007191
Douglas Gregor04e326b2012-05-15 21:00:27 +00007192 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -08007193 // Build the input file for -filelist (list of linker input files) in case we
7194 // need it later
7195 for (const auto &II : Inputs) {
7196 if (!II.isFilename()) {
7197 // This is a linker input argument.
7198 // We cannot mix input arguments and file names in a -filelist input, thus
7199 // we prematurely stop our list (remaining files shall be passed as
7200 // arguments).
7201 if (InputFileList.size() > 0)
7202 break;
7203
7204 continue;
7205 }
7206
7207 InputFileList.push_back(II.getFilename());
7208 }
7209
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007210 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
7211 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7212
Bob Wilson63d9f3c2012-05-15 18:57:39 +00007213 if (isObjCRuntimeLinked(Args) &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007214 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007215 // We use arclite library for both ARC and subscripting support.
7216 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7217
Bob Wilson0b1c7152012-04-21 00:21:42 +00007218 CmdArgs.push_back("-framework");
7219 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00007220 // Link libobj.
7221 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00007222 }
John McCallf85e1932011-06-15 23:02:42 +00007223
Daniel Dunbar02633b52009-03-26 16:23:12 +00007224 if (LinkingOutput) {
7225 CmdArgs.push_back("-arch_multiple");
7226 CmdArgs.push_back("-final_output");
7227 CmdArgs.push_back(LinkingOutput);
7228 }
7229
Daniel Dunbar02633b52009-03-26 16:23:12 +00007230 if (Args.hasArg(options::OPT_fnested_functions))
7231 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007232
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007233 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7234
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007235 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007236 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00007237 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00007238
Daniel Dunbar02633b52009-03-26 16:23:12 +00007239 // link_ssp spec is empty.
7240
Daniel Dunbar6cd41542009-09-18 08:15:03 +00007241 // Let the tool chain choose which runtime library to link.
Stephen Hines651f13c2014-04-23 16:59:28 -07007242 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00007243 }
7244
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007245 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00007246 // endfile_spec is empty.
7247 }
7248
7249 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7250 Args.AddAllArgs(CmdArgs, options::OPT_F);
7251
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007252 // -iframework should be forwarded as -F.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007253 for (const Arg *A : Args.filtered(options::OPT_iframework))
7254 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007255
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007256 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007257 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7258 if (A->getValue() == StringRef("Accelerate")) {
7259 CmdArgs.push_back("-framework");
7260 CmdArgs.push_back("Accelerate");
7261 }
7262 }
7263 }
7264
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007265 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Stephen Hines176edba2014-12-01 14:53:08 -08007266 std::unique_ptr<Command> Cmd =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007267 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Stephen Hines176edba2014-12-01 14:53:08 -08007268 Cmd->setInputFileList(std::move(InputFileList));
7269 C.addCommand(std::move(Cmd));
Daniel Dunbar02633b52009-03-26 16:23:12 +00007270}
7271
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007272void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007273 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00007274 const InputInfoList &Inputs,
7275 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007276 const char *LinkingOutput) const {
7277 ArgStringList CmdArgs;
7278
7279 CmdArgs.push_back("-create");
7280 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00007281
7282 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007283 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00007284
Stephen Hinesef822542014-07-21 00:47:37 -07007285 for (const auto &II : Inputs) {
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007286 assert(II.isFilename() && "Unexpected lipo input.");
7287 CmdArgs.push_back(II.getFilename());
7288 }
Stephen Hinesef822542014-07-21 00:47:37 -07007289
7290 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00007292}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007293
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007294void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007295 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007296 const InputInfoList &Inputs,
7297 const ArgList &Args,
7298 const char *LinkingOutput) const {
7299 ArgStringList CmdArgs;
7300
Daniel Dunbar03e92302011-05-09 17:23:16 +00007301 CmdArgs.push_back("-o");
7302 CmdArgs.push_back(Output.getFilename());
7303
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007304 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7305 const InputInfo &Input = Inputs[0];
7306 assert(Input.isFilename() && "Unexpected dsymutil input.");
7307 CmdArgs.push_back(Input.getFilename());
7308
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007309 const char *Exec =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007310 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
7311 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00007312}
7313
Eric Christopherf8571862011-08-23 17:56:55 +00007314void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00007315 const InputInfo &Output,
7316 const InputInfoList &Inputs,
7317 const ArgList &Args,
7318 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00007319 ArgStringList CmdArgs;
7320 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00007321 CmdArgs.push_back("--debug-info");
7322 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00007323 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00007324
7325 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7326 const InputInfo &Input = Inputs[0];
7327 assert(Input.isFilename() && "Unexpected verify input");
7328
7329 // Grabbing the output of the earlier dsymutil run.
7330 CmdArgs.push_back(Input.getFilename());
7331
7332 const char *Exec =
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007333 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
7334 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopherf8571862011-08-23 17:56:55 +00007335}
7336
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007337void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnall31c46902012-02-15 13:39:01 +00007338 const InputInfo &Output,
7339 const InputInfoList &Inputs,
7340 const ArgList &Args,
7341 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007342 claimNoWarnArgs(Args);
David Chisnall31c46902012-02-15 13:39:01 +00007343 ArgStringList CmdArgs;
7344
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007345 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnall31c46902012-02-15 13:39:01 +00007346
7347 CmdArgs.push_back("-o");
7348 CmdArgs.push_back(Output.getFilename());
7349
Stephen Hinesef822542014-07-21 00:47:37 -07007350 for (const auto &II : Inputs)
David Chisnall31c46902012-02-15 13:39:01 +00007351 CmdArgs.push_back(II.getFilename());
David Chisnall31c46902012-02-15 13:39:01 +00007352
Stephen Hinesef822542014-07-21 00:47:37 -07007353 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007354 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnall31c46902012-02-15 13:39:01 +00007355}
7356
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007357void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7358 const InputInfo &Output,
7359 const InputInfoList &Inputs,
7360 const ArgList &Args,
7361 const char *LinkingOutput) const {
David Chisnall31c46902012-02-15 13:39:01 +00007362 ArgStringList CmdArgs;
7363
David Chisnall41d476d2012-02-29 15:06:12 +00007364 // Demangle C++ names in errors
7365 CmdArgs.push_back("-C");
7366
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007367 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnall31c46902012-02-15 13:39:01 +00007368 CmdArgs.push_back("-e");
7369 CmdArgs.push_back("_start");
7370 }
7371
7372 if (Args.hasArg(options::OPT_static)) {
7373 CmdArgs.push_back("-Bstatic");
7374 CmdArgs.push_back("-dn");
7375 } else {
7376 CmdArgs.push_back("-Bdynamic");
7377 if (Args.hasArg(options::OPT_shared)) {
7378 CmdArgs.push_back("-shared");
7379 } else {
7380 CmdArgs.push_back("--dynamic-linker");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007381 CmdArgs.push_back(
7382 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnall31c46902012-02-15 13:39:01 +00007383 }
7384 }
7385
7386 if (Output.isFilename()) {
7387 CmdArgs.push_back("-o");
7388 CmdArgs.push_back(Output.getFilename());
7389 } else {
7390 assert(Output.isNothing() && "Invalid output.");
7391 }
7392
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007393 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
7394 if (!Args.hasArg(options::OPT_shared))
7395 CmdArgs.push_back(
7396 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7397
7398 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7399 CmdArgs.push_back(
7400 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7401 CmdArgs.push_back(
7402 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnall31c46902012-02-15 13:39:01 +00007403 }
7404
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007405 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnall31c46902012-02-15 13:39:01 +00007406
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007407 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7408 options::OPT_e, options::OPT_r});
David Chisnall31c46902012-02-15 13:39:01 +00007409
7410 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7411
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007412 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007413 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00007414 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00007415 CmdArgs.push_back("-lgcc_s");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007416 CmdArgs.push_back("-lc");
David Chisnall165329c2012-02-28 17:10:04 +00007417 if (!Args.hasArg(options::OPT_shared)) {
7418 CmdArgs.push_back("-lgcc");
David Chisnall7dbefe12012-02-28 20:06:45 +00007419 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00007420 }
David Chisnall31c46902012-02-15 13:39:01 +00007421 }
7422
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007423 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
7424 CmdArgs.push_back(
7425 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnall31c46902012-02-15 13:39:01 +00007426 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007427 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnall31c46902012-02-15 13:39:01 +00007428
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007429 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnall31c46902012-02-15 13:39:01 +00007430
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007431 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
7432 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00007433}
7434
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007435void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7436 const InputInfo &Output,
7437 const InputInfoList &Inputs,
7438 const ArgList &Args,
7439 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007440 claimNoWarnArgs(Args);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007441 ArgStringList CmdArgs;
7442
Stephen Hines651f13c2014-04-23 16:59:28 -07007443 switch (getToolChain().getArch()) {
7444 case llvm::Triple::x86:
7445 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7446 // instruct as in the base system to assemble 32-bit code.
Bill Wendlingac66cb82013-12-08 00:21:01 +00007447 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07007448 break;
7449
7450 case llvm::Triple::ppc:
Bill Wendlingac66cb82013-12-08 00:21:01 +00007451 CmdArgs.push_back("-mppc");
7452 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07007453 break;
7454
7455 case llvm::Triple::sparc:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007456 case llvm::Triple::sparcel: {
Stephen Hines651f13c2014-04-23 16:59:28 -07007457 CmdArgs.push_back("-32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007458 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7459 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7460 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07007461 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007462 }
Stephen Hines651f13c2014-04-23 16:59:28 -07007463
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007464 case llvm::Triple::sparcv9: {
Stephen Hines651f13c2014-04-23 16:59:28 -07007465 CmdArgs.push_back("-64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007466 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7467 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7468 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07007469 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007470 }
Stephen Hines651f13c2014-04-23 16:59:28 -07007471
7472 case llvm::Triple::mips64:
7473 case llvm::Triple::mips64el: {
Bill Wendlingac66cb82013-12-08 00:21:01 +00007474 StringRef CPUName;
7475 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08007476 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Bill Wendlingac66cb82013-12-08 00:21:01 +00007477
7478 CmdArgs.push_back("-mabi");
7479 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7480
7481 if (getToolChain().getArch() == llvm::Triple::mips64)
7482 CmdArgs.push_back("-EB");
7483 else
7484 CmdArgs.push_back("-EL");
7485
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007486 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07007487 break;
Bill Wendlingac66cb82013-12-08 00:21:01 +00007488 }
7489
Stephen Hines651f13c2014-04-23 16:59:28 -07007490 default:
7491 break;
7492 }
7493
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007494 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007495
7496 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007497 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007498
Stephen Hinesef822542014-07-21 00:47:37 -07007499 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007500 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007501
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007502 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
7503 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007504}
7505
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007506void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7507 const InputInfo &Output,
7508 const InputInfoList &Inputs,
7509 const ArgList &Args,
7510 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00007511 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007512 ArgStringList CmdArgs;
7513
Rafael Espindola6cc2a682012-12-31 22:41:36 +00007514 // Silence warning for "clang -g foo.o -o foo"
7515 Args.ClaimAllArgs(options::OPT_g_Group);
7516 // and "clang -emit-llvm foo.o -o foo"
7517 Args.ClaimAllArgs(options::OPT_emit_llvm);
7518 // and for "clang -w foo.o -o foo". Other warning options are already
7519 // handled somewhere else.
7520 Args.ClaimAllArgs(options::OPT_w);
7521
Bill Wendlingac66cb82013-12-08 00:21:01 +00007522 if (getToolChain().getArch() == llvm::Triple::mips64)
7523 CmdArgs.push_back("-EB");
7524 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7525 CmdArgs.push_back("-EL");
7526
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007527 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00007528 CmdArgs.push_back("-e");
7529 CmdArgs.push_back("__start");
7530 }
7531
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007532 if (Args.hasArg(options::OPT_static)) {
7533 CmdArgs.push_back("-Bstatic");
7534 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00007535 if (Args.hasArg(options::OPT_rdynamic))
7536 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007537 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00007538 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007539 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00007540 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007541 } else {
7542 CmdArgs.push_back("-dynamic-linker");
7543 CmdArgs.push_back("/usr/libexec/ld.so");
7544 }
7545 }
7546
Rafael Espindola9adba392013-06-05 04:28:55 +00007547 if (Args.hasArg(options::OPT_nopie))
7548 CmdArgs.push_back("-nopie");
7549
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007550 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007551 CmdArgs.push_back("-o");
7552 CmdArgs.push_back(Output.getFilename());
7553 } else {
7554 assert(Output.isNothing() && "Invalid output.");
7555 }
7556
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007557 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007558 if (!Args.hasArg(options::OPT_shared)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007559 if (Args.hasArg(options::OPT_pg))
7560 CmdArgs.push_back(
7561 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman62d829a2011-12-15 02:15:56 +00007562 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007563 CmdArgs.push_back(
7564 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7565 CmdArgs.push_back(
7566 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007567 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007568 CmdArgs.push_back(
7569 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007570 }
7571 }
7572
Edward O'Callaghane7e18202009-10-28 15:13:08 +00007573 std::string Triple = getToolChain().getTripleString();
7574 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00007575 Triple.replace(0, 6, "amd64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007576 CmdArgs.push_back(
7577 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00007578
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007579 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7580 options::OPT_e, options::OPT_s, options::OPT_t,
7581 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007582
Daniel Dunbar2008fee2010-09-17 00:24:54 +00007583 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007584
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007585 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007586 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00007587 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007588 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00007589 CmdArgs.push_back("-lm_p");
7590 else
7591 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00007592 }
7593
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00007594 // FIXME: For some reason GCC passes -lgcc before adding
7595 // the default system libraries. Just mimic this for now.
7596 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007597
Eric Christopherdc6cc872012-09-13 06:32:34 +00007598 if (Args.hasArg(options::OPT_pthread)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007599 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7600 CmdArgs.push_back("-lpthread_p");
Eric Christopherdc6cc872012-09-13 06:32:34 +00007601 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007602 CmdArgs.push_back("-lpthread");
Eric Christopherdc6cc872012-09-13 06:32:34 +00007603 }
7604
Chandler Carruth657849c2011-12-17 22:32:42 +00007605 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00007606 if (Args.hasArg(options::OPT_pg))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007607 CmdArgs.push_back("-lc_p");
Eli Friedman62d829a2011-12-15 02:15:56 +00007608 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007609 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00007610 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00007611
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00007612 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007613 }
7614
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007615 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007616 if (!Args.hasArg(options::OPT_shared))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007617 CmdArgs.push_back(
7618 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007619 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007620 CmdArgs.push_back(
7621 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007622 }
7623
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007624 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
7625 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00007626}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00007627
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007628void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7629 const InputInfo &Output,
7630 const InputInfoList &Inputs,
7631 const ArgList &Args,
7632 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007633 claimNoWarnArgs(Args);
Eli Friedman42f74f22012-08-08 23:57:20 +00007634 ArgStringList CmdArgs;
7635
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007636 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman42f74f22012-08-08 23:57:20 +00007637
7638 CmdArgs.push_back("-o");
7639 CmdArgs.push_back(Output.getFilename());
7640
Stephen Hinesef822542014-07-21 00:47:37 -07007641 for (const auto &II : Inputs)
Eli Friedman42f74f22012-08-08 23:57:20 +00007642 CmdArgs.push_back(II.getFilename());
Eli Friedman42f74f22012-08-08 23:57:20 +00007643
Stephen Hinesef822542014-07-21 00:47:37 -07007644 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007645 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman42f74f22012-08-08 23:57:20 +00007646}
7647
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007648void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7649 const InputInfo &Output,
7650 const InputInfoList &Inputs,
7651 const ArgList &Args,
7652 const char *LinkingOutput) const {
Eli Friedman42f74f22012-08-08 23:57:20 +00007653 const Driver &D = getToolChain().getDriver();
7654 ArgStringList CmdArgs;
7655
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007656 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman42f74f22012-08-08 23:57:20 +00007657 CmdArgs.push_back("-e");
7658 CmdArgs.push_back("__start");
7659 }
7660
7661 if (Args.hasArg(options::OPT_static)) {
7662 CmdArgs.push_back("-Bstatic");
7663 } else {
7664 if (Args.hasArg(options::OPT_rdynamic))
7665 CmdArgs.push_back("-export-dynamic");
7666 CmdArgs.push_back("--eh-frame-hdr");
7667 CmdArgs.push_back("-Bdynamic");
7668 if (Args.hasArg(options::OPT_shared)) {
7669 CmdArgs.push_back("-shared");
7670 } else {
7671 CmdArgs.push_back("-dynamic-linker");
7672 CmdArgs.push_back("/usr/libexec/ld.so");
7673 }
7674 }
7675
7676 if (Output.isFilename()) {
7677 CmdArgs.push_back("-o");
7678 CmdArgs.push_back(Output.getFilename());
7679 } else {
7680 assert(Output.isNothing() && "Invalid output.");
7681 }
7682
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007683 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman42f74f22012-08-08 23:57:20 +00007684 if (!Args.hasArg(options::OPT_shared)) {
7685 if (Args.hasArg(options::OPT_pg))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007686 CmdArgs.push_back(
7687 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00007688 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007689 CmdArgs.push_back(
7690 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7691 CmdArgs.push_back(
7692 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00007693 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007694 CmdArgs.push_back(
7695 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00007696 }
7697 }
7698
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007699 Args.AddAllArgs(CmdArgs,
7700 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman42f74f22012-08-08 23:57:20 +00007701
7702 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7703
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007704 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007705 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00007706 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7707 if (Args.hasArg(options::OPT_pg))
7708 CmdArgs.push_back("-lm_p");
7709 else
7710 CmdArgs.push_back("-lm");
7711 }
7712
Rafael Espindola3667bbe2012-10-23 17:07:31 +00007713 if (Args.hasArg(options::OPT_pthread)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007714 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola3667bbe2012-10-23 17:07:31 +00007715 CmdArgs.push_back("-lpthread_p");
7716 else
7717 CmdArgs.push_back("-lpthread");
7718 }
7719
Eli Friedman42f74f22012-08-08 23:57:20 +00007720 if (!Args.hasArg(options::OPT_shared)) {
7721 if (Args.hasArg(options::OPT_pg))
7722 CmdArgs.push_back("-lc_p");
7723 else
7724 CmdArgs.push_back("-lc");
7725 }
7726
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00007727 StringRef MyArch;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007728 switch (getToolChain().getArch()) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00007729 case llvm::Triple::arm:
7730 MyArch = "arm";
7731 break;
7732 case llvm::Triple::x86:
7733 MyArch = "i386";
7734 break;
7735 case llvm::Triple::x86_64:
7736 MyArch = "amd64";
7737 break;
7738 default:
7739 llvm_unreachable("Unsupported architecture");
7740 }
7741 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00007742 }
7743
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007744 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman42f74f22012-08-08 23:57:20 +00007745 if (!Args.hasArg(options::OPT_shared))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007746 CmdArgs.push_back(
7747 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00007748 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007749 CmdArgs.push_back(
7750 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman42f74f22012-08-08 23:57:20 +00007751 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00007752
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007753 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
7754 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman42f74f22012-08-08 23:57:20 +00007755}
7756
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007757void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7758 const InputInfo &Output,
7759 const InputInfoList &Inputs,
7760 const ArgList &Args,
7761 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007762 claimNoWarnArgs(Args);
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007763 ArgStringList CmdArgs;
7764
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007765 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7766 // instruct as in the base system to assemble 32-bit code.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007767 switch (getToolChain().getArch()) {
7768 default:
7769 break;
7770 case llvm::Triple::x86:
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007771 CmdArgs.push_back("--32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007772 break;
7773 case llvm::Triple::ppc:
Roman Divacky3393cef2011-06-04 07:37:31 +00007774 CmdArgs.push_back("-a32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007775 break;
7776 case llvm::Triple::mips:
7777 case llvm::Triple::mipsel:
7778 case llvm::Triple::mips64:
7779 case llvm::Triple::mips64el: {
Eric Christopherc55da4b2012-09-05 21:32:44 +00007780 StringRef CPUName;
7781 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08007782 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00007783
Eric Christopherc55da4b2012-09-05 21:32:44 +00007784 CmdArgs.push_back("-march");
7785 CmdArgs.push_back(CPUName.data());
7786
Eric Christopherc55da4b2012-09-05 21:32:44 +00007787 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00007788 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00007789
7790 if (getToolChain().getArch() == llvm::Triple::mips ||
7791 getToolChain().getArch() == llvm::Triple::mips64)
7792 CmdArgs.push_back("-EB");
7793 else
7794 CmdArgs.push_back("-EL");
7795
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007796 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
7797 break;
7798 }
7799 case llvm::Triple::arm:
7800 case llvm::Triple::armeb:
7801 case llvm::Triple::thumb:
7802 case llvm::Triple::thumbeb: {
7803 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07007804
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007805 if (ABI == arm::FloatABI::Hard)
Stephen Hines651f13c2014-04-23 16:59:28 -07007806 CmdArgs.push_back("-mfpu=vfp");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007807 else
Stephen Hines651f13c2014-04-23 16:59:28 -07007808 CmdArgs.push_back("-mfpu=softvfp");
Stephen Hines651f13c2014-04-23 16:59:28 -07007809
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007810 switch (getToolChain().getTriple().getEnvironment()) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007811 case llvm::Triple::GNUEABIHF:
Rafael Espindola27fa2362012-12-13 04:17:14 +00007812 case llvm::Triple::GNUEABI:
7813 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00007814 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00007815 break;
7816
7817 default:
7818 CmdArgs.push_back("-matpcs");
7819 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007820 break;
7821 }
7822 case llvm::Triple::sparc:
7823 case llvm::Triple::sparcel:
7824 case llvm::Triple::sparcv9: {
7825 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7826 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7827 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
7828 break;
7829 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00007830 }
Eric Christophered734732010-03-02 02:41:08 +00007831
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007832 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007833
7834 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007835 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007836
Stephen Hinesef822542014-07-21 00:47:37 -07007837 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007838 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007839
Stephen Hinesef822542014-07-21 00:47:37 -07007840 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007841 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00007842}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007843
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007844void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7845 const InputInfo &Output,
7846 const InputInfoList &Inputs,
7847 const ArgList &Args,
7848 const char *LinkingOutput) const {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007849 const toolchains::FreeBSD &ToolChain =
7850 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divacky94380162012-08-28 15:09:03 +00007851 const Driver &D = ToolChain.getDriver();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007852 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Stephen Hines651f13c2014-04-23 16:59:28 -07007853 const bool IsPIE =
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007854 !Args.hasArg(options::OPT_shared) &&
7855 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007856 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00007857
7858 // Silence warning for "clang -g foo.o -o foo"
7859 Args.ClaimAllArgs(options::OPT_g_Group);
7860 // and "clang -emit-llvm foo.o -o foo"
7861 Args.ClaimAllArgs(options::OPT_emit_llvm);
7862 // and for "clang -w foo.o -o foo". Other warning options are already
7863 // handled somewhere else.
7864 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007865
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00007866 if (!D.SysRoot.empty())
7867 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7868
Stephen Hines651f13c2014-04-23 16:59:28 -07007869 if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00007870 CmdArgs.push_back("-pie");
7871
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007872 if (Args.hasArg(options::OPT_static)) {
7873 CmdArgs.push_back("-Bstatic");
7874 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00007875 if (Args.hasArg(options::OPT_rdynamic))
7876 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007877 CmdArgs.push_back("--eh-frame-hdr");
7878 if (Args.hasArg(options::OPT_shared)) {
7879 CmdArgs.push_back("-Bshareable");
7880 } else {
7881 CmdArgs.push_back("-dynamic-linker");
7882 CmdArgs.push_back("/libexec/ld-elf.so.1");
7883 }
Roman Divacky94380162012-08-28 15:09:03 +00007884 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnalldfa210b2012-07-29 15:24:44 +00007885 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7886 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7887 CmdArgs.push_back("--hash-style=both");
7888 }
7889 }
7890 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007891 }
7892
7893 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7894 // instruct ld in the base system to link 32-bit code.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007895 if (Arch == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007896 CmdArgs.push_back("-m");
7897 CmdArgs.push_back("elf_i386_fbsd");
7898 }
7899
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07007900 if (Arch == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00007901 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00007902 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00007903 }
7904
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007905 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007906 CmdArgs.push_back("-o");
7907 CmdArgs.push_back(Output.getFilename());
7908 } else {
7909 assert(Output.isNothing() && "Invalid output.");
7910 }
7911
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007912 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007913 const char *crt1 = nullptr;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007914 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00007915 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00007916 crt1 = "gcrt1.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07007917 else if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00007918 crt1 = "Scrt1.o";
7919 else
7920 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007921 }
Roman Divacky94380162012-08-28 15:09:03 +00007922 if (crt1)
7923 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7924
7925 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7926
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007927 const char *crtbegin = nullptr;
Roman Divacky94380162012-08-28 15:09:03 +00007928 if (Args.hasArg(options::OPT_static))
7929 crtbegin = "crtbeginT.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07007930 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00007931 crtbegin = "crtbeginS.o";
7932 else
7933 crtbegin = "crtbegin.o";
7934
7935 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007936 }
7937
7938 Args.AddAllArgs(CmdArgs, options::OPT_L);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007939 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007940 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7941 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00007942 Args.AddAllArgs(CmdArgs, options::OPT_s);
7943 Args.AddAllArgs(CmdArgs, options::OPT_t);
7944 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7945 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007946
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007947 if (D.isUsingLTO())
7948 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackydb334192013-11-10 09:31:43 +00007949
Stephen Hines176edba2014-12-01 14:53:08 -08007950 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divacky94380162012-08-28 15:09:03 +00007951 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007952
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08007953 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
7954 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg76b86c22013-07-18 20:29:38 +00007955 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00007956 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00007957 if (Args.hasArg(options::OPT_pg))
7958 CmdArgs.push_back("-lm_p");
7959 else
7960 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00007961 }
Stephen Hines176edba2014-12-01 14:53:08 -08007962 if (NeedsSanitizerDeps)
7963 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007964 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7965 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00007966 if (Args.hasArg(options::OPT_pg))
7967 CmdArgs.push_back("-lgcc_p");
7968 else
7969 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007970 if (Args.hasArg(options::OPT_static)) {
7971 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00007972 } else if (Args.hasArg(options::OPT_pg)) {
7973 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007974 } else {
7975 CmdArgs.push_back("--as-needed");
7976 CmdArgs.push_back("-lgcc_s");
7977 CmdArgs.push_back("--no-as-needed");
7978 }
7979
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00007980 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00007981 if (Args.hasArg(options::OPT_pg))
7982 CmdArgs.push_back("-lpthread_p");
7983 else
7984 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00007985 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007986
Roman Divackyc16bb762011-02-10 16:59:40 +00007987 if (Args.hasArg(options::OPT_pg)) {
7988 if (Args.hasArg(options::OPT_shared))
7989 CmdArgs.push_back("-lc");
7990 else
7991 CmdArgs.push_back("-lc_p");
7992 CmdArgs.push_back("-lgcc_p");
7993 } else {
7994 CmdArgs.push_back("-lc");
7995 CmdArgs.push_back("-lgcc");
7996 }
7997
Daniel Dunbar008f54a2009-04-01 19:36:32 +00007998 if (Args.hasArg(options::OPT_static)) {
7999 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00008000 } else if (Args.hasArg(options::OPT_pg)) {
8001 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008002 } else {
8003 CmdArgs.push_back("--as-needed");
8004 CmdArgs.push_back("-lgcc_s");
8005 CmdArgs.push_back("--no-as-needed");
8006 }
8007 }
8008
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008009 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07008010 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00008011 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00008012 else
8013 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00008014 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008015 }
8016
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008017 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00008018
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008019 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
8020 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00008021}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00008022
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008023void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008024 const InputInfo &Output,
8025 const InputInfoList &Inputs,
8026 const ArgList &Args,
8027 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008028 claimNoWarnArgs(Args);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008029 ArgStringList CmdArgs;
8030
Stephen Hines651f13c2014-04-23 16:59:28 -07008031 // GNU as needs different flags for creating the correct output format
8032 // on architectures with different ABIs or optional feature sets.
8033 switch (getToolChain().getArch()) {
8034 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008035 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07008036 break;
8037 case llvm::Triple::arm:
8038 case llvm::Triple::armeb:
8039 case llvm::Triple::thumb:
8040 case llvm::Triple::thumbeb: {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008041 StringRef MArch, MCPU;
8042 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8043 std::string Arch =
8044 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
8045 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Stephen Hines651f13c2014-04-23 16:59:28 -07008046 break;
Bill Wendlingcf660bd2013-12-06 19:12:36 +00008047 }
8048
Stephen Hines651f13c2014-04-23 16:59:28 -07008049 case llvm::Triple::mips:
8050 case llvm::Triple::mipsel:
8051 case llvm::Triple::mips64:
8052 case llvm::Triple::mips64el: {
Bill Wendlingc54c8852013-12-09 02:59:27 +00008053 StringRef CPUName;
8054 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08008055 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Bill Wendlingc54c8852013-12-09 02:59:27 +00008056
8057 CmdArgs.push_back("-march");
8058 CmdArgs.push_back(CPUName.data());
8059
8060 CmdArgs.push_back("-mabi");
8061 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8062
8063 if (getToolChain().getArch() == llvm::Triple::mips ||
8064 getToolChain().getArch() == llvm::Triple::mips64)
8065 CmdArgs.push_back("-EB");
8066 else
8067 CmdArgs.push_back("-EL");
8068
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008069 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07008070 break;
8071 }
8072
8073 case llvm::Triple::sparc:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008074 case llvm::Triple::sparcel: {
Stephen Hines651f13c2014-04-23 16:59:28 -07008075 CmdArgs.push_back("-32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008076 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8077 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8078 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07008079 break;
Bill Wendlingc54c8852013-12-09 02:59:27 +00008080 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008081
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008082 case llvm::Triple::sparcv9: {
8083 CmdArgs.push_back("-64");
8084 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8085 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8086 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
8087 break;
8088 }
8089
8090 default:
8091 break;
8092 }
8093
8094 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008095
8096 CmdArgs.push_back("-o");
8097 CmdArgs.push_back(Output.getFilename());
8098
Stephen Hinesef822542014-07-21 00:47:37 -07008099 for (const auto &II : Inputs)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008100 CmdArgs.push_back(II.getFilename());
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008101
David Chisnall5adcec12011-09-27 22:03:18 +00008102 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008103 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008104}
8105
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008106void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8107 const InputInfo &Output,
8108 const InputInfoList &Inputs,
8109 const ArgList &Args,
8110 const char *LinkingOutput) const {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008111 const Driver &D = getToolChain().getDriver();
8112 ArgStringList CmdArgs;
8113
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00008114 if (!D.SysRoot.empty())
8115 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8116
Stephen Hines651f13c2014-04-23 16:59:28 -07008117 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008118 if (Args.hasArg(options::OPT_static)) {
8119 CmdArgs.push_back("-Bstatic");
8120 } else {
8121 if (Args.hasArg(options::OPT_rdynamic))
8122 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008123 if (Args.hasArg(options::OPT_shared)) {
8124 CmdArgs.push_back("-Bshareable");
8125 } else {
8126 CmdArgs.push_back("-dynamic-linker");
8127 CmdArgs.push_back("/libexec/ld.elf_so");
8128 }
8129 }
8130
Stephen Hines651f13c2014-04-23 16:59:28 -07008131 // Many NetBSD architectures support more than one ABI.
8132 // Determine the correct emulation for ld.
8133 switch (getToolChain().getArch()) {
8134 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008135 CmdArgs.push_back("-m");
8136 CmdArgs.push_back("elf_i386");
Stephen Hines651f13c2014-04-23 16:59:28 -07008137 break;
8138 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07008139 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07008140 CmdArgs.push_back("-m");
8141 switch (getToolChain().getTriple().getEnvironment()) {
8142 case llvm::Triple::EABI:
8143 case llvm::Triple::GNUEABI:
8144 CmdArgs.push_back("armelf_nbsd_eabi");
8145 break;
8146 case llvm::Triple::EABIHF:
8147 case llvm::Triple::GNUEABIHF:
8148 CmdArgs.push_back("armelf_nbsd_eabihf");
8149 break;
8150 default:
8151 CmdArgs.push_back("armelf_nbsd");
8152 break;
8153 }
8154 break;
Stephen Hines176edba2014-12-01 14:53:08 -08008155 case llvm::Triple::armeb:
8156 case llvm::Triple::thumbeb:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008157 arm::appendEBLinkFlags(
8158 Args, CmdArgs,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008159 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Stephen Hines176edba2014-12-01 14:53:08 -08008160 CmdArgs.push_back("-m");
8161 switch (getToolChain().getTriple().getEnvironment()) {
8162 case llvm::Triple::EABI:
8163 case llvm::Triple::GNUEABI:
8164 CmdArgs.push_back("armelfb_nbsd_eabi");
8165 break;
8166 case llvm::Triple::EABIHF:
8167 case llvm::Triple::GNUEABIHF:
8168 CmdArgs.push_back("armelfb_nbsd_eabihf");
8169 break;
8170 default:
8171 CmdArgs.push_back("armelfb_nbsd");
8172 break;
8173 }
8174 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07008175 case llvm::Triple::mips64:
8176 case llvm::Triple::mips64el:
8177 if (mips::hasMipsAbiArg(Args, "32")) {
8178 CmdArgs.push_back("-m");
8179 if (getToolChain().getArch() == llvm::Triple::mips64)
8180 CmdArgs.push_back("elf32btsmip");
8181 else
8182 CmdArgs.push_back("elf32ltsmip");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008183 } else if (mips::hasMipsAbiArg(Args, "64")) {
8184 CmdArgs.push_back("-m");
8185 if (getToolChain().getArch() == llvm::Triple::mips64)
8186 CmdArgs.push_back("elf64btsmip");
8187 else
8188 CmdArgs.push_back("elf64ltsmip");
8189 }
8190 break;
Stephen Hines176edba2014-12-01 14:53:08 -08008191 case llvm::Triple::ppc:
8192 CmdArgs.push_back("-m");
8193 CmdArgs.push_back("elf32ppc_nbsd");
8194 break;
8195
8196 case llvm::Triple::ppc64:
8197 case llvm::Triple::ppc64le:
8198 CmdArgs.push_back("-m");
8199 CmdArgs.push_back("elf64ppc");
8200 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07008201
8202 case llvm::Triple::sparc:
8203 CmdArgs.push_back("-m");
8204 CmdArgs.push_back("elf32_sparc");
8205 break;
8206
8207 case llvm::Triple::sparcv9:
8208 CmdArgs.push_back("-m");
8209 CmdArgs.push_back("elf64_sparc");
8210 break;
8211
8212 default:
8213 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008214 }
8215
8216 if (Output.isFilename()) {
8217 CmdArgs.push_back("-o");
8218 CmdArgs.push_back(Output.getFilename());
8219 } else {
8220 assert(Output.isNothing() && "Invalid output.");
8221 }
8222
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008223 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008224 if (!Args.hasArg(options::OPT_shared)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008225 CmdArgs.push_back(
8226 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8227 CmdArgs.push_back(
8228 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8229 CmdArgs.push_back(
8230 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008231 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008232 CmdArgs.push_back(
8233 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8234 CmdArgs.push_back(
8235 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008236 }
8237 }
8238
8239 Args.AddAllArgs(CmdArgs, options::OPT_L);
8240 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8241 Args.AddAllArgs(CmdArgs, options::OPT_e);
8242 Args.AddAllArgs(CmdArgs, options::OPT_s);
8243 Args.AddAllArgs(CmdArgs, options::OPT_t);
8244 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8245 Args.AddAllArgs(CmdArgs, options::OPT_r);
8246
8247 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8248
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008249 unsigned Major, Minor, Micro;
8250 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8251 bool useLibgcc = true;
Stephen Hines176edba2014-12-01 14:53:08 -08008252 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008253 switch (getToolChain().getArch()) {
Stephen Hines176edba2014-12-01 14:53:08 -08008254 case llvm::Triple::aarch64:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008255 case llvm::Triple::arm:
8256 case llvm::Triple::armeb:
8257 case llvm::Triple::thumb:
8258 case llvm::Triple::thumbeb:
Stephen Hines176edba2014-12-01 14:53:08 -08008259 case llvm::Triple::ppc:
8260 case llvm::Triple::ppc64:
8261 case llvm::Triple::ppc64le:
Stephen Hines651f13c2014-04-23 16:59:28 -07008262 case llvm::Triple::x86:
8263 case llvm::Triple::x86_64:
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008264 useLibgcc = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07008265 break;
8266 default:
8267 break;
8268 }
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008269 }
8270
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008271 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
8272 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg76b86c22013-07-18 20:29:38 +00008273 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008274 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8275 CmdArgs.push_back("-lm");
8276 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008277 if (Args.hasArg(options::OPT_pthread))
8278 CmdArgs.push_back("-lpthread");
8279 CmdArgs.push_back("-lc");
8280
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00008281 if (useLibgcc) {
8282 if (Args.hasArg(options::OPT_static)) {
8283 // libgcc_eh depends on libc, so resolve as much as possible,
8284 // pull in any new requirements from libc and then get the rest
8285 // of libgcc.
8286 CmdArgs.push_back("-lgcc_eh");
8287 CmdArgs.push_back("-lc");
8288 CmdArgs.push_back("-lgcc");
8289 } else {
8290 CmdArgs.push_back("-lgcc");
8291 CmdArgs.push_back("--as-needed");
8292 CmdArgs.push_back("-lgcc_s");
8293 CmdArgs.push_back("--no-as-needed");
8294 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008295 }
8296 }
8297
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008298 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008299 if (!Args.hasArg(options::OPT_shared))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008300 CmdArgs.push_back(
8301 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008302 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008303 CmdArgs.push_back(
8304 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8305 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008306 }
8307
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008308 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00008309
Stephen Hinesef822542014-07-21 00:47:37 -07008310 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008311 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00008312}
8313
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008314void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8315 const InputInfo &Output,
8316 const InputInfoList &Inputs,
8317 const ArgList &Args,
8318 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008319 claimNoWarnArgs(Args);
8320
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008321 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8322 llvm::Triple Triple = llvm::Triple(TripleStr);
8323
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008324 ArgStringList CmdArgs;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008325
8326 llvm::Reloc::Model RelocationModel;
8327 unsigned PICLevel;
8328 bool IsPIE;
8329 std::tie(RelocationModel, PICLevel, IsPIE) =
8330 ParsePICArgs(getToolChain(), Triple, Args);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008331
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008332 switch (getToolChain().getArch()) {
8333 default:
8334 break;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008335 // Add --32/--64 to make sure we get the format we want.
8336 // This is incomplete
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008337 case llvm::Triple::x86:
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008338 CmdArgs.push_back("--32");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008339 break;
8340 case llvm::Triple::x86_64:
Stephen Hinesef822542014-07-21 00:47:37 -07008341 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8342 CmdArgs.push_back("--x32");
8343 else
8344 CmdArgs.push_back("--64");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008345 break;
8346 case llvm::Triple::ppc:
Eli Friedman7972c882011-11-28 23:46:52 +00008347 CmdArgs.push_back("-a32");
8348 CmdArgs.push_back("-mppc");
8349 CmdArgs.push_back("-many");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008350 break;
8351 case llvm::Triple::ppc64:
Eli Friedman7972c882011-11-28 23:46:52 +00008352 CmdArgs.push_back("-a64");
8353 CmdArgs.push_back("-mppc64");
8354 CmdArgs.push_back("-many");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008355 break;
8356 case llvm::Triple::ppc64le:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00008357 CmdArgs.push_back("-a64");
Stephen Hines651f13c2014-04-23 16:59:28 -07008358 CmdArgs.push_back("-mppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00008359 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07008360 CmdArgs.push_back("-mlittle-endian");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008361 break;
8362 case llvm::Triple::sparc:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008363 case llvm::Triple::sparcel: {
Stephen Hines651f13c2014-04-23 16:59:28 -07008364 CmdArgs.push_back("-32");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008365 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8366 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8367 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008368 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008369 }
8370 case llvm::Triple::sparcv9: {
Stephen Hines651f13c2014-04-23 16:59:28 -07008371 CmdArgs.push_back("-64");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008372 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8373 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8374 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008375 break;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008376 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008377 case llvm::Triple::arm:
8378 case llvm::Triple::armeb:
8379 case llvm::Triple::thumb:
8380 case llvm::Triple::thumbeb: {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008381 const llvm::Triple &Triple2 = getToolChain().getTriple();
8382 switch (Triple2.getSubArch()) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008383 case llvm::Triple::ARMSubArch_v7:
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008384 CmdArgs.push_back("-mfpu=neon");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008385 break;
8386 case llvm::Triple::ARMSubArch_v8:
Bernard Ogden80e90c22013-10-24 18:32:41 +00008387 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008388 break;
8389 default:
8390 break;
8391 }
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00008392
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008393 switch (arm::getARMFloatABI(getToolChain(), Args)) {
8394 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8395 case arm::FloatABI::Soft:
8396 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8397 break;
8398 case arm::FloatABI::SoftFP:
8399 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8400 break;
8401 case arm::FloatABI::Hard:
8402 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8403 break;
8404 }
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00008405
8406 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Stephen Hines651f13c2014-04-23 16:59:28 -07008407
8408 // FIXME: remove krait check when GNU tools support krait cpu
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008409 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Stephen Hines651f13c2014-04-23 16:59:28 -07008410 // march from being picked in the absence of a cpu flag.
8411 Arg *A;
8412 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008413 StringRef(A->getValue()).lower() == "krait")
8414 CmdArgs.push_back("-mcpu=cortex-a15");
Stephen Hines651f13c2014-04-23 16:59:28 -07008415 else
8416 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00008417 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008418 break;
8419 }
8420 case llvm::Triple::mips:
8421 case llvm::Triple::mipsel:
8422 case llvm::Triple::mips64:
8423 case llvm::Triple::mips64el: {
Simon Atanasyan073a7802012-04-07 22:31:29 +00008424 StringRef CPUName;
8425 StringRef ABIName;
Stephen Hines176edba2014-12-01 14:53:08 -08008426 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
8427 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00008428
Simon Atanasyan073a7802012-04-07 22:31:29 +00008429 CmdArgs.push_back("-march");
8430 CmdArgs.push_back(CPUName.data());
8431
Simon Atanasyan073a7802012-04-07 22:31:29 +00008432 CmdArgs.push_back("-mabi");
Stephen Hines176edba2014-12-01 14:53:08 -08008433 CmdArgs.push_back(ABIName.data());
8434
8435 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8436 // or -mshared (not implemented) is in effect.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008437 if (RelocationModel == llvm::Reloc::Static)
Stephen Hines176edba2014-12-01 14:53:08 -08008438 CmdArgs.push_back("-mno-shared");
8439
8440 // LLVM doesn't support -mplt yet and acts as if it is always given.
8441 // However, -mplt has no effect with the N64 ABI.
8442 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00008443
8444 if (getToolChain().getArch() == llvm::Triple::mips ||
8445 getToolChain().getArch() == llvm::Triple::mips64)
8446 CmdArgs.push_back("-EB");
8447 else
8448 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00008449
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00008450 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8451 if (StringRef(A->getValue()) == "2008")
8452 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8453 }
8454
Stephen Hines176edba2014-12-01 14:53:08 -08008455 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8456 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8457 options::OPT_mfp64)) {
8458 A->claim();
8459 A->render(Args, CmdArgs);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008460 } else if (mips::shouldUseFPXX(
8461 Args, getToolChain().getTriple(), CPUName, ABIName,
8462 getMipsFloatABI(getToolChain().getDriver(), Args)))
Stephen Hines176edba2014-12-01 14:53:08 -08008463 CmdArgs.push_back("-mfpxx");
8464
8465 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8466 // -mno-mips16 is actually -no-mips16.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008467 if (Arg *A =
8468 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Stephen Hines176edba2014-12-01 14:53:08 -08008469 if (A->getOption().matches(options::OPT_mips16)) {
8470 A->claim();
8471 A->render(Args, CmdArgs);
8472 } else {
8473 A->claim();
8474 CmdArgs.push_back("-no-mips16");
8475 }
8476 }
8477
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00008478 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8479 options::OPT_mno_micromips);
8480 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8481 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8482
Daniel Sanders0d5d6ff2013-12-02 10:14:43 +00008483 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8484 // Do not use AddLastArg because not all versions of MIPS assembler
8485 // support -mmsa / -mno-msa options.
8486 if (A->getOption().matches(options::OPT_mmsa))
8487 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8488 }
8489
Stephen Hines176edba2014-12-01 14:53:08 -08008490 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8491 options::OPT_msoft_float);
8492
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008493 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8494 options::OPT_msingle_float);
8495
Stephen Hines176edba2014-12-01 14:53:08 -08008496 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8497 options::OPT_mno_odd_spreg);
8498
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008499 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008500 break;
8501 }
8502 case llvm::Triple::systemz: {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00008503 // Always pass an -march option, since our default of z10 is later
8504 // than the GNU assembler's default.
8505 StringRef CPUName = getSystemZTargetCPU(Args);
8506 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008507 break;
8508 }
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008509 }
8510
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008511 Args.AddAllArgs(CmdArgs, options::OPT_I);
8512 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008513
8514 CmdArgs.push_back("-o");
8515 CmdArgs.push_back(Output.getFilename());
8516
Stephen Hinesef822542014-07-21 00:47:37 -07008517 for (const auto &II : Inputs)
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008518 CmdArgs.push_back(II.getFilename());
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008519
Stephen Hinesef822542014-07-21 00:47:37 -07008520 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008521 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00008522
8523 // Handle the debug info splitting at object creation time if we're
8524 // creating an object.
8525 // TODO: Currently only works on linux with newer objcopy.
8526 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00008527 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00008528 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008529 SplitDebugName(Args, Inputs[0]));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008530}
8531
Stephen Hines651f13c2014-04-23 16:59:28 -07008532static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008533 ArgStringList &CmdArgs, const ArgList &Args) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008534 bool isAndroid = Triple.isAndroid();
8535 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth68f94db2013-03-04 02:07:55 +00008536 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8537 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00008538 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00008539 CmdArgs.push_back("-lgcc");
8540
Logan Chien529a73d2012-11-19 12:04:11 +00008541 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00008542 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00008543 CmdArgs.push_back("-lgcc");
8544 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008545 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00008546 CmdArgs.push_back("--as-needed");
8547 CmdArgs.push_back("-lgcc_s");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008548 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00008549 CmdArgs.push_back("--no-as-needed");
8550 }
8551
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008552 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00008553 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00008554 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00008555 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00008556
8557 // According to Android ABI, we have to link with libdl if we are
8558 // linking with non-static libgcc.
8559 //
8560 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8561 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8562 if (isAndroid && !StaticLibgcc)
8563 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00008564}
8565
Stephen Hines176edba2014-12-01 14:53:08 -08008566static std::string getLinuxDynamicLinker(const ArgList &Args,
8567 const toolchains::Linux &ToolChain) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008568 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8569
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008570 if (ToolChain.getTriple().isAndroid()) {
Stephen Hines651f13c2014-04-23 16:59:28 -07008571 if (ToolChain.getTriple().isArch64Bit())
8572 return "/system/bin/linker64";
8573 else
8574 return "/system/bin/linker";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008575 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8576 Arch == llvm::Triple::sparcel)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00008577 return "/lib/ld-linux.so.2";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008578 else if (Arch == llvm::Triple::aarch64)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00008579 return "/lib/ld-linux-aarch64.so.1";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008580 else if (Arch == llvm::Triple::aarch64_be)
Stephen Hines651f13c2014-04-23 16:59:28 -07008581 return "/lib/ld-linux-aarch64_be.so.1";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008582 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008583 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8584 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00008585 return "/lib/ld-linux-armhf.so.3";
8586 else
8587 return "/lib/ld-linux.so.3";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008588 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8589 // TODO: check which dynamic linker name.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008590 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8591 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008592 return "/lib/ld-linux-armhf.so.3";
Stephen Hines651f13c2014-04-23 16:59:28 -07008593 else
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008594 return "/lib/ld-linux.so.3";
8595 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8596 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008597 std::string LibDir =
8598 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Stephen Hines176edba2014-12-01 14:53:08 -08008599 StringRef LibName;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008600 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Stephen Hines176edba2014-12-01 14:53:08 -08008601 if (mips::isUCLibc(Args))
8602 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008603 else if (!ToolChain.getTriple().hasEnvironment()) {
8604 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8605 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8606 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8607 } else
Stephen Hines176edba2014-12-01 14:53:08 -08008608 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
8609
8610 return (LibDir + "/" + LibName).str();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008611 } else if (Arch == llvm::Triple::ppc)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00008612 return "/lib/ld.so.1";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008613 else if (Arch == llvm::Triple::ppc64) {
Stephen Hines176edba2014-12-01 14:53:08 -08008614 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8615 return "/lib64/ld64.so.2";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00008616 return "/lib64/ld64.so.1";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008617 } else if (Arch == llvm::Triple::ppc64le) {
Stephen Hines176edba2014-12-01 14:53:08 -08008618 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8619 return "/lib64/ld64.so.1";
Stephen Hinesef822542014-07-21 00:47:37 -07008620 return "/lib64/ld64.so.2";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008621 } else if (Arch == llvm::Triple::systemz)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008622 return "/lib/ld64.so.1";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008623 else if (Arch == llvm::Triple::sparcv9)
Stephen Hines651f13c2014-04-23 16:59:28 -07008624 return "/lib64/ld-linux.so.2";
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008625 else if (Arch == llvm::Triple::x86_64 &&
Stephen Hinesef822542014-07-21 00:47:37 -07008626 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8627 return "/libx32/ld-linux-x32.so.2";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00008628 else
8629 return "/lib64/ld-linux-x86-64.so.2";
8630}
8631
Stephen Hines651f13c2014-04-23 16:59:28 -07008632static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008633 ArgStringList &CmdArgs, const ArgList &Args) {
Stephen Hines651f13c2014-04-23 16:59:28 -07008634 // Make use of compiler-rt if --rtlib option is used
8635 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8636
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008637 switch (RLT) {
Stephen Hines651f13c2014-04-23 16:59:28 -07008638 case ToolChain::RLT_CompilerRT:
Stephen Hines176edba2014-12-01 14:53:08 -08008639 switch (TC.getTriple().getOS()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008640 default:
8641 llvm_unreachable("unsupported OS");
Stephen Hines176edba2014-12-01 14:53:08 -08008642 case llvm::Triple::Win32:
Stephen Hines176edba2014-12-01 14:53:08 -08008643 case llvm::Triple::Linux:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008644 addClangRT(TC, Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -08008645 break;
8646 }
Stephen Hines651f13c2014-04-23 16:59:28 -07008647 break;
8648 case ToolChain::RLT_Libgcc:
8649 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8650 break;
8651 }
8652}
8653
Stephen Hines176edba2014-12-01 14:53:08 -08008654static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8655 switch (T.getArch()) {
8656 case llvm::Triple::x86:
8657 return "elf_i386";
8658 case llvm::Triple::aarch64:
8659 return "aarch64linux";
8660 case llvm::Triple::aarch64_be:
8661 return "aarch64_be_linux";
8662 case llvm::Triple::arm:
8663 case llvm::Triple::thumb:
8664 return "armelf_linux_eabi";
8665 case llvm::Triple::armeb:
8666 case llvm::Triple::thumbeb:
8667 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8668 case llvm::Triple::ppc:
8669 return "elf32ppclinux";
8670 case llvm::Triple::ppc64:
8671 return "elf64ppc";
8672 case llvm::Triple::ppc64le:
8673 return "elf64lppc";
8674 case llvm::Triple::sparc:
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008675 case llvm::Triple::sparcel:
Stephen Hines176edba2014-12-01 14:53:08 -08008676 return "elf32_sparc";
8677 case llvm::Triple::sparcv9:
8678 return "elf64_sparc";
8679 case llvm::Triple::mips:
8680 return "elf32btsmip";
8681 case llvm::Triple::mipsel:
8682 return "elf32ltsmip";
8683 case llvm::Triple::mips64:
8684 if (mips::hasMipsAbiArg(Args, "n32"))
8685 return "elf32btsmipn32";
8686 return "elf64btsmip";
8687 case llvm::Triple::mips64el:
8688 if (mips::hasMipsAbiArg(Args, "n32"))
8689 return "elf32ltsmipn32";
8690 return "elf64ltsmip";
8691 case llvm::Triple::systemz:
8692 return "elf64_s390";
8693 case llvm::Triple::x86_64:
8694 if (T.getEnvironment() == llvm::Triple::GNUX32)
8695 return "elf32_x86_64";
8696 return "elf_x86_64";
8697 default:
8698 llvm_unreachable("Unexpected arch");
8699 }
8700}
8701
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008702void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8703 const InputInfo &Output,
8704 const InputInfoList &Inputs,
8705 const ArgList &Args,
8706 const char *LinkingOutput) const {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008707 const toolchains::Linux &ToolChain =
8708 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac1da9812010-11-07 20:14:31 +00008709 const Driver &D = ToolChain.getDriver();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008710
8711 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8712 llvm::Triple Triple = llvm::Triple(TripleStr);
8713
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008714 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008715 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00008716 const bool IsPIE =
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008717 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8718 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008719 const bool HasCRTBeginEndFiles =
8720 ToolChain.getTriple().hasEnvironment() ||
8721 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008722
Rafael Espindolac1da9812010-11-07 20:14:31 +00008723 ArgStringList CmdArgs;
8724
Rafael Espindola26f14c32010-11-15 18:28:16 +00008725 // Silence warning for "clang -g foo.o -o foo"
8726 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00008727 // and "clang -emit-llvm foo.o -o foo"
8728 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00008729 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00008730 // handled somewhere else.
8731 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00008732
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008733 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8734 if (llvm::sys::path::filename(Exec) == "lld") {
8735 CmdArgs.push_back("-flavor");
8736 CmdArgs.push_back("old-gnu");
8737 CmdArgs.push_back("-target");
8738 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8739 }
8740
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00008741 if (!D.SysRoot.empty())
8742 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00008743
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00008744 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00008745 CmdArgs.push_back("-pie");
8746
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00008747 if (Args.hasArg(options::OPT_rdynamic))
8748 CmdArgs.push_back("-export-dynamic");
8749
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00008750 if (Args.hasArg(options::OPT_s))
8751 CmdArgs.push_back("-s");
8752
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008753 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008754 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07008755
Stephen Hinesef822542014-07-21 00:47:37 -07008756 for (const auto &Opt : ToolChain.ExtraOpts)
8757 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac1da9812010-11-07 20:14:31 +00008758
8759 if (!Args.hasArg(options::OPT_static)) {
8760 CmdArgs.push_back("--eh-frame-hdr");
8761 }
8762
8763 CmdArgs.push_back("-m");
Stephen Hines176edba2014-12-01 14:53:08 -08008764 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac1da9812010-11-07 20:14:31 +00008765
8766 if (Args.hasArg(options::OPT_static)) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008767 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8768 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00008769 CmdArgs.push_back("-Bstatic");
8770 else
8771 CmdArgs.push_back("-static");
8772 } else if (Args.hasArg(options::OPT_shared)) {
8773 CmdArgs.push_back("-shared");
8774 }
8775
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008776 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8777 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00008778 (!Args.hasArg(options::OPT_static) &&
8779 !Args.hasArg(options::OPT_shared))) {
8780 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00008781 CmdArgs.push_back(Args.MakeArgString(
8782 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00008783 }
8784
8785 CmdArgs.push_back("-o");
8786 CmdArgs.push_back(Output.getFilename());
8787
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008788 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008789 if (!isAndroid) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008790 const char *crt1 = nullptr;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008791 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher61f08682013-06-07 23:25:01 +00008792 if (Args.hasArg(options::OPT_pg))
8793 crt1 = "gcrt1.o";
8794 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008795 crt1 = "Scrt1.o";
8796 else
8797 crt1 = "crt1.o";
8798 }
8799 if (crt1)
8800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00008801
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008802 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8803 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00008804
Rafael Espindola89414b32010-11-12 03:00:39 +00008805 const char *crtbegin;
8806 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008807 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00008808 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008809 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00008810 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00008811 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00008812 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008813 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008814
8815 if (HasCRTBeginEndFiles)
8816 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00008817
8818 // Add crtfastmath.o if available and fast math is enabled.
8819 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00008820 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00008821
8822 Args.AddAllArgs(CmdArgs, options::OPT_L);
Stephen Hinesef822542014-07-21 00:47:37 -07008823 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac1da9812010-11-07 20:14:31 +00008824
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008825 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac1da9812010-11-07 20:14:31 +00008826
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008827 if (D.isUsingLTO())
8828 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth700d4e42013-01-13 11:46:33 +00008829
Nick Lewyckye276cfc2012-08-17 03:39:16 +00008830 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8831 CmdArgs.push_back("--no-demangle");
8832
Stephen Hines176edba2014-12-01 14:53:08 -08008833 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac1da9812010-11-07 20:14:31 +00008834 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00008835 // The profile runtime also needs access to system libraries.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008836 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00008837
Hans Wennborg76b86c22013-07-18 20:29:38 +00008838 if (D.CCCIsCXX() &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008839 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00008840 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008841 !Args.hasArg(options::OPT_static);
Rafael Espindola19706f82011-10-17 22:14:51 +00008842 if (OnlyLibstdcxxStatic)
8843 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00008844 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00008845 if (OnlyLibstdcxxStatic)
8846 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00008847 CmdArgs.push_back("-lm");
8848 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008849 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8850 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac1da9812010-11-07 20:14:31 +00008851
Rafael Espindola89414b32010-11-12 03:00:39 +00008852 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00008853 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8854 if (Args.hasArg(options::OPT_static))
8855 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00008856
Stephen Hines176edba2014-12-01 14:53:08 -08008857 if (NeedsSanitizerDeps)
8858 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8859
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008860 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8861 Args.hasArg(options::OPT_pthreads);
Chandler Carruthdf96e022013-01-17 13:19:29 +00008862
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008863 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8864 options::OPT_fno_openmp, false)) {
8865 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8866 // FIXME: Does this really make sense for all GNU toolchains?
8867 WantPthread = true;
8868
8869 // Also link the particular OpenMP runtimes.
8870 switch (getOpenMPRuntime(ToolChain, Args)) {
8871 case OMPRT_OMP:
8872 CmdArgs.push_back("-lomp");
8873 break;
8874 case OMPRT_GOMP:
8875 CmdArgs.push_back("-lgomp");
8876
8877 // FIXME: Exclude this for platforms with libgomp that don't require
8878 // librt. Most modern Linux platforms require it, but some may not.
8879 CmdArgs.push_back("-lrt");
8880 break;
8881 case OMPRT_IOMP5:
8882 CmdArgs.push_back("-liomp5");
8883 break;
8884 case OMPRT_Unknown:
8885 // Already diagnosed.
8886 break;
8887 }
Chandler Carruthdf96e022013-01-17 13:19:29 +00008888 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008889
Stephen Hines651f13c2014-04-23 16:59:28 -07008890 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00008891
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008892 if (WantPthread && !isAndroid)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00008893 CmdArgs.push_back("-lpthread");
8894
8895 CmdArgs.push_back("-lc");
8896
8897 if (Args.hasArg(options::OPT_static))
8898 CmdArgs.push_back("--end-group");
8899 else
Stephen Hines651f13c2014-04-23 16:59:28 -07008900 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth2ba542c2012-05-14 18:31:18 +00008901 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00008902
Rafael Espindola49c64fd2010-12-01 01:52:43 +00008903 if (!Args.hasArg(options::OPT_nostartfiles)) {
8904 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00008905 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008906 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00008907 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00008908 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00008909 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008910 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00008911
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008912 if (HasCRTBeginEndFiles)
8913 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00008914 if (!isAndroid)
8915 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00008916 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00008917 }
8918
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008919 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Rafael Espindolac1da9812010-11-07 20:14:31 +00008920}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00008921
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008922// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8923// for the various SFI requirements like register masking. The assembly tool
8924// inserts the file containing the macros as an input into all the assembly
8925// jobs.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008926void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8927 const InputInfo &Output,
8928 const InputInfoList &Inputs,
8929 const ArgList &Args,
8930 const char *LinkingOutput) const {
8931 const toolchains::NaClToolChain &ToolChain =
8932 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008933 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8934 "nacl-arm-macros.s");
8935 InputInfoList NewInputs;
8936 NewInputs.push_back(NaClMacros);
8937 NewInputs.append(Inputs.begin(), Inputs.end());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008938 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8939 LinkingOutput);
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008940}
8941
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008942// This is quite similar to gnutools::Linker::ConstructJob with changes that
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008943// we use static by default, do not yet support sanitizers or LTO, and a few
8944// others. Eventually we can support more of that and hopefully migrate back
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008945// to gnutools::Linker.
8946void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8947 const InputInfo &Output,
8948 const InputInfoList &Inputs,
8949 const ArgList &Args,
8950 const char *LinkingOutput) const {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008951
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008952 const toolchains::NaClToolChain &ToolChain =
8953 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008954 const Driver &D = ToolChain.getDriver();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008955 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008956 const bool IsStatic =
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008957 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008958
8959 ArgStringList CmdArgs;
8960
8961 // Silence warning for "clang -g foo.o -o foo"
8962 Args.ClaimAllArgs(options::OPT_g_Group);
8963 // and "clang -emit-llvm foo.o -o foo"
8964 Args.ClaimAllArgs(options::OPT_emit_llvm);
8965 // and for "clang -w foo.o -o foo". Other warning options are already
8966 // handled somewhere else.
8967 Args.ClaimAllArgs(options::OPT_w);
8968
8969 if (!D.SysRoot.empty())
8970 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8971
8972 if (Args.hasArg(options::OPT_rdynamic))
8973 CmdArgs.push_back("-export-dynamic");
8974
8975 if (Args.hasArg(options::OPT_s))
8976 CmdArgs.push_back("-s");
8977
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008978 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8979 // from there is --build-id, which we do want.
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008980 CmdArgs.push_back("--build-id");
8981
8982 if (!IsStatic)
8983 CmdArgs.push_back("--eh-frame-hdr");
8984
8985 CmdArgs.push_back("-m");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008986 if (Arch == llvm::Triple::x86)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008987 CmdArgs.push_back("elf_i386_nacl");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008988 else if (Arch == llvm::Triple::arm)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008989 CmdArgs.push_back("armelf_nacl");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008990 else if (Arch == llvm::Triple::x86_64)
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008991 CmdArgs.push_back("elf_x86_64_nacl");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08008992 else if (Arch == llvm::Triple::mipsel)
8993 CmdArgs.push_back("mipselelf_nacl");
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008994 else
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -07008995 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8996 << "Native Client";
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07008997
8998 if (IsStatic)
8999 CmdArgs.push_back("-static");
9000 else if (Args.hasArg(options::OPT_shared))
9001 CmdArgs.push_back("-shared");
9002
9003 CmdArgs.push_back("-o");
9004 CmdArgs.push_back(Output.getFilename());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009005 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009006 if (!Args.hasArg(options::OPT_shared))
9007 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9008 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9009
9010 const char *crtbegin;
9011 if (IsStatic)
9012 crtbegin = "crtbeginT.o";
9013 else if (Args.hasArg(options::OPT_shared))
9014 crtbegin = "crtbeginS.o";
9015 else
9016 crtbegin = "crtbegin.o";
9017 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9018 }
9019
9020 Args.AddAllArgs(CmdArgs, options::OPT_L);
9021 Args.AddAllArgs(CmdArgs, options::OPT_u);
9022
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009023 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009024
9025 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9026 CmdArgs.push_back("--no-demangle");
9027
9028 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9029
9030 if (D.CCCIsCXX() &&
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009031 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
9032 bool OnlyLibstdcxxStatic =
9033 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009034 if (OnlyLibstdcxxStatic)
9035 CmdArgs.push_back("-Bstatic");
9036 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9037 if (OnlyLibstdcxxStatic)
9038 CmdArgs.push_back("-Bdynamic");
9039 CmdArgs.push_back("-lm");
9040 }
9041
9042 if (!Args.hasArg(options::OPT_nostdlib)) {
9043 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9044 // Always use groups, since it has no effect on dynamic libraries.
9045 CmdArgs.push_back("--start-group");
9046 CmdArgs.push_back("-lc");
9047 // NaCl's libc++ currently requires libpthread, so just always include it
9048 // in the group for C++.
9049 if (Args.hasArg(options::OPT_pthread) ||
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009050 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
9051 // Gold, used by Mips, handles nested groups differently than ld, and
9052 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9053 // which is not a desired behaviour here.
9054 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9055 if (getToolChain().getArch() == llvm::Triple::mipsel)
9056 CmdArgs.push_back("-lnacl");
9057
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009058 CmdArgs.push_back("-lpthread");
9059 }
9060
9061 CmdArgs.push_back("-lgcc");
9062 CmdArgs.push_back("--as-needed");
9063 if (IsStatic)
9064 CmdArgs.push_back("-lgcc_eh");
9065 else
9066 CmdArgs.push_back("-lgcc_s");
9067 CmdArgs.push_back("--no-as-needed");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009068
9069 // Mips needs to create and use pnacl_legacy library that contains
9070 // definitions from bitcode/pnaclmm.c and definitions for
9071 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9072 if (getToolChain().getArch() == llvm::Triple::mipsel)
9073 CmdArgs.push_back("-lpnacl_legacy");
9074
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009075 CmdArgs.push_back("--end-group");
9076 }
9077
9078 if (!Args.hasArg(options::OPT_nostartfiles)) {
9079 const char *crtend;
9080 if (Args.hasArg(options::OPT_shared))
9081 crtend = "crtendS.o";
9082 else
9083 crtend = "crtend.o";
9084
9085 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9086 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9087 }
9088 }
9089
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009090 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9091 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -07009092}
9093
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009094void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9095 const InputInfo &Output,
9096 const InputInfoList &Inputs,
9097 const ArgList &Args,
9098 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009099 claimNoWarnArgs(Args);
Chris Lattner38e317d2010-07-07 16:01:42 +00009100 ArgStringList CmdArgs;
9101
Stephen Hinesef822542014-07-21 00:47:37 -07009102 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner38e317d2010-07-07 16:01:42 +00009103
9104 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009105 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00009106
Stephen Hinesef822542014-07-21 00:47:37 -07009107 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009108 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00009109
Stephen Hinesef822542014-07-21 00:47:37 -07009110 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009111 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner38e317d2010-07-07 16:01:42 +00009112}
9113
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009114void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9115 const InputInfo &Output,
9116 const InputInfoList &Inputs,
9117 const ArgList &Args,
9118 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00009119 const Driver &D = getToolChain().getDriver();
9120 ArgStringList CmdArgs;
9121
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009122 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00009123 CmdArgs.push_back("-o");
9124 CmdArgs.push_back(Output.getFilename());
9125 } else {
9126 assert(Output.isNothing() && "Invalid output.");
9127 }
9128
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009129 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
9130 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9131 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9132 CmdArgs.push_back(
9133 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9134 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman6d402dc2011-12-08 23:54:21 +00009135 }
Chris Lattner38e317d2010-07-07 16:01:42 +00009136
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009137 Args.AddAllArgs(CmdArgs,
9138 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner38e317d2010-07-07 16:01:42 +00009139
Daniel Dunbar2008fee2010-09-17 00:24:54 +00009140 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00009141
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009142 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman6d402dc2011-12-08 23:54:21 +00009143
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009144 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00009145 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00009146 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00009147 CmdArgs.push_back("-lm");
9148 }
Chris Lattner38e317d2010-07-07 16:01:42 +00009149 }
9150
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009151 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00009152 if (Args.hasArg(options::OPT_pthread))
9153 CmdArgs.push_back("-lpthread");
9154 CmdArgs.push_back("-lc");
9155 CmdArgs.push_back("-lCompilerRT-Generic");
9156 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9157 CmdArgs.push_back(
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009158 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00009159 }
9160
Stephen Hinesef822542014-07-21 00:47:37 -07009161 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009162 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner38e317d2010-07-07 16:01:42 +00009163}
9164
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009165/// DragonFly Tools
9166
9167// For now, DragonFly Assemble does just about the same as for
9168// FreeBSD, but this may change soon.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009169void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9170 const InputInfo &Output,
9171 const InputInfoList &Inputs,
9172 const ArgList &Args,
9173 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009174 claimNoWarnArgs(Args);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009175 ArgStringList CmdArgs;
9176
9177 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9178 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00009179 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009180 CmdArgs.push_back("--32");
9181
Stephen Hinesef822542014-07-21 00:47:37 -07009182 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009183
9184 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009185 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009186
Stephen Hinesef822542014-07-21 00:47:37 -07009187 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009188 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009189
Stephen Hinesef822542014-07-21 00:47:37 -07009190 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009191 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009192}
9193
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009194void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9195 const InputInfo &Output,
9196 const InputInfoList &Inputs,
9197 const ArgList &Args,
9198 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00009199 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009200 ArgStringList CmdArgs;
Stephen Hines176edba2014-12-01 14:53:08 -08009201 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall8cfb7202013-04-11 22:55:55 +00009202
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00009203 if (!D.SysRoot.empty())
9204 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9205
John McCall8cfb7202013-04-11 22:55:55 +00009206 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009207 if (Args.hasArg(options::OPT_static)) {
9208 CmdArgs.push_back("-Bstatic");
9209 } else {
John McCall8cfb7202013-04-11 22:55:55 +00009210 if (Args.hasArg(options::OPT_rdynamic))
9211 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009212 if (Args.hasArg(options::OPT_shared))
9213 CmdArgs.push_back("-Bshareable");
9214 else {
9215 CmdArgs.push_back("-dynamic-linker");
9216 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9217 }
John McCall8cfb7202013-04-11 22:55:55 +00009218 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009219 }
9220
9221 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9222 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00009223 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009224 CmdArgs.push_back("-m");
9225 CmdArgs.push_back("elf_i386");
9226 }
9227
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00009228 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009229 CmdArgs.push_back("-o");
9230 CmdArgs.push_back(Output.getFilename());
9231 } else {
9232 assert(Output.isNothing() && "Invalid output.");
9233 }
9234
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009235 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009236 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00009237 if (Args.hasArg(options::OPT_pg))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009238 CmdArgs.push_back(
9239 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009240 else {
9241 if (Args.hasArg(options::OPT_pie))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009242 CmdArgs.push_back(
9243 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009244 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009245 CmdArgs.push_back(
9246 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009247 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009248 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009249 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009250 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009251 CmdArgs.push_back(
9252 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009253 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009254 CmdArgs.push_back(
9255 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009256 }
9257
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009258 Args.AddAllArgs(CmdArgs,
9259 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009260
Daniel Dunbar2008fee2010-09-17 00:24:54 +00009261 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009262
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009263 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009264 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9265 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00009266 if (UseGCC47)
9267 CmdArgs.push_back("-L/usr/lib/gcc47");
9268 else
9269 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009270
9271 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00009272 if (UseGCC47) {
9273 CmdArgs.push_back("-rpath");
9274 CmdArgs.push_back("/usr/lib/gcc47");
9275 } else {
9276 CmdArgs.push_back("-rpath");
9277 CmdArgs.push_back("/usr/lib/gcc44");
9278 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009279 }
9280
Hans Wennborg76b86c22013-07-18 20:29:38 +00009281 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00009282 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00009283 CmdArgs.push_back("-lm");
9284 }
9285
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009286 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00009287 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009288
9289 if (!Args.hasArg(options::OPT_nolibc)) {
9290 CmdArgs.push_back("-lc");
9291 }
9292
John McCall8cfb7202013-04-11 22:55:55 +00009293 if (UseGCC47) {
9294 if (Args.hasArg(options::OPT_static) ||
9295 Args.hasArg(options::OPT_static_libgcc)) {
9296 CmdArgs.push_back("-lgcc");
9297 CmdArgs.push_back("-lgcc_eh");
9298 } else {
9299 if (Args.hasArg(options::OPT_shared_libgcc)) {
9300 CmdArgs.push_back("-lgcc_pic");
9301 if (!Args.hasArg(options::OPT_shared))
9302 CmdArgs.push_back("-lgcc");
9303 } else {
9304 CmdArgs.push_back("-lgcc");
9305 CmdArgs.push_back("--as-needed");
9306 CmdArgs.push_back("-lgcc_pic");
9307 CmdArgs.push_back("--no-as-needed");
9308 }
9309 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009310 } else {
John McCall8cfb7202013-04-11 22:55:55 +00009311 if (Args.hasArg(options::OPT_shared)) {
9312 CmdArgs.push_back("-lgcc_pic");
9313 } else {
9314 CmdArgs.push_back("-lgcc");
9315 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009316 }
9317 }
9318
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009319 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00009320 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009321 CmdArgs.push_back(
9322 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00009323 else
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009324 CmdArgs.push_back(
9325 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9326 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009327 }
9328
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009329 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00009330
Stephen Hinesef822542014-07-21 00:47:37 -07009331 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009332 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00009333}
Michael J. Spencerff58e362010-08-21 21:55:07 +00009334
Stephen Hines176edba2014-12-01 14:53:08 -08009335// Try to find Exe from a Visual Studio distribution. This first tries to find
9336// an installed copy of Visual Studio and, failing that, looks in the PATH,
9337// making sure that whatever executable that's found is not a same-named exe
9338// from clang itself to prevent clang from falling back to itself.
9339static std::string FindVisualStudioExecutable(const ToolChain &TC,
9340 const char *Exe,
9341 const char *ClangProgramPath) {
9342 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9343 std::string visualStudioBinDir;
9344 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9345 visualStudioBinDir)) {
9346 SmallString<128> FilePath(visualStudioBinDir);
9347 llvm::sys::path::append(FilePath, Exe);
9348 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9349 return FilePath.str();
9350 }
9351
9352 return Exe;
9353}
9354
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009355void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9356 const InputInfo &Output,
9357 const InputInfoList &Inputs,
9358 const ArgList &Args,
9359 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00009360 ArgStringList CmdArgs;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009361 const ToolChain &TC = getToolChain();
Michael J. Spencerff58e362010-08-21 21:55:07 +00009362
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009363 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9364 if (Output.isFilename())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009365 CmdArgs.push_back(
9366 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00009367
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009368 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9369 !C.getDriver().IsCLMode())
Michael J. Spencerff58e362010-08-21 21:55:07 +00009370 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerff58e362010-08-21 21:55:07 +00009371
Stephen Hines176edba2014-12-01 14:53:08 -08009372 if (!llvm::sys::Process::GetEnv("LIB")) {
9373 // If the VC environment hasn't been configured (perhaps because the user
9374 // did not run vcvarsall), try to build a consistent link environment. If
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009375 // the environment variable is set however, assume the user knows what
9376 // they're doing.
Stephen Hines176edba2014-12-01 14:53:08 -08009377 std::string VisualStudioDir;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009378 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Stephen Hines176edba2014-12-01 14:53:08 -08009379 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9380 SmallString<128> LibDir(VisualStudioDir);
9381 llvm::sys::path::append(LibDir, "VC", "lib");
9382 switch (MSVC.getArch()) {
9383 case llvm::Triple::x86:
9384 // x86 just puts the libraries directly in lib
9385 break;
9386 case llvm::Triple::x86_64:
9387 llvm::sys::path::append(LibDir, "amd64");
9388 break;
9389 case llvm::Triple::arm:
9390 llvm::sys::path::append(LibDir, "arm");
9391 break;
9392 default:
9393 break;
9394 }
9395 CmdArgs.push_back(
9396 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009397
9398 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9399 std::string UniversalCRTLibPath;
9400 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9401 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9402 UniversalCRTLibPath.c_str()));
9403 }
Stephen Hines176edba2014-12-01 14:53:08 -08009404 }
9405
9406 std::string WindowsSdkLibPath;
9407 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9408 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9409 WindowsSdkLibPath.c_str()));
9410 }
9411
Michael J. Spencerff58e362010-08-21 21:55:07 +00009412 CmdArgs.push_back("-nologo");
9413
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009414 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07009415 CmdArgs.push_back("-debug");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07009416
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009417 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009418 options::OPT_shared);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00009419 if (DLL) {
9420 CmdArgs.push_back(Args.MakeArgString("-dll"));
9421
9422 SmallString<128> ImplibName(Output.getFilename());
9423 llvm::sys::path::replace_extension(ImplibName, "lib");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009424 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00009425 }
9426
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009427 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00009428 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00009429 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Stephen Hines176edba2014-12-01 14:53:08 -08009430 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009431 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9432 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Stephen Hines176edba2014-12-01 14:53:08 -08009433 // Make sure the dynamic runtime thunk is not optimized out at link time
9434 // to ensure proper SEH handling.
9435 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
9436 } else if (DLL) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009437 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Stephen Hines6bcf27b2014-05-29 04:14:42 -07009438 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009439 for (const auto &Lib : {"asan", "asan_cxx"})
9440 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Stephen Hines6bcf27b2014-05-29 04:14:42 -07009441 }
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00009442 }
9443
Hans Wennborg5db95272013-08-13 23:38:57 +00009444 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00009445
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009446 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9447 options::OPT_fno_openmp, false)) {
9448 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9449 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9450 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9451 TC.getDriver().Dir + "/../lib"));
9452 switch (getOpenMPRuntime(getToolChain(), Args)) {
9453 case OMPRT_OMP:
9454 CmdArgs.push_back("-defaultlib:libomp.lib");
9455 break;
9456 case OMPRT_IOMP5:
9457 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9458 break;
9459 case OMPRT_GOMP:
9460 break;
9461 case OMPRT_Unknown:
9462 // Already diagnosed.
9463 break;
9464 }
9465 }
9466
Stephen Hines176edba2014-12-01 14:53:08 -08009467 // Add filenames, libraries, and other linker inputs.
9468 for (const auto &Input : Inputs) {
9469 if (Input.isFilename()) {
Stephen Hinesef822542014-07-21 00:47:37 -07009470 CmdArgs.push_back(Input.getFilename());
Stephen Hines176edba2014-12-01 14:53:08 -08009471 continue;
9472 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00009473
Stephen Hines176edba2014-12-01 14:53:08 -08009474 const Arg &A = Input.getInputArg();
9475
9476 // Render -l options differently for the MSVC linker.
9477 if (A.getOption().matches(options::OPT_l)) {
9478 StringRef Lib = A.getValue();
9479 const char *LinkLibArg;
9480 if (Lib.endswith(".lib"))
9481 LinkLibArg = Args.MakeArgString(Lib);
9482 else
9483 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9484 CmdArgs.push_back(LinkLibArg);
9485 continue;
9486 }
9487
9488 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9489 // or -L. Render it, even if MSVC doesn't understand it.
9490 A.renderAsInput(Args, CmdArgs);
9491 }
9492
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009493 // We need to special case some linker paths. In the case of lld, we need to
9494 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9495 // linker, we need to use a special search algorithm.
9496 llvm::SmallString<128> linkPath;
9497 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9498 if (Linker.equals_lower("lld"))
9499 Linker = "lld-link";
9500
9501 if (Linker.equals_lower("link")) {
9502 // If we're using the MSVC linker, it's not sufficient to just use link
9503 // from the program PATH, because other environments like GnuWin32 install
9504 // their own link.exe which may come first.
9505 linkPath = FindVisualStudioExecutable(TC, "link.exe",
9506 C.getDriver().getClangProgramPath());
9507 } else {
9508 linkPath = Linker;
9509 llvm::sys::path::replace_extension(linkPath, "exe");
9510 linkPath = TC.GetProgramPath(linkPath.c_str());
9511 }
9512
Stephen Hines176edba2014-12-01 14:53:08 -08009513 const char *Exec = Args.MakeArgString(linkPath);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009514 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerff58e362010-08-21 21:55:07 +00009515}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009516
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009517void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9518 const InputInfo &Output,
9519 const InputInfoList &Inputs,
9520 const ArgList &Args,
9521 const char *LinkingOutput) const {
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009522 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9523}
9524
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009525std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
Stephen Hines176edba2014-12-01 14:53:08 -08009526 Compilation &C, const JobAction &JA, const InputInfo &Output,
9527 const InputInfoList &Inputs, const ArgList &Args,
9528 const char *LinkingOutput) const {
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009529 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00009530 CmdArgs.push_back("/nologo");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009531 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009532 CmdArgs.push_back("/W0"); // No warnings.
9533
9534 // The goal is to be able to invoke this tool correctly based on
9535 // any flag accepted by clang-cl.
9536
9537 // These are spelled the same way in clang and cl.exe,.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009538 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborga8ffc162013-09-24 18:17:21 +00009539
9540 // Optimization level.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009541 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9542 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9543 : "/Oi-");
Hans Wennborga8ffc162013-09-24 18:17:21 +00009544 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9545 if (A->getOption().getID() == options::OPT_O0) {
9546 CmdArgs.push_back("/Od");
9547 } else {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009548 CmdArgs.push_back("/Og");
9549
Hans Wennborga8ffc162013-09-24 18:17:21 +00009550 StringRef OptLevel = A->getValue();
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009551 if (OptLevel == "s" || OptLevel == "z")
9552 CmdArgs.push_back("/Os");
9553 else
9554 CmdArgs.push_back("/Ot");
9555
9556 CmdArgs.push_back("/Ob2");
Hans Wennborga8ffc162013-09-24 18:17:21 +00009557 }
9558 }
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009559 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9560 options::OPT_fno_omit_frame_pointer))
9561 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9562 ? "/Oy"
9563 : "/Oy-");
9564 if (!Args.hasArg(options::OPT_fwritable_strings))
9565 CmdArgs.push_back("/GF");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009566
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009567 // Flags for which clang-cl has an alias.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009568 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9569
Stephen Hinesef822542014-07-21 00:47:37 -07009570 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9571 /*default=*/false))
9572 CmdArgs.push_back("/GR-");
Stephen Hines651f13c2014-04-23 16:59:28 -07009573 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9574 options::OPT_fno_function_sections))
9575 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9576 ? "/Gy"
9577 : "/Gy-");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07009578 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9579 options::OPT_fno_data_sections))
9580 CmdArgs.push_back(
9581 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009582 if (Args.hasArg(options::OPT_fsyntax_only))
9583 CmdArgs.push_back("/Zs");
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009584 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9585 options::OPT__SLASH_Z7))
Stephen Hines651f13c2014-04-23 16:59:28 -07009586 CmdArgs.push_back("/Z7");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009587
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07009588 std::vector<std::string> Includes =
9589 Args.getAllArgValues(options::OPT_include);
Stephen Hinesef822542014-07-21 00:47:37 -07009590 for (const auto &Include : Includes)
9591 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg4fe475a2013-09-27 17:54:18 +00009592
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009593 // Flags that can simply be passed through.
9594 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9595 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Stephen Hinesef822542014-07-21 00:47:37 -07009596 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009597 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009598
9599 // The order of these flags is relevant, so pick the last one.
9600 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9601 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9602 A->render(Args, CmdArgs);
9603
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009604 // Input filename.
9605 assert(Inputs.size() == 1);
9606 const InputInfo &II = Inputs[0];
9607 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9608 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9609 if (II.isFilename())
9610 CmdArgs.push_back(II.getFilename());
9611 else
9612 II.getInputArg().renderAsInput(Args, CmdArgs);
9613
9614 // Output filename.
9615 assert(Output.getType() == types::TY_Object);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009616 const char *Fo =
9617 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009618 CmdArgs.push_back(Fo);
9619
Hans Wennborgdc40bf92013-09-20 18:16:35 +00009620 const Driver &D = getToolChain().getDriver();
Stephen Hines176edba2014-12-01 14:53:08 -08009621 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9622 D.getClangProgramPath());
9623 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009624 CmdArgs, Inputs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00009625}
Robert Lytton4e490e22013-10-11 10:29:40 +00009626
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009627/// MinGW Tools
9628void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9629 const InputInfo &Output,
9630 const InputInfoList &Inputs,
9631 const ArgList &Args,
9632 const char *LinkingOutput) const {
9633 claimNoWarnArgs(Args);
9634 ArgStringList CmdArgs;
9635
9636 if (getToolChain().getArch() == llvm::Triple::x86) {
9637 CmdArgs.push_back("--32");
9638 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9639 CmdArgs.push_back("--64");
9640 }
9641
9642 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9643
9644 CmdArgs.push_back("-o");
9645 CmdArgs.push_back(Output.getFilename());
9646
9647 for (const auto &II : Inputs)
9648 CmdArgs.push_back(II.getFilename());
9649
9650 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
9651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
9652
9653 if (Args.hasArg(options::OPT_gsplit_dwarf))
9654 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9655 SplitDebugName(Args, Inputs[0]));
9656}
9657
9658void MinGW::Linker::AddLibGCC(const ArgList &Args,
9659 ArgStringList &CmdArgs) const {
9660 if (Args.hasArg(options::OPT_mthreads))
9661 CmdArgs.push_back("-lmingwthrd");
9662 CmdArgs.push_back("-lmingw32");
9663
9664 // Make use of compiler-rt if --rtlib option is used
9665 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9666 if (RLT == ToolChain::RLT_Libgcc) {
9667 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9668 Args.hasArg(options::OPT_static);
9669 bool Shared = Args.hasArg(options::OPT_shared);
9670 bool CXX = getToolChain().getDriver().CCCIsCXX();
9671
9672 if (Static || (!CXX && !Shared)) {
9673 CmdArgs.push_back("-lgcc");
9674 CmdArgs.push_back("-lgcc_eh");
9675 } else {
9676 CmdArgs.push_back("-lgcc_s");
9677 CmdArgs.push_back("-lgcc");
9678 }
9679 } else {
9680 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9681 }
9682
9683 CmdArgs.push_back("-lmoldname");
9684 CmdArgs.push_back("-lmingwex");
9685 CmdArgs.push_back("-lmsvcrt");
9686}
9687
9688void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9689 const InputInfo &Output,
9690 const InputInfoList &Inputs,
9691 const ArgList &Args,
9692 const char *LinkingOutput) const {
9693 const ToolChain &TC = getToolChain();
9694 const Driver &D = TC.getDriver();
9695 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9696
9697 ArgStringList CmdArgs;
9698
9699 // Silence warning for "clang -g foo.o -o foo"
9700 Args.ClaimAllArgs(options::OPT_g_Group);
9701 // and "clang -emit-llvm foo.o -o foo"
9702 Args.ClaimAllArgs(options::OPT_emit_llvm);
9703 // and for "clang -w foo.o -o foo". Other warning options are already
9704 // handled somewhere else.
9705 Args.ClaimAllArgs(options::OPT_w);
9706
9707 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9708 if (LinkerName.equals_lower("lld")) {
9709 CmdArgs.push_back("-flavor");
9710 CmdArgs.push_back("gnu");
9711 } else if (!LinkerName.equals_lower("ld")) {
9712 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
9713 }
9714
9715 if (!D.SysRoot.empty())
9716 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9717
9718 if (Args.hasArg(options::OPT_s))
9719 CmdArgs.push_back("-s");
9720
9721 CmdArgs.push_back("-m");
9722 if (TC.getArch() == llvm::Triple::x86)
9723 CmdArgs.push_back("i386pe");
9724 if (TC.getArch() == llvm::Triple::x86_64)
9725 CmdArgs.push_back("i386pep");
9726 if (TC.getArch() == llvm::Triple::arm)
9727 CmdArgs.push_back("thumb2pe");
9728
9729 if (Args.hasArg(options::OPT_mwindows)) {
9730 CmdArgs.push_back("--subsystem");
9731 CmdArgs.push_back("windows");
9732 } else if (Args.hasArg(options::OPT_mconsole)) {
9733 CmdArgs.push_back("--subsystem");
9734 CmdArgs.push_back("console");
9735 }
9736
9737 if (Args.hasArg(options::OPT_static))
9738 CmdArgs.push_back("-Bstatic");
9739 else {
9740 if (Args.hasArg(options::OPT_mdll))
9741 CmdArgs.push_back("--dll");
9742 else if (Args.hasArg(options::OPT_shared))
9743 CmdArgs.push_back("--shared");
9744 CmdArgs.push_back("-Bdynamic");
9745 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9746 CmdArgs.push_back("-e");
9747 if (TC.getArch() == llvm::Triple::x86)
9748 CmdArgs.push_back("_DllMainCRTStartup@12");
9749 else
9750 CmdArgs.push_back("DllMainCRTStartup");
9751 CmdArgs.push_back("--enable-auto-image-base");
9752 }
9753 }
9754
9755 CmdArgs.push_back("-o");
9756 CmdArgs.push_back(Output.getFilename());
9757
9758 Args.AddAllArgs(CmdArgs, options::OPT_e);
9759 // FIXME: add -N, -n flags
9760 Args.AddLastArg(CmdArgs, options::OPT_r);
9761 Args.AddLastArg(CmdArgs, options::OPT_s);
9762 Args.AddLastArg(CmdArgs, options::OPT_t);
9763 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9764 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9765
9766 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
9767 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9768 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9769 } else {
9770 if (Args.hasArg(options::OPT_municode))
9771 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9772 else
9773 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9774 }
9775 if (Args.hasArg(options::OPT_pg))
9776 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9777 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9778 }
9779
9780 Args.AddAllArgs(CmdArgs, options::OPT_L);
9781 TC.AddFilePathLibArgs(Args, CmdArgs);
9782 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9783
9784 // TODO: Add ASan stuff here
9785
9786 // TODO: Add profile stuff here
9787
9788 if (D.CCCIsCXX() &&
9789 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
9790 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9791 !Args.hasArg(options::OPT_static);
9792 if (OnlyLibstdcxxStatic)
9793 CmdArgs.push_back("-Bstatic");
9794 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9795 if (OnlyLibstdcxxStatic)
9796 CmdArgs.push_back("-Bdynamic");
9797 }
9798
9799 if (!Args.hasArg(options::OPT_nostdlib)) {
9800 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9801 if (Args.hasArg(options::OPT_static))
9802 CmdArgs.push_back("--start-group");
9803
9804 if (Args.hasArg(options::OPT_fstack_protector) ||
9805 Args.hasArg(options::OPT_fstack_protector_strong) ||
9806 Args.hasArg(options::OPT_fstack_protector_all)) {
9807 CmdArgs.push_back("-lssp_nonshared");
9808 CmdArgs.push_back("-lssp");
9809 }
9810 if (Args.hasArg(options::OPT_fopenmp))
9811 CmdArgs.push_back("-lgomp");
9812
9813 AddLibGCC(Args, CmdArgs);
9814
9815 if (Args.hasArg(options::OPT_pg))
9816 CmdArgs.push_back("-lgmon");
9817
9818 if (Args.hasArg(options::OPT_pthread))
9819 CmdArgs.push_back("-lpthread");
9820
9821 // add system libraries
9822 if (Args.hasArg(options::OPT_mwindows)) {
9823 CmdArgs.push_back("-lgdi32");
9824 CmdArgs.push_back("-lcomdlg32");
9825 }
9826 CmdArgs.push_back("-ladvapi32");
9827 CmdArgs.push_back("-lshell32");
9828 CmdArgs.push_back("-luser32");
9829 CmdArgs.push_back("-lkernel32");
9830
9831 if (Args.hasArg(options::OPT_static))
9832 CmdArgs.push_back("--end-group");
9833 else if (!LinkerName.equals_lower("lld"))
9834 AddLibGCC(Args, CmdArgs);
9835 }
9836
9837 if (!Args.hasArg(options::OPT_nostartfiles)) {
9838 // Add crtfastmath.o if available and fast math is enabled.
9839 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9840
9841 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9842 }
9843 }
9844 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
9845 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
9846}
Robert Lytton4e490e22013-10-11 10:29:40 +00009847
9848/// XCore Tools
9849// We pass assemble and link construction to the xcc tool.
9850
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009851void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9852 const InputInfo &Output,
9853 const InputInfoList &Inputs,
9854 const ArgList &Args,
9855 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009856 claimNoWarnArgs(Args);
Robert Lytton4e490e22013-10-11 10:29:40 +00009857 ArgStringList CmdArgs;
9858
9859 CmdArgs.push_back("-o");
9860 CmdArgs.push_back(Output.getFilename());
9861
9862 CmdArgs.push_back("-c");
9863
Stephen Hines651f13c2014-04-23 16:59:28 -07009864 if (Args.hasArg(options::OPT_v))
9865 CmdArgs.push_back("-v");
9866
Stephen Hines6bcf27b2014-05-29 04:14:42 -07009867 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9868 if (!A->getOption().matches(options::OPT_g0))
9869 CmdArgs.push_back("-g");
Stephen Hines651f13c2014-04-23 16:59:28 -07009870
9871 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9872 false))
9873 CmdArgs.push_back("-fverbose-asm");
Robert Lytton4e490e22013-10-11 10:29:40 +00009874
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009875 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lytton4e490e22013-10-11 10:29:40 +00009876
Stephen Hinesef822542014-07-21 00:47:37 -07009877 for (const auto &II : Inputs)
Robert Lytton4e490e22013-10-11 10:29:40 +00009878 CmdArgs.push_back(II.getFilename());
Robert Lytton4e490e22013-10-11 10:29:40 +00009879
Stephen Hinesef822542014-07-21 00:47:37 -07009880 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009881 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lytton4e490e22013-10-11 10:29:40 +00009882}
9883
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009884void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9885 const InputInfo &Output,
9886 const InputInfoList &Inputs,
9887 const ArgList &Args,
9888 const char *LinkingOutput) const {
Robert Lytton4e490e22013-10-11 10:29:40 +00009889 ArgStringList CmdArgs;
9890
9891 if (Output.isFilename()) {
9892 CmdArgs.push_back("-o");
9893 CmdArgs.push_back(Output.getFilename());
9894 } else {
9895 assert(Output.isNothing() && "Invalid output.");
9896 }
9897
Stephen Hines651f13c2014-04-23 16:59:28 -07009898 if (Args.hasArg(options::OPT_v))
9899 CmdArgs.push_back("-v");
9900
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009901 // Pass -fexceptions through to the linker if it was present.
9902 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9903 false))
Stephen Hines651f13c2014-04-23 16:59:28 -07009904 CmdArgs.push_back("-fexceptions");
9905
Robert Lytton4e490e22013-10-11 10:29:40 +00009906 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9907
Stephen Hinesef822542014-07-21 00:47:37 -07009908 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009909 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lytton4e490e22013-10-11 10:29:40 +00009910}
Stephen Hines176edba2014-12-01 14:53:08 -08009911
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009912void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9913 const InputInfo &Output,
9914 const InputInfoList &Inputs,
9915 const ArgList &Args,
9916 const char *LinkingOutput) const {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07009917 claimNoWarnArgs(Args);
Stephen Hines176edba2014-12-01 14:53:08 -08009918 const auto &TC =
9919 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9920 ArgStringList CmdArgs;
9921 const char *Exec;
9922
9923 switch (TC.getArch()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009924 default:
9925 llvm_unreachable("unsupported architecture");
Stephen Hines176edba2014-12-01 14:53:08 -08009926 case llvm::Triple::arm:
9927 case llvm::Triple::thumb:
9928 break;
9929 case llvm::Triple::x86:
9930 CmdArgs.push_back("--32");
9931 break;
9932 case llvm::Triple::x86_64:
9933 CmdArgs.push_back("--64");
9934 break;
9935 }
9936
9937 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9938
9939 CmdArgs.push_back("-o");
9940 CmdArgs.push_back(Output.getFilename());
9941
9942 for (const auto &Input : Inputs)
9943 CmdArgs.push_back(Input.getFilename());
9944
9945 const std::string Assembler = TC.GetProgramPath("as");
9946 Exec = Args.MakeArgString(Assembler);
9947
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009948 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Stephen Hines176edba2014-12-01 14:53:08 -08009949}
9950
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009951void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9952 const InputInfo &Output,
9953 const InputInfoList &Inputs,
9954 const ArgList &Args,
9955 const char *LinkingOutput) const {
Stephen Hines176edba2014-12-01 14:53:08 -08009956 const auto &TC =
9957 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9958 const llvm::Triple &T = TC.getTriple();
9959 const Driver &D = TC.getDriver();
9960 SmallString<128> EntryPoint;
9961 ArgStringList CmdArgs;
9962 const char *Exec;
9963
9964 // Silence warning for "clang -g foo.o -o foo"
9965 Args.ClaimAllArgs(options::OPT_g_Group);
9966 // and "clang -emit-llvm foo.o -o foo"
9967 Args.ClaimAllArgs(options::OPT_emit_llvm);
9968 // and for "clang -w foo.o -o foo"
9969 Args.ClaimAllArgs(options::OPT_w);
9970 // Other warning options are already handled somewhere else.
9971
9972 if (!D.SysRoot.empty())
9973 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9974
9975 if (Args.hasArg(options::OPT_pie))
9976 CmdArgs.push_back("-pie");
9977 if (Args.hasArg(options::OPT_rdynamic))
9978 CmdArgs.push_back("-export-dynamic");
9979 if (Args.hasArg(options::OPT_s))
9980 CmdArgs.push_back("--strip-all");
9981
9982 CmdArgs.push_back("-m");
9983 switch (TC.getArch()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -08009984 default:
9985 llvm_unreachable("unsupported architecture");
Stephen Hines176edba2014-12-01 14:53:08 -08009986 case llvm::Triple::arm:
9987 case llvm::Triple::thumb:
9988 // FIXME: this is incorrect for WinCE
9989 CmdArgs.push_back("thumb2pe");
9990 break;
9991 case llvm::Triple::x86:
9992 CmdArgs.push_back("i386pe");
9993 EntryPoint.append("_");
9994 break;
9995 case llvm::Triple::x86_64:
9996 CmdArgs.push_back("i386pep");
9997 break;
9998 }
9999
10000 if (Args.hasArg(options::OPT_shared)) {
10001 switch (T.getArch()) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010002 default:
10003 llvm_unreachable("unsupported architecture");
Stephen Hines176edba2014-12-01 14:53:08 -080010004 case llvm::Triple::arm:
10005 case llvm::Triple::thumb:
10006 case llvm::Triple::x86_64:
10007 EntryPoint.append("_DllMainCRTStartup");
10008 break;
10009 case llvm::Triple::x86:
10010 EntryPoint.append("_DllMainCRTStartup@12");
10011 break;
10012 }
10013
10014 CmdArgs.push_back("-shared");
10015 CmdArgs.push_back("-Bdynamic");
10016
10017 CmdArgs.push_back("--enable-auto-image-base");
10018
10019 CmdArgs.push_back("--entry");
10020 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10021 } else {
10022 EntryPoint.append("mainCRTStartup");
10023
10024 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10025 : "-Bdynamic");
10026
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010027 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines176edba2014-12-01 14:53:08 -080010028 CmdArgs.push_back("--entry");
10029 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10030 }
10031
10032 // FIXME: handle subsystem
10033 }
10034
10035 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
10036 CmdArgs.push_back("--allow-multiple-definition");
10037
10038 CmdArgs.push_back("-o");
10039 CmdArgs.push_back(Output.getFilename());
10040
10041 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10042 SmallString<261> ImpLib(Output.getFilename());
10043 llvm::sys::path::replace_extension(ImpLib, ".lib");
10044
10045 CmdArgs.push_back("--out-implib");
10046 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10047 }
10048
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010049 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Stephen Hines176edba2014-12-01 14:53:08 -080010050 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10051 const char *CRTBegin;
10052
10053 CRTBegin =
10054 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10055 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10056 }
10057
10058 Args.AddAllArgs(CmdArgs, options::OPT_L);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010059 TC.AddFilePathLibArgs(Args, CmdArgs);
Stephen Hines176edba2014-12-01 14:53:08 -080010060 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10061
10062 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10063 !Args.hasArg(options::OPT_nodefaultlibs)) {
10064 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10065 !Args.hasArg(options::OPT_static);
10066 if (StaticCXX)
10067 CmdArgs.push_back("-Bstatic");
10068 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10069 if (StaticCXX)
10070 CmdArgs.push_back("-Bdynamic");
10071 }
10072
10073 if (!Args.hasArg(options::OPT_nostdlib)) {
10074 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10075 // TODO handle /MT[d] /MD[d]
10076 CmdArgs.push_back("-lmsvcrt");
10077 AddRunTimeLibs(TC, D, CmdArgs, Args);
10078 }
10079 }
10080
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010081 if (TC.getSanitizerArgs().needsAsanRt()) {
10082 // TODO handle /MT[d] /MD[d]
10083 if (Args.hasArg(options::OPT_shared)) {
10084 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10085 } else {
10086 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10087 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10088 // Make sure the dynamic runtime thunk is not optimized out at link time
10089 // to ensure proper SEH handling.
10090 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10091 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10092 ? "___asan_seh_interceptor"
10093 : "__asan_seh_interceptor"));
10094 }
10095 }
Stephen Hines176edba2014-12-01 14:53:08 -080010096
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080010097 Exec = Args.MakeArgString(TC.GetLinkerPath());
10098
10099 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10100}
10101
10102void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10103 const InputInfo &Output,
10104 const InputInfoList &Inputs,
10105 const ArgList &Args,
10106 const char *LinkingOutput) const {
10107 ArgStringList CmdArgs;
10108 assert(Inputs.size() == 1);
10109 const InputInfo &II = Inputs[0];
10110 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10111 II.getType() == types::TY_PP_CXX);
10112
10113 if (JA.getKind() == Action::PreprocessJobClass) {
10114 Args.ClaimAllArgs();
10115 CmdArgs.push_back("-E");
10116 } else {
10117 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10118 CmdArgs.push_back("-S");
10119 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10120 }
10121 CmdArgs.push_back("-mcpu=myriad2");
10122 CmdArgs.push_back("-DMYRIAD2");
10123
10124 // Append all -I, -iquote, -isystem paths, defines/undefines,
10125 // 'f' flags, optimize flags, and warning options.
10126 // These are spelled the same way in clang and moviCompile.
10127 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
10128 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
10129 options::OPT_f_Group, options::OPT_f_clang_Group,
10130 options::OPT_g_Group, options::OPT_M_Group,
10131 options::OPT_O_Group, options::OPT_W_Group});
10132
10133 // If we're producing a dependency file, and assembly is the final action,
10134 // then the name of the target in the dependency file should be the '.o'
10135 // file, not the '.s' file produced by this step. For example, instead of
10136 // /tmp/mumble.s: mumble.c .../someheader.h
10137 // the filename on the lefthand side should be "mumble.o"
10138 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10139 C.getActions().size() == 1 &&
10140 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10141 Arg *A = Args.getLastArg(options::OPT_o);
10142 if (A) {
10143 CmdArgs.push_back("-MT");
10144 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10145 }
10146 }
10147
10148 CmdArgs.push_back(II.getFilename());
10149 CmdArgs.push_back("-o");
10150 CmdArgs.push_back(Output.getFilename());
10151
10152 std::string Exec =
10153 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
10154 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10155 CmdArgs, Inputs));
10156}
10157
10158void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10159 const InputInfo &Output,
10160 const InputInfoList &Inputs,
10161 const ArgList &Args,
10162 const char *LinkingOutput) const {
10163 ArgStringList CmdArgs;
10164
10165 assert(Inputs.size() == 1);
10166 const InputInfo &II = Inputs[0];
10167 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10168 assert(Output.getType() == types::TY_Object);
10169
10170 CmdArgs.push_back("-no6thSlotCompression");
10171 CmdArgs.push_back("-cv:myriad2"); // Chip Version
10172 CmdArgs.push_back("-noSPrefixing");
10173 CmdArgs.push_back("-a"); // Mystery option.
10174 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10175 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10176 A->claim();
10177 CmdArgs.push_back(
10178 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
10179 }
10180 CmdArgs.push_back("-elf"); // Output format.
10181 CmdArgs.push_back(II.getFilename());
10182 CmdArgs.push_back(
10183 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10184
10185 std::string Exec =
10186 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
10187 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10188 CmdArgs, Inputs));
10189}
10190
10191void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10192 const InputInfo &Output,
10193 const InputInfoList &Inputs,
10194 const ArgList &Args,
10195 const char *LinkingOutput) const {
10196 const auto &TC =
10197 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10198 const llvm::Triple &T = TC.getTriple();
10199 ArgStringList CmdArgs;
10200 bool UseStartfiles =
10201 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
10202 bool UseDefaultLibs =
10203 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
10204
10205 if (T.getArch() == llvm::Triple::sparc)
10206 CmdArgs.push_back("-EB");
10207 else // SHAVE assumes little-endian, and sparcel is expressly so.
10208 CmdArgs.push_back("-EL");
10209
10210 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10211 // but we never pass through a --sysroot option and various other bits.
10212 // For example, there are no sanitizers (yet) nor gold linker.
10213
10214 // Eat some arguments that may be present but have no effect.
10215 Args.ClaimAllArgs(options::OPT_g_Group);
10216 Args.ClaimAllArgs(options::OPT_w);
10217 Args.ClaimAllArgs(options::OPT_static_libgcc);
10218
10219 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10220 CmdArgs.push_back("-s");
10221
10222 CmdArgs.push_back("-o");
10223 CmdArgs.push_back(Output.getFilename());
10224
10225 if (UseStartfiles) {
10226 // If you want startfiles, it means you want the builtin crti and crtbegin,
10227 // but not crt0. Myriad link commands provide their own crt0.o as needed.
10228 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10229 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10230 }
10231
10232 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10233 options::OPT_e, options::OPT_s, options::OPT_t,
10234 options::OPT_Z_Flag, options::OPT_r});
10235
10236 TC.AddFilePathLibArgs(Args, CmdArgs);
10237
10238 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10239
10240 if (UseDefaultLibs) {
10241 if (C.getDriver().CCCIsCXX())
10242 CmdArgs.push_back("-lstdc++");
10243 if (T.getOS() == llvm::Triple::RTEMS) {
10244 CmdArgs.push_back("--start-group");
10245 CmdArgs.push_back("-lc");
10246 // You must provide your own "-L" option to enable finding these.
10247 CmdArgs.push_back("-lrtemscpu");
10248 CmdArgs.push_back("-lrtemsbsp");
10249 CmdArgs.push_back("--end-group");
10250 } else {
10251 CmdArgs.push_back("-lc");
10252 }
10253 CmdArgs.push_back("-lgcc");
10254 }
10255 if (UseStartfiles) {
10256 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10257 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
10258 }
10259
10260 std::string Exec =
10261 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10262 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10263 CmdArgs, Inputs));
10264}
10265
10266void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10267 const InputInfo &Output,
10268 const InputInfoList &Inputs,
10269 const ArgList &Args,
10270 const char *LinkingOutput) const {
10271 claimNoWarnArgs(Args);
10272 ArgStringList CmdArgs;
10273
10274 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10275
10276 CmdArgs.push_back("-o");
10277 CmdArgs.push_back(Output.getFilename());
10278
10279 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10280 const InputInfo &Input = Inputs[0];
10281 assert(Input.isFilename() && "Invalid input.");
10282 CmdArgs.push_back(Input.getFilename());
10283
10284 const char *Exec =
10285 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10286 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10287}
10288
10289static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10290 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10291 if (SanArgs.needsUbsanRt()) {
10292 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10293 }
10294 if (SanArgs.needsAsanRt()) {
10295 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10296 }
10297}
10298
10299static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10300 const JobAction &JA, const InputInfo &Output,
10301 const InputInfoList &Inputs,
10302 const ArgList &Args,
10303 const char *LinkingOutput) {
10304 const toolchains::FreeBSD &ToolChain =
10305 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10306 const Driver &D = ToolChain.getDriver();
10307 ArgStringList CmdArgs;
10308
10309 // Silence warning for "clang -g foo.o -o foo"
10310 Args.ClaimAllArgs(options::OPT_g_Group);
10311 // and "clang -emit-llvm foo.o -o foo"
10312 Args.ClaimAllArgs(options::OPT_emit_llvm);
10313 // and for "clang -w foo.o -o foo". Other warning options are already
10314 // handled somewhere else.
10315 Args.ClaimAllArgs(options::OPT_w);
10316
10317 if (!D.SysRoot.empty())
10318 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10319
10320 if (Args.hasArg(options::OPT_pie))
10321 CmdArgs.push_back("-pie");
10322
10323 if (Args.hasArg(options::OPT_rdynamic))
10324 CmdArgs.push_back("-export-dynamic");
10325 if (Args.hasArg(options::OPT_shared))
10326 CmdArgs.push_back("--oformat=so");
10327
10328 if (Output.isFilename()) {
10329 CmdArgs.push_back("-o");
10330 CmdArgs.push_back(Output.getFilename());
10331 } else {
10332 assert(Output.isNothing() && "Invalid output.");
10333 }
10334
10335 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10336
10337 Args.AddAllArgs(CmdArgs, options::OPT_L);
10338 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10339 Args.AddAllArgs(CmdArgs, options::OPT_e);
10340 Args.AddAllArgs(CmdArgs, options::OPT_s);
10341 Args.AddAllArgs(CmdArgs, options::OPT_t);
10342 Args.AddAllArgs(CmdArgs, options::OPT_r);
10343
10344 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10345 CmdArgs.push_back("--no-demangle");
10346
10347 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10348
10349 if (Args.hasArg(options::OPT_pthread)) {
10350 CmdArgs.push_back("-lpthread");
10351 }
10352
10353 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10354
10355 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10356}
10357
10358static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10359 const JobAction &JA, const InputInfo &Output,
10360 const InputInfoList &Inputs,
10361 const ArgList &Args,
10362 const char *LinkingOutput) {
10363 const toolchains::FreeBSD &ToolChain =
10364 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10365 const Driver &D = ToolChain.getDriver();
10366 ArgStringList CmdArgs;
10367
10368 // Silence warning for "clang -g foo.o -o foo"
10369 Args.ClaimAllArgs(options::OPT_g_Group);
10370 // and "clang -emit-llvm foo.o -o foo"
10371 Args.ClaimAllArgs(options::OPT_emit_llvm);
10372 // and for "clang -w foo.o -o foo". Other warning options are already
10373 // handled somewhere else.
10374 Args.ClaimAllArgs(options::OPT_w);
10375
10376 if (!D.SysRoot.empty())
10377 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10378
10379 if (Args.hasArg(options::OPT_pie))
10380 CmdArgs.push_back("-pie");
10381
10382 if (Args.hasArg(options::OPT_static)) {
10383 CmdArgs.push_back("-Bstatic");
10384 } else {
10385 if (Args.hasArg(options::OPT_rdynamic))
10386 CmdArgs.push_back("-export-dynamic");
10387 CmdArgs.push_back("--eh-frame-hdr");
10388 if (Args.hasArg(options::OPT_shared)) {
10389 CmdArgs.push_back("-Bshareable");
10390 } else {
10391 CmdArgs.push_back("-dynamic-linker");
10392 CmdArgs.push_back("/libexec/ld-elf.so.1");
10393 }
10394 CmdArgs.push_back("--enable-new-dtags");
10395 }
10396
10397 if (Output.isFilename()) {
10398 CmdArgs.push_back("-o");
10399 CmdArgs.push_back(Output.getFilename());
10400 } else {
10401 assert(Output.isNothing() && "Invalid output.");
10402 }
10403
10404 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10405
10406 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
10407 const char *crt1 = nullptr;
10408 if (!Args.hasArg(options::OPT_shared)) {
10409 if (Args.hasArg(options::OPT_pg))
10410 crt1 = "gcrt1.o";
10411 else if (Args.hasArg(options::OPT_pie))
10412 crt1 = "Scrt1.o";
10413 else
10414 crt1 = "crt1.o";
10415 }
10416 if (crt1)
10417 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10418
10419 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10420
10421 const char *crtbegin = nullptr;
10422 if (Args.hasArg(options::OPT_static))
10423 crtbegin = "crtbeginT.o";
10424 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10425 crtbegin = "crtbeginS.o";
10426 else
10427 crtbegin = "crtbegin.o";
10428
10429 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10430 }
10431
10432 Args.AddAllArgs(CmdArgs, options::OPT_L);
10433 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
10434 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10435 Args.AddAllArgs(CmdArgs, options::OPT_e);
10436 Args.AddAllArgs(CmdArgs, options::OPT_s);
10437 Args.AddAllArgs(CmdArgs, options::OPT_t);
10438 Args.AddAllArgs(CmdArgs, options::OPT_r);
10439
10440 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10441 CmdArgs.push_back("--no-demangle");
10442
10443 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10444
10445 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
10446 // For PS4, we always want to pass libm, libstdc++ and libkernel
10447 // libraries for both C and C++ compilations.
10448 CmdArgs.push_back("-lkernel");
10449 if (D.CCCIsCXX()) {
10450 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10451 if (Args.hasArg(options::OPT_pg))
10452 CmdArgs.push_back("-lm_p");
10453 else
10454 CmdArgs.push_back("-lm");
10455 }
10456 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10457 // the default system libraries. Just mimic this for now.
10458 if (Args.hasArg(options::OPT_pg))
10459 CmdArgs.push_back("-lgcc_p");
10460 else
10461 CmdArgs.push_back("-lcompiler_rt");
10462 if (Args.hasArg(options::OPT_static)) {
10463 CmdArgs.push_back("-lstdc++");
10464 } else if (Args.hasArg(options::OPT_pg)) {
10465 CmdArgs.push_back("-lgcc_eh_p");
10466 } else {
10467 CmdArgs.push_back("--as-needed");
10468 CmdArgs.push_back("-lstdc++");
10469 CmdArgs.push_back("--no-as-needed");
10470 }
10471
10472 if (Args.hasArg(options::OPT_pthread)) {
10473 if (Args.hasArg(options::OPT_pg))
10474 CmdArgs.push_back("-lpthread_p");
10475 else
10476 CmdArgs.push_back("-lpthread");
10477 }
10478
10479 if (Args.hasArg(options::OPT_pg)) {
10480 if (Args.hasArg(options::OPT_shared))
10481 CmdArgs.push_back("-lc");
10482 else {
10483 if (Args.hasArg(options::OPT_static)) {
10484 CmdArgs.push_back("--start-group");
10485 CmdArgs.push_back("-lc_p");
10486 CmdArgs.push_back("-lpthread_p");
10487 CmdArgs.push_back("--end-group");
10488 } else {
10489 CmdArgs.push_back("-lc_p");
10490 }
10491 }
10492 CmdArgs.push_back("-lgcc_p");
10493 } else {
10494 if (Args.hasArg(options::OPT_static)) {
10495 CmdArgs.push_back("--start-group");
10496 CmdArgs.push_back("-lc");
10497 CmdArgs.push_back("-lpthread");
10498 CmdArgs.push_back("--end-group");
10499 } else {
10500 CmdArgs.push_back("-lc");
10501 }
10502 CmdArgs.push_back("-lcompiler_rt");
10503 }
10504
10505 if (Args.hasArg(options::OPT_static)) {
10506 CmdArgs.push_back("-lstdc++");
10507 } else if (Args.hasArg(options::OPT_pg)) {
10508 CmdArgs.push_back("-lgcc_eh_p");
10509 } else {
10510 CmdArgs.push_back("--as-needed");
10511 CmdArgs.push_back("-lstdc++");
10512 CmdArgs.push_back("--no-as-needed");
10513 }
10514 }
10515
10516 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
10517 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10518 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10519 else
10520 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10521 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10522 }
10523
10524 const char *Exec =
10525#ifdef LLVM_ON_WIN32
10526 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
10527#else
10528 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10529#endif
10530
10531 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10532}
10533
10534void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10535 const InputInfo &Output,
10536 const InputInfoList &Inputs,
10537 const ArgList &Args,
10538 const char *LinkingOutput) const {
10539 const toolchains::FreeBSD &ToolChain =
10540 static_cast<const toolchains::FreeBSD &>(getToolChain());
10541 const Driver &D = ToolChain.getDriver();
10542 bool PS4Linker;
10543 StringRef LinkerOptName;
10544 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10545 LinkerOptName = A->getValue();
10546 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10547 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10548 }
10549
10550 if (LinkerOptName == "gold")
10551 PS4Linker = false;
10552 else if (LinkerOptName == "ps4")
10553 PS4Linker = true;
10554 else
10555 PS4Linker = !Args.hasArg(options::OPT_shared);
10556
10557 if (PS4Linker)
10558 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10559 else
10560 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
Stephen Hines176edba2014-12-01 14:53:08 -080010561}