blob: fbf1e3be420e67acc96544b70b024bbcb1cf23b2 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Tim Northover99694fe2016-04-13 17:08:51 +0000806 if (Triple.isOSBinFormatMachO() &&
807 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
808 ABI = FloatABI::Hard;
809 else
810 ABI = FloatABI::Soft;
811
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000812 if (Triple.getOS() != llvm::Triple::UnknownOS ||
813 !Triple.isOSBinFormatMachO())
814 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000815 break;
816 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 }
818 }
819
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000820 assert(ABI != FloatABI::Invalid && "must select an ABI");
821 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822}
823
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824static void getARMTargetFeatures(const ToolChain &TC,
825 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000826 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000827 std::vector<const char *> &Features,
828 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000829 const Driver &D = TC.getDriver();
830
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000831 bool KernelOrKext =
832 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000833 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000834 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
835 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
836
Nico Weber6e0ebae2015-04-29 21:16:40 +0000837 if (!ForAS) {
838 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
839 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
840 // stripped out by the ARM target. We should probably pass this a new
841 // -target-option, which is handled by the -cc1/-cc1as invocation.
842 //
843 // FIXME2: For consistency, it would be ideal if we set up the target
844 // machine state the same when using the frontend or the assembler. We don't
845 // currently do that for the assembler, we pass the options directly to the
846 // backend and never even instantiate the frontend TargetInfo. If we did,
847 // and used its handleTargetFeatures hook, then we could ensure the
848 // assembler and the frontend behave the same.
849
850 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000851 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000852 Features.push_back("+soft-float");
853
854 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000855 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000856 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000857 } else {
858 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
859 // to the assembler correctly.
860 for (const Arg *A :
861 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
862 StringRef Value = A->getValue();
863 if (Value.startswith("-mfpu=")) {
864 WaFPU = A;
865 } else if (Value.startswith("-mcpu=")) {
866 WaCPU = A;
867 } else if (Value.startswith("-mhwdiv=")) {
868 WaHDiv = A;
869 } else if (Value.startswith("-march=")) {
870 WaArch = A;
871 }
872 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000873 }
874
Renato Golin7c542b42015-07-27 23:44:45 +0000875 // Check -march. ClangAs gives preference to -Wa,-march=.
876 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000877 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000878 if (WaArch) {
879 if (ArchArg)
880 D.Diag(clang::diag::warn_drv_unused_argument)
881 << ArchArg->getAsString(Args);
882 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000884 // FIXME: Set Arch.
885 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
886 } else if (ArchArg) {
887 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000888 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000889 }
890
Renato Golin7c542b42015-07-27 23:44:45 +0000891 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
892 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000893 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000894 if (WaCPU) {
895 if (CPUArg)
896 D.Diag(clang::diag::warn_drv_unused_argument)
897 << CPUArg->getAsString(Args);
898 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000899 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000900 } else if (CPUArg) {
901 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000902 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000903 }
John Brawna95c1a82015-05-08 12:52:18 +0000904
Renato Golin23459c62015-07-30 16:40:17 +0000905 // Add CPU features for generic CPUs
906 if (CPUName == "native") {
907 llvm::StringMap<bool> HostFeatures;
908 if (llvm::sys::getHostCPUFeatures(HostFeatures))
909 for (auto &F : HostFeatures)
910 Features.push_back(
911 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
912 }
913
914 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
915 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
916 if (WaFPU) {
917 if (FPUArg)
918 D.Diag(clang::diag::warn_drv_unused_argument)
919 << FPUArg->getAsString(Args);
920 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
921 Features);
922 } else if (FPUArg) {
923 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
924 }
925
926 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
927 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
928 if (WaHDiv) {
929 if (HDivArg)
930 D.Diag(clang::diag::warn_drv_unused_argument)
931 << HDivArg->getAsString(Args);
932 getARMHWDivFeatures(D, WaHDiv, Args,
933 StringRef(WaHDiv->getValue()).substr(8), Features);
934 } else if (HDivArg)
935 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
936
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 // Setting -msoft-float effectively disables NEON because of the GCC
938 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000939 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000940 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000941 // Also need to explicitly disable features which imply NEON.
942 Features.push_back("-crypto");
943 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000944
Eric Christopher269c2a22015-04-04 03:34:43 +0000945 // En/disable crc code generation.
946 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000947 if (A->getOption().matches(options::OPT_mcrc))
948 Features.push_back("+crc");
949 else
950 Features.push_back("-crc");
951 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000952
Akira Hatanakac2694822015-07-07 08:28:42 +0000953 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
954 // neither options are specified, see if we are compiling for kernel/kext and
955 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
957 options::OPT_mno_long_calls)) {
958 if (A->getOption().matches(options::OPT_mlong_calls))
959 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000960 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
961 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000962 Features.push_back("+long-calls");
963 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000964
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000965 // Kernel code has more strict alignment requirements.
966 if (KernelOrKext)
967 Features.push_back("+strict-align");
968 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
969 options::OPT_munaligned_access)) {
970 if (A->getOption().matches(options::OPT_munaligned_access)) {
971 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
972 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
973 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000974 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
975 // access either.
976 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
977 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 } else
979 Features.push_back("+strict-align");
980 } else {
981 // Assume pre-ARMv6 doesn't support unaligned accesses.
982 //
983 // ARMv6 may or may not support unaligned accesses depending on the
984 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
985 // Darwin and NetBSD targets support unaligned accesses, and others don't.
986 //
987 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
988 // which raises an alignment fault on unaligned accesses. Linux
989 // defaults this bit to 0 and handles it as a system-wide (not
990 // per-process) setting. It is therefore safe to assume that ARMv7+
991 // Linux targets support unaligned accesses. The same goes for NaCl.
992 //
993 // The above behavior is consistent with GCC.
994 int VersionNum = getARMSubArchVersionNumber(Triple);
995 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000996 if (VersionNum < 6 ||
997 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000998 Features.push_back("+strict-align");
999 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1000 if (VersionNum < 7)
1001 Features.push_back("+strict-align");
1002 } else
1003 Features.push_back("+strict-align");
1004 }
1005
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001006 // llvm does not support reserving registers in general. There is support
1007 // for reserving r9 on ARM though (defined as a platform-specific register
1008 // in ARM EABI).
1009 if (Args.hasArg(options::OPT_ffixed_r9))
1010 Features.push_back("+reserve-r9");
1011
Dimitry Andric08107392016-01-06 07:42:18 +00001012 // The kext linker doesn't know how to deal with movw/movt.
1013 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001014 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001016
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001017void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1018 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001019 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001020 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001021 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001022 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001023 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001025 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001026 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001027 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001028 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001029 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001030 } else {
1031 ABIName = "apcs-gnu";
1032 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001033 } else if (Triple.isOSWindows()) {
1034 // FIXME: this is invalid for WindowsCE
1035 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 } else {
1037 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001038 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001039 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001041 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 ABIName = "aapcs-linux";
1043 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001044 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001045 case llvm::Triple::EABI:
1046 ABIName = "aapcs";
1047 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001049 if (Triple.getOS() == llvm::Triple::NetBSD)
1050 ABIName = "apcs-gnu";
1051 else
1052 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001053 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 }
1055 }
1056 CmdArgs.push_back("-target-abi");
1057 CmdArgs.push_back(ABIName);
1058
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001059 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001060 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001064 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001065 CmdArgs.push_back("-mfloat-abi");
1066 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 } else {
1072 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001073 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001074 CmdArgs.push_back("-mfloat-abi");
1075 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001077
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1080 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001081 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001082 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001083 CmdArgs.push_back("-arm-global-merge=false");
1084 else
1085 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001086 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001087
Bob Wilson9c8af452013-04-11 18:53:25 +00001088 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001090 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001091}
Renato Goline17c5802015-07-27 23:44:42 +00001092// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001093
Tim Northover573cbee2014-05-24 12:52:07 +00001094/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1095/// targeting.
1096static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 Arg *A;
1098 std::string CPU;
1099 // If we have -mtune or -mcpu, use that.
1100 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001101 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001103 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001104 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001105 }
1106
Kevin Qin110db6f2014-07-18 07:03:22 +00001107 // Handle CPU name is 'native'.
1108 if (CPU == "native")
1109 return llvm::sys::getHostCPUName();
1110 else if (CPU.size())
1111 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001112
James Molloy9b1586b2014-04-17 12:51:17 +00001113 // Make sure we pick "cyclone" if -arch is used.
1114 // FIXME: Should this be picked by checking the target triple instead?
1115 if (Args.getLastArg(options::OPT_arch))
1116 return "cyclone";
1117
1118 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001119}
1120
Tim Northover573cbee2014-05-24 12:52:07 +00001121void Clang::AddAArch64TargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001123 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1124 llvm::Triple Triple(TripleStr);
1125
1126 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1127 Args.hasArg(options::OPT_mkernel) ||
1128 Args.hasArg(options::OPT_fapple_kext))
1129 CmdArgs.push_back("-disable-red-zone");
1130
1131 if (!Args.hasFlag(options::OPT_mimplicit_float,
1132 options::OPT_mno_implicit_float, true))
1133 CmdArgs.push_back("-no-implicit-float");
1134
Craig Topper92fc2df2014-05-17 16:56:41 +00001135 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1137 ABIName = A->getValue();
1138 else if (Triple.isOSDarwin())
1139 ABIName = "darwinpcs";
1140 else
1141 ABIName = "aapcs";
1142
1143 CmdArgs.push_back("-target-abi");
1144 CmdArgs.push_back(ABIName);
1145
Bradley Smith9ff64332014-10-13 10:16:06 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1147 options::OPT_mno_fix_cortex_a53_835769)) {
1148 CmdArgs.push_back("-backend-option");
1149 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1151 else
1152 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001153 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001154 // Enabled A53 errata (835769) workaround by default on android
1155 CmdArgs.push_back("-backend-option");
1156 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001157 }
1158
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1161 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001162 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001163 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001164 CmdArgs.push_back("-aarch64-global-merge=false");
1165 else
1166 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001167 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001168}
1169
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170// Get CPU and ABI names. They are not independent
1171// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1173 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001174 const char *DefMips32CPU = "mips32r2";
1175 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001176
Daniel Sanders2bf13662014-07-10 14:40:57 +00001177 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1178 // default for mips64(el)?-img-linux-gnu.
1179 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1180 Triple.getEnvironment() == llvm::Triple::GNU) {
1181 DefMips32CPU = "mips32r6";
1182 DefMips64CPU = "mips64r6";
1183 }
Renato Golin7c542b42015-07-27 23:44:45 +00001184
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001185 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Petar Jovanovic009494f2016-05-17 10:46:10 +00001186 if (Triple.isAndroid()) {
1187 DefMips32CPU = "mips32";
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001188 DefMips64CPU = "mips64r6";
Petar Jovanovic009494f2016-05-17 10:46:10 +00001189 }
Daniel Sanders2bf13662014-07-10 14:40:57 +00001190
Brad Smithba26f582015-01-06 02:53:17 +00001191 // MIPS3 is the default for mips64*-unknown-openbsd.
1192 if (Triple.getOS() == llvm::Triple::OpenBSD)
1193 DefMips64CPU = "mips3";
1194
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001195 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001196 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001197
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001199 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001200 // Convert a GNU style Mips ABI name to the name
1201 // accepted by LLVM Mips backend.
1202 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001203 .Case("32", "o32")
1204 .Case("64", "n64")
1205 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001206 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001207
1208 // Setup default CPU and ABI names.
1209 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001210 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001211 default:
1212 llvm_unreachable("Unexpected triple arch name");
1213 case llvm::Triple::mips:
1214 case llvm::Triple::mipsel:
1215 CPUName = DefMips32CPU;
1216 break;
1217 case llvm::Triple::mips64:
1218 case llvm::Triple::mips64el:
1219 CPUName = DefMips64CPU;
1220 break;
1221 }
1222 }
1223
Daniel Sanders0ca86fe2016-06-06 12:02:21 +00001224 if (ABIName.empty() &&
1225 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
1226 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
1227 ABIName = llvm::StringSwitch<const char *>(CPUName)
1228 .Case("mips1", "o32")
1229 .Case("mips2", "o32")
1230 .Case("mips3", "n64")
1231 .Case("mips4", "n64")
1232 .Case("mips5", "n64")
1233 .Case("mips32", "o32")
1234 .Case("mips32r2", "o32")
1235 .Case("mips32r3", "o32")
1236 .Case("mips32r5", "o32")
1237 .Case("mips32r6", "o32")
1238 .Case("mips64", "n64")
1239 .Case("mips64r2", "n64")
1240 .Case("mips64r3", "n64")
1241 .Case("mips64r5", "n64")
1242 .Case("mips64r6", "n64")
1243 .Case("octeon", "n64")
1244 .Case("p5600", "o32")
1245 .Default("");
1246 }
1247
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001248 if (ABIName.empty()) {
1249 // Deduce ABI name from the target triple.
1250 if (Triple.getArch() == llvm::Triple::mips ||
1251 Triple.getArch() == llvm::Triple::mipsel)
1252 ABIName = "o32";
1253 else
1254 ABIName = "n64";
1255 }
1256
1257 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001258 // Deduce CPU name from ABI name.
1259 CPUName = llvm::StringSwitch<const char *>(ABIName)
Daniel Sanders07c86542016-05-27 14:30:23 +00001260 .Case("o32", DefMips32CPU)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001261 .Cases("n32", "n64", DefMips64CPU)
1262 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001263 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001264
1265 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001266}
1267
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001268std::string mips::getMipsABILibSuffix(const ArgList &Args,
1269 const llvm::Triple &Triple) {
1270 StringRef CPUName, ABIName;
1271 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1272 return llvm::StringSwitch<std::string>(ABIName)
1273 .Case("o32", "")
1274 .Case("n32", "32")
1275 .Case("n64", "64");
1276}
1277
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001278// Convert ABI name to the GNU tools acceptable variant.
1279static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1280 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001281 .Case("o32", "32")
1282 .Case("n64", "64")
1283 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001284}
1285
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001286// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1287// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001288static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1289 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001290 if (Arg *A =
1291 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1292 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001293 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001294 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001295 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001296 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001297 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001298 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1299 .Case("soft", mips::FloatABI::Soft)
1300 .Case("hard", mips::FloatABI::Hard)
1301 .Default(mips::FloatABI::Invalid);
1302 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001303 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001304 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001305 }
1306 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001307 }
1308
1309 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001310 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001311 // Assume "hard", because it's a default value used by gcc.
1312 // When we start to recognize specific target MIPS processors,
1313 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001314 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001315 }
1316
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001317 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1318 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001319}
1320
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001321static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001322 std::vector<const char *> &Features,
1323 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001324 StringRef FeatureName) {
1325 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001326 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001327 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001328 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001329 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001330 }
1331}
1332
Daniel Sanders379d44b2014-07-16 11:52:23 +00001333static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1334 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001335 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001336 StringRef CPUName;
1337 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001338 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001339 ABIName = getGnuCompatibleMipsABIName(ABIName);
1340
Daniel Sandersfeb61302014-08-08 15:47:17 +00001341 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1342 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001343
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001344 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1345 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001346 // FIXME: Note, this is a hack. We need to pass the selected float
1347 // mode to the MipsTargetInfoBase to define appropriate macros there.
1348 // Now it is the only method.
1349 Features.push_back("+soft-float");
1350 }
1351
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001352 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001353 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001354 if (Val == "2008") {
1355 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1356 Features.push_back("+nan2008");
1357 else {
1358 Features.push_back("-nan2008");
1359 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1360 }
1361 } else if (Val == "legacy") {
1362 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1363 Features.push_back("-nan2008");
1364 else {
1365 Features.push_back("+nan2008");
1366 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1367 }
1368 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001369 D.Diag(diag::err_drv_unsupported_option_argument)
1370 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001371 }
1372
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001373 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1374 options::OPT_mdouble_float, "single-float");
1375 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1376 "mips16");
1377 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1378 options::OPT_mno_micromips, "micromips");
1379 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1380 "dsp");
1381 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1382 "dspr2");
1383 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1384 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001385
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001386 // Add the last -mfp32/-mfpxx/-mfp64, if none are given and the ABI is O32
1387 // pass -mfpxx, or if none are given and fp64a is default, pass fp64 and
1388 // nooddspreg.
Daniel Sanders379d44b2014-07-16 11:52:23 +00001389 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1390 options::OPT_mfp64)) {
1391 if (A->getOption().matches(options::OPT_mfp32))
1392 Features.push_back(Args.MakeArgString("-fp64"));
1393 else if (A->getOption().matches(options::OPT_mfpxx)) {
1394 Features.push_back(Args.MakeArgString("+fpxx"));
1395 Features.push_back(Args.MakeArgString("+nooddspreg"));
1396 } else
1397 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001398 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001399 Features.push_back(Args.MakeArgString("+fpxx"));
1400 Features.push_back(Args.MakeArgString("+nooddspreg"));
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001401 } else if (mips::isFP64ADefault(Triple, CPUName)) {
1402 Features.push_back(Args.MakeArgString("+fp64"));
1403 Features.push_back(Args.MakeArgString("+nooddspreg"));
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001404 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001405
Daniel Sanders28e5d392014-07-10 10:39:51 +00001406 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1407 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001408}
1409
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001410void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001411 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001412 const Driver &D = getToolChain().getDriver();
1413 StringRef CPUName;
1414 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001415 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001416 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001417
1418 CmdArgs.push_back("-target-abi");
1419 CmdArgs.push_back(ABIName.data());
1420
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001421 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1422 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001423 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001424 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001425 CmdArgs.push_back("-mfloat-abi");
1426 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001427 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001428 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001429 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001430 CmdArgs.push_back("-mfloat-abi");
1431 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001432 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001433
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001434 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1435 if (A->getOption().matches(options::OPT_mxgot)) {
1436 CmdArgs.push_back("-mllvm");
1437 CmdArgs.push_back("-mxgot");
1438 }
1439 }
1440
Simon Atanasyanc580b322013-05-11 06:33:44 +00001441 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1442 options::OPT_mno_ldc1_sdc1)) {
1443 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1444 CmdArgs.push_back("-mllvm");
1445 CmdArgs.push_back("-mno-ldc1-sdc1");
1446 }
1447 }
1448
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001449 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1450 options::OPT_mno_check_zero_division)) {
1451 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1452 CmdArgs.push_back("-mllvm");
1453 CmdArgs.push_back("-mno-check-zero-division");
1454 }
1455 }
1456
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001457 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001458 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001459 CmdArgs.push_back("-mllvm");
1460 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1461 A->claim();
1462 }
Simon Dardisd0e83ba2016-05-27 15:13:31 +00001463
1464 if (Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) {
1465 StringRef Val = StringRef(A->getValue());
1466 if (mips::hasCompactBranches(CPUName)) {
1467 if (Val == "never" || Val == "always" || Val == "optimal") {
1468 CmdArgs.push_back("-mllvm");
1469 CmdArgs.push_back(Args.MakeArgString("-mips-compact-branches=" + Val));
1470 } else
1471 D.Diag(diag::err_drv_unsupported_option_argument)
1472 << A->getOption().getName() << Val;
1473 } else
1474 D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName;
1475 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001476}
1477
Hal Finkel8eb59282012-06-11 22:35:19 +00001478/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1479static std::string getPPCTargetCPU(const ArgList &Args) {
1480 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001481 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001482
1483 if (CPUName == "native") {
1484 std::string CPU = llvm::sys::getHostCPUName();
1485 if (!CPU.empty() && CPU != "generic")
1486 return CPU;
1487 else
1488 return "";
1489 }
1490
1491 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001492 .Case("common", "generic")
1493 .Case("440", "440")
1494 .Case("440fp", "440")
1495 .Case("450", "450")
1496 .Case("601", "601")
1497 .Case("602", "602")
1498 .Case("603", "603")
1499 .Case("603e", "603e")
1500 .Case("603ev", "603ev")
1501 .Case("604", "604")
1502 .Case("604e", "604e")
1503 .Case("620", "620")
1504 .Case("630", "pwr3")
1505 .Case("G3", "g3")
1506 .Case("7400", "7400")
1507 .Case("G4", "g4")
1508 .Case("7450", "7450")
1509 .Case("G4+", "g4+")
1510 .Case("750", "750")
1511 .Case("970", "970")
1512 .Case("G5", "g5")
1513 .Case("a2", "a2")
1514 .Case("a2q", "a2q")
1515 .Case("e500mc", "e500mc")
1516 .Case("e5500", "e5500")
1517 .Case("power3", "pwr3")
1518 .Case("power4", "pwr4")
1519 .Case("power5", "pwr5")
1520 .Case("power5x", "pwr5x")
1521 .Case("power6", "pwr6")
1522 .Case("power6x", "pwr6x")
1523 .Case("power7", "pwr7")
1524 .Case("power8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001525 .Case("power9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001526 .Case("pwr3", "pwr3")
1527 .Case("pwr4", "pwr4")
1528 .Case("pwr5", "pwr5")
1529 .Case("pwr5x", "pwr5x")
1530 .Case("pwr6", "pwr6")
1531 .Case("pwr6x", "pwr6x")
1532 .Case("pwr7", "pwr7")
1533 .Case("pwr8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001534 .Case("pwr9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001535 .Case("powerpc", "ppc")
1536 .Case("powerpc64", "ppc64")
1537 .Case("powerpc64le", "ppc64le")
1538 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001539 }
1540
1541 return "";
1542}
1543
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001544static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1545 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001546 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001547 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001548
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001549 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1550 if (FloatABI == ppc::FloatABI::Soft &&
1551 !(Triple.getArch() == llvm::Triple::ppc64 ||
1552 Triple.getArch() == llvm::Triple::ppc64le))
1553 Features.push_back("+soft-float");
1554 else if (FloatABI == ppc::FloatABI::Soft &&
1555 (Triple.getArch() == llvm::Triple::ppc64 ||
1556 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001557 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001558 << "soft float is not supported for ppc64";
1559
Eric Christopher643bb6a2013-10-16 20:40:08 +00001560 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001561 AddTargetFeature(Args, Features, options::OPT_faltivec,
1562 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001563}
1564
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001565ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1566 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1567 if (Arg *A =
1568 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1569 options::OPT_mfloat_abi_EQ)) {
1570 if (A->getOption().matches(options::OPT_msoft_float))
1571 ABI = ppc::FloatABI::Soft;
1572 else if (A->getOption().matches(options::OPT_mhard_float))
1573 ABI = ppc::FloatABI::Hard;
1574 else {
1575 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1576 .Case("soft", ppc::FloatABI::Soft)
1577 .Case("hard", ppc::FloatABI::Hard)
1578 .Default(ppc::FloatABI::Invalid);
1579 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1580 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1581 ABI = ppc::FloatABI::Hard;
1582 }
1583 }
1584 }
1585
1586 // If unspecified, choose the default based on the platform.
1587 if (ABI == ppc::FloatABI::Invalid) {
1588 ABI = ppc::FloatABI::Hard;
1589 }
1590
1591 return ABI;
1592}
1593
Ulrich Weigand8afad612014-07-28 13:17:52 +00001594void Clang::AddPPCTargetArgs(const ArgList &Args,
1595 ArgStringList &CmdArgs) const {
1596 // Select the ABI to use.
1597 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001598 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001599 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001600 case llvm::Triple::ppc64: {
1601 // When targeting a processor that supports QPX, or if QPX is
1602 // specifically enabled, default to using the ABI that supports QPX (so
1603 // long as it is not specifically disabled).
1604 bool HasQPX = false;
1605 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1606 HasQPX = A->getValue() == StringRef("a2q");
1607 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1608 if (HasQPX) {
1609 ABIName = "elfv1-qpx";
1610 break;
1611 }
1612
Ulrich Weigand8afad612014-07-28 13:17:52 +00001613 ABIName = "elfv1";
1614 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001615 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001616 case llvm::Triple::ppc64le:
1617 ABIName = "elfv2";
1618 break;
1619 default:
1620 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001621 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001622
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001623 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1624 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1625 // the option if given as we don't have backend support for any targets
1626 // that don't use the altivec abi.
1627 if (StringRef(A->getValue()) != "altivec")
1628 ABIName = A->getValue();
1629
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001630 ppc::FloatABI FloatABI =
1631 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1632
1633 if (FloatABI == ppc::FloatABI::Soft) {
1634 // Floating point operations and argument passing are soft.
1635 CmdArgs.push_back("-msoft-float");
1636 CmdArgs.push_back("-mfloat-abi");
1637 CmdArgs.push_back("soft");
1638 } else {
1639 // Floating point operations and argument passing are hard.
1640 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1641 CmdArgs.push_back("-mfloat-abi");
1642 CmdArgs.push_back("hard");
1643 }
1644
Ulrich Weigand8afad612014-07-28 13:17:52 +00001645 if (ABIName) {
1646 CmdArgs.push_back("-target-abi");
1647 CmdArgs.push_back(ABIName);
1648 }
1649}
1650
1651bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1652 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1653 return A && (A->getValue() == StringRef(Value));
1654}
1655
Tom Stellard6674c702013-04-01 20:56:53 +00001656/// Get the (LLVM) name of the R600 gpu we are targeting.
1657static std::string getR600TargetGPU(const ArgList &Args) {
1658 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001659 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001660 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001661 .Cases("rv630", "rv635", "r600")
1662 .Cases("rv610", "rv620", "rs780", "rs880")
1663 .Case("rv740", "rv770")
1664 .Case("palm", "cedar")
1665 .Cases("sumo", "sumo2", "sumo")
1666 .Case("hemlock", "cypress")
1667 .Case("aruba", "cayman")
1668 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001669 }
1670 return "";
1671}
1672
Jacques Pienaard964cc22016-03-28 21:02:54 +00001673static std::string getLanaiTargetCPU(const ArgList &Args) {
1674 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1675 return A->getValue();
1676 }
1677 return "";
1678}
1679
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001680sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
1681 const ArgList &Args) {
1682 sparc::FloatABI ABI = sparc::FloatABI::Invalid;
1683 if (Arg *A =
1684 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1685 options::OPT_mfloat_abi_EQ)) {
1686 if (A->getOption().matches(options::OPT_msoft_float))
1687 ABI = sparc::FloatABI::Soft;
1688 else if (A->getOption().matches(options::OPT_mhard_float))
1689 ABI = sparc::FloatABI::Hard;
1690 else {
1691 ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue())
1692 .Case("soft", sparc::FloatABI::Soft)
1693 .Case("hard", sparc::FloatABI::Hard)
1694 .Default(sparc::FloatABI::Invalid);
1695 if (ABI == sparc::FloatABI::Invalid &&
1696 !StringRef(A->getValue()).empty()) {
1697 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1698 ABI = sparc::FloatABI::Hard;
1699 }
1700 }
1701 }
1702
1703 // If unspecified, choose the default based on the platform.
1704 // Only the hard-float ABI on Sparc is standardized, and it is the
1705 // default. GCC also supports a nonstandard soft-float ABI mode, also
1706 // implemented in LLVM. However as this is not standard we set the default
1707 // to be hard-float.
1708 if (ABI == sparc::FloatABI::Invalid) {
1709 ABI = sparc::FloatABI::Hard;
1710 }
1711
1712 return ABI;
1713}
1714
1715static void getSparcTargetFeatures(const Driver &D, const ArgList &Args,
1716 std::vector<const char *> &Features) {
1717 sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args);
1718 if (FloatABI == sparc::FloatABI::Soft)
1719 Features.push_back("+soft-float");
1720}
1721
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001722void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001723 ArgStringList &CmdArgs) const {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001724 //const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001725 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001726
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001727 sparc::FloatABI FloatABI =
1728 sparc::getSparcFloatABI(getToolChain().getDriver(), Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001729
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001730 if (FloatABI == sparc::FloatABI::Soft) {
1731 // Floating point operations and argument passing are soft.
1732 CmdArgs.push_back("-msoft-float");
1733 CmdArgs.push_back("-mfloat-abi");
1734 CmdArgs.push_back("soft");
1735 } else {
1736 // Floating point operations and argument passing are hard.
1737 assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!");
1738 CmdArgs.push_back("-mfloat-abi");
1739 CmdArgs.push_back("hard");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001740 }
1741}
1742
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00001743void Clang::AddSystemZTargetArgs(const ArgList &Args,
1744 ArgStringList &CmdArgs) const {
1745 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false))
1746 CmdArgs.push_back("-mbackchain");
1747}
1748
Richard Sandiford4652d892013-07-19 16:51:51 +00001749static const char *getSystemZTargetCPU(const ArgList &Args) {
1750 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1751 return A->getValue();
1752 return "z10";
1753}
1754
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001755static void getSystemZTargetFeatures(const ArgList &Args,
1756 std::vector<const char *> &Features) {
1757 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001758 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001759 if (A->getOption().matches(options::OPT_mhtm))
1760 Features.push_back("+transactional-execution");
1761 else
1762 Features.push_back("-transactional-execution");
1763 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001764 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001765 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001766 if (A->getOption().matches(options::OPT_mvx))
1767 Features.push_back("+vector");
1768 else
1769 Features.push_back("-vector");
1770 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001771}
1772
Chandler Carruth953fb082013-01-13 11:46:33 +00001773static const char *getX86TargetCPU(const ArgList &Args,
1774 const llvm::Triple &Triple) {
1775 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001776 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001777 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001778 return "core-avx2";
1779
Chandler Carruth953fb082013-01-13 11:46:33 +00001780 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001781 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001782
1783 // FIXME: Reject attempts to use -march=native unless the target matches
1784 // the host.
1785 //
1786 // FIXME: We should also incorporate the detected target features for use
1787 // with -native.
1788 std::string CPU = llvm::sys::getHostCPUName();
1789 if (!CPU.empty() && CPU != "generic")
1790 return Args.MakeArgString(CPU);
1791 }
1792
Reid Kleckner3123eff2015-06-30 16:32:04 +00001793 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1794 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1795 StringRef Arch = A->getValue();
1796 const char *CPU;
1797 if (Triple.getArch() == llvm::Triple::x86) {
1798 CPU = llvm::StringSwitch<const char *>(Arch)
1799 .Case("IA32", "i386")
1800 .Case("SSE", "pentium3")
1801 .Case("SSE2", "pentium4")
1802 .Case("AVX", "sandybridge")
1803 .Case("AVX2", "haswell")
1804 .Default(nullptr);
1805 } else {
1806 CPU = llvm::StringSwitch<const char *>(Arch)
1807 .Case("AVX", "sandybridge")
1808 .Case("AVX2", "haswell")
1809 .Default(nullptr);
1810 }
1811 if (CPU)
1812 return CPU;
1813 }
1814
Chandler Carruth953fb082013-01-13 11:46:33 +00001815 // Select the default CPU if none was given (or detection failed).
1816
1817 if (Triple.getArch() != llvm::Triple::x86_64 &&
1818 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001819 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001820
1821 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1822
1823 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001824 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001825 if (Triple.getArchName() == "x86_64h")
1826 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001827 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001828 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001829
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001830 // Set up default CPU name for PS4 compilers.
1831 if (Triple.isPS4CPU())
1832 return "btver2";
1833
Alexey Bataev286d1b92014-01-31 04:07:13 +00001834 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001835 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001836 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001837
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001838 // Everything else goes to x86-64 in 64-bit mode.
1839 if (Is64Bit)
1840 return "x86-64";
1841
1842 switch (Triple.getOS()) {
1843 case llvm::Triple::FreeBSD:
1844 case llvm::Triple::NetBSD:
1845 case llvm::Triple::OpenBSD:
1846 return "i486";
1847 case llvm::Triple::Haiku:
1848 return "i586";
1849 case llvm::Triple::Bitrig:
1850 return "i686";
1851 default:
1852 // Fallback to p4.
1853 return "pentium4";
1854 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001855}
1856
Dan Gohmanc2853072015-09-03 22:51:53 +00001857/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1858static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1859 // If we have -mcpu=, use that.
1860 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1861 StringRef CPU = A->getValue();
1862
1863#ifdef __wasm__
1864 // Handle "native" by examining the host. "native" isn't meaningful when
1865 // cross compiling, so only support this when the host is also WebAssembly.
1866 if (CPU == "native")
1867 return llvm::sys::getHostCPUName();
1868#endif
1869
1870 return CPU;
1871 }
1872
1873 return "generic";
1874}
1875
Renato Golin7c542b42015-07-27 23:44:45 +00001876static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1877 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001878 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001879 default:
1880 return "";
1881
Amara Emerson703da2e2013-10-31 09:32:33 +00001882 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001883 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001884 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001885
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001886 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001887 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001888 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001889 case llvm::Triple::thumbeb: {
1890 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001891 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001892 return arm::getARMTargetCPU(MCPU, MArch, T);
1893 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001894 case llvm::Triple::mips:
1895 case llvm::Triple::mipsel:
1896 case llvm::Triple::mips64:
1897 case llvm::Triple::mips64el: {
1898 StringRef CPUName;
1899 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001900 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001901 return CPUName;
1902 }
1903
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001904 case llvm::Triple::nvptx:
1905 case llvm::Triple::nvptx64:
1906 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1907 return A->getValue();
1908 return "";
1909
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001910 case llvm::Triple::ppc:
1911 case llvm::Triple::ppc64:
1912 case llvm::Triple::ppc64le: {
1913 std::string TargetCPUName = getPPCTargetCPU(Args);
1914 // LLVM may default to generating code for the native CPU,
1915 // but, like gcc, we default to a more generic option for
1916 // each architecture. (except on Darwin)
1917 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1918 if (T.getArch() == llvm::Triple::ppc64)
1919 TargetCPUName = "ppc64";
1920 else if (T.getArch() == llvm::Triple::ppc64le)
1921 TargetCPUName = "ppc64le";
1922 else
1923 TargetCPUName = "ppc";
1924 }
1925 return TargetCPUName;
1926 }
1927
1928 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001929 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001930 case llvm::Triple::sparcv9:
1931 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001932 return A->getValue();
1933 return "";
1934
1935 case llvm::Triple::x86:
1936 case llvm::Triple::x86_64:
1937 return getX86TargetCPU(Args, T);
1938
1939 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001940 return "hexagon" +
1941 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001942
Jacques Pienaard964cc22016-03-28 21:02:54 +00001943 case llvm::Triple::lanai:
1944 return getLanaiTargetCPU(Args);
1945
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001946 case llvm::Triple::systemz:
1947 return getSystemZTargetCPU(Args);
1948
1949 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001950 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001951 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001952
1953 case llvm::Triple::wasm32:
1954 case llvm::Triple::wasm64:
1955 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001956 }
1957}
1958
Alp Tokerce365ca2013-12-02 12:43:03 +00001959static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001960 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001961 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1962 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1963 // forward.
1964 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001965 std::string Plugin =
1966 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001967 CmdArgs.push_back(Args.MakeArgString(Plugin));
1968
1969 // Try to pass driver level flags relevant to LTO code generation down to
1970 // the plugin.
1971
1972 // Handle flags for selecting CPU variants.
1973 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1974 if (!CPU.empty())
1975 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001976
James Molloyf97fdae2015-12-21 10:44:36 +00001977 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1978 StringRef OOpt;
1979 if (A->getOption().matches(options::OPT_O4) ||
1980 A->getOption().matches(options::OPT_Ofast))
1981 OOpt = "3";
1982 else if (A->getOption().matches(options::OPT_O))
1983 OOpt = A->getValue();
1984 else if (A->getOption().matches(options::OPT_O0))
1985 OOpt = "0";
1986 if (!OOpt.empty())
1987 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1988 }
1989
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001990 if (IsThinLTO)
1991 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001992
1993 // If an explicit debugger tuning argument appeared, pass it along.
1994 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1995 options::OPT_ggdbN_Group)) {
1996 if (A->getOption().matches(options::OPT_glldb))
1997 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1998 else if (A->getOption().matches(options::OPT_gsce))
1999 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
2000 else
2001 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
2002 }
Alp Tokerce365ca2013-12-02 12:43:03 +00002003}
2004
Sanjay Patel2987c292015-06-11 14:53:41 +00002005/// This is a helper function for validating the optional refinement step
2006/// parameter in reciprocal argument strings. Return false if there is an error
2007/// parsing the refinement step. Otherwise, return true and set the Position
2008/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00002009static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002010 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00002011 const char RefinementStepToken = ':';
2012 Position = In.find(RefinementStepToken);
2013 if (Position != StringRef::npos) {
2014 StringRef Option = A.getOption().getName();
2015 StringRef RefStep = In.substr(Position + 1);
2016 // Allow exactly one numeric character for the additional refinement
2017 // step parameter. This is reasonable for all currently-supported
2018 // operations and architectures because we would expect that a larger value
2019 // of refinement steps would cause the estimate "optimization" to
2020 // under-perform the native operation. Also, if the estimate does not
2021 // converge quickly, it probably will not ever converge, so further
2022 // refinement steps will not produce a better answer.
2023 if (RefStep.size() != 1) {
2024 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2025 return false;
2026 }
2027 char RefStepChar = RefStep[0];
2028 if (RefStepChar < '0' || RefStepChar > '9') {
2029 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2030 return false;
2031 }
2032 }
2033 return true;
2034}
2035
2036/// The -mrecip flag requires processing of many optional parameters.
2037static void ParseMRecip(const Driver &D, const ArgList &Args,
2038 ArgStringList &OutStrings) {
2039 StringRef DisabledPrefixIn = "!";
2040 StringRef DisabledPrefixOut = "!";
2041 StringRef EnabledPrefixOut = "";
2042 StringRef Out = "-mrecip=";
2043
2044 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
2045 if (!A)
2046 return;
2047
2048 unsigned NumOptions = A->getNumValues();
2049 if (NumOptions == 0) {
2050 // No option is the same as "all".
2051 OutStrings.push_back(Args.MakeArgString(Out + "all"));
2052 return;
2053 }
2054
2055 // Pass through "all", "none", or "default" with an optional refinement step.
2056 if (NumOptions == 1) {
2057 StringRef Val = A->getValue(0);
2058 size_t RefStepLoc;
2059 if (!getRefinementStep(Val, D, *A, RefStepLoc))
2060 return;
2061 StringRef ValBase = Val.slice(0, RefStepLoc);
2062 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
2063 OutStrings.push_back(Args.MakeArgString(Out + Val));
2064 return;
2065 }
2066 }
2067
2068 // Each reciprocal type may be enabled or disabled individually.
2069 // Check each input value for validity, concatenate them all back together,
2070 // and pass through.
2071
2072 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002073 OptionStrings.insert(std::make_pair("divd", false));
2074 OptionStrings.insert(std::make_pair("divf", false));
2075 OptionStrings.insert(std::make_pair("vec-divd", false));
2076 OptionStrings.insert(std::make_pair("vec-divf", false));
2077 OptionStrings.insert(std::make_pair("sqrtd", false));
2078 OptionStrings.insert(std::make_pair("sqrtf", false));
2079 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
2080 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00002081
2082 for (unsigned i = 0; i != NumOptions; ++i) {
2083 StringRef Val = A->getValue(i);
2084
2085 bool IsDisabled = Val.startswith(DisabledPrefixIn);
2086 // Ignore the disablement token for string matching.
2087 if (IsDisabled)
2088 Val = Val.substr(1);
2089
2090 size_t RefStep;
2091 if (!getRefinementStep(Val, D, *A, RefStep))
2092 return;
2093
2094 StringRef ValBase = Val.slice(0, RefStep);
2095 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2096 if (OptionIter == OptionStrings.end()) {
2097 // Try again specifying float suffix.
2098 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2099 if (OptionIter == OptionStrings.end()) {
2100 // The input name did not match any known option string.
2101 D.Diag(diag::err_drv_unknown_argument) << Val;
2102 return;
2103 }
2104 // The option was specified without a float or double suffix.
2105 // Make sure that the double entry was not already specified.
2106 // The float entry will be checked below.
2107 if (OptionStrings[ValBase.str() + 'd']) {
2108 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2109 return;
2110 }
2111 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002112
Sanjay Patel2987c292015-06-11 14:53:41 +00002113 if (OptionIter->second == true) {
2114 // Duplicate option specified.
2115 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2116 return;
2117 }
2118
2119 // Mark the matched option as found. Do not allow duplicate specifiers.
2120 OptionIter->second = true;
2121
2122 // If the precision was not specified, also mark the double entry as found.
2123 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2124 OptionStrings[ValBase.str() + 'd'] = true;
2125
2126 // Build the output string.
2127 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2128 Out = Args.MakeArgString(Out + Prefix + Val);
2129 if (i != NumOptions - 1)
2130 Out = Args.MakeArgString(Out + ",");
2131 }
2132
2133 OutStrings.push_back(Args.MakeArgString(Out));
2134}
2135
Eric Christopherc54920a2015-03-23 19:26:05 +00002136static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002137 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002138 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002139 // If -march=native, autodetect the feature list.
2140 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2141 if (StringRef(A->getValue()) == "native") {
2142 llvm::StringMap<bool> HostFeatures;
2143 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2144 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 Features.push_back(
2146 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002147 }
2148 }
2149
Jim Grosbach82eee262013-11-16 00:53:35 +00002150 if (Triple.getArchName() == "x86_64h") {
2151 // x86_64h implies quite a few of the more modern subtarget features
2152 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2153 Features.push_back("-rdrnd");
2154 Features.push_back("-aes");
2155 Features.push_back("-pclmul");
2156 Features.push_back("-rtm");
2157 Features.push_back("-hle");
2158 Features.push_back("-fsgsbase");
2159 }
2160
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002161 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002162 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002163 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002164 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002165 Features.push_back("+sse4.2");
2166 Features.push_back("+popcnt");
2167 } else
2168 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002169 }
2170
Eric Christopherc54920a2015-03-23 19:26:05 +00002171 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002172 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2173 StringRef Arch = A->getValue();
2174 bool ArchUsed = false;
2175 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002176 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002177 if (Arch == "AVX" || Arch == "AVX2") {
2178 ArchUsed = true;
2179 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2180 }
2181 }
2182 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002183 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002184 if (Arch == "IA32") {
2185 ArchUsed = true;
2186 } else if (Arch == "SSE" || Arch == "SSE2") {
2187 ArchUsed = true;
2188 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2189 }
2190 }
2191 if (!ArchUsed)
2192 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2193 }
2194
Jim Grosbach82eee262013-11-16 00:53:35 +00002195 // Now add any that the user explicitly requested on the command line,
2196 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002197 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002198}
2199
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002200void Clang::AddX86TargetArgs(const ArgList &Args,
2201 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002202 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002203 Args.hasArg(options::OPT_mkernel) ||
2204 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002205 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002206
Bob Wilson2616e2e2013-02-10 16:01:41 +00002207 // Default to avoid implicit floating-point for kernel/kext code, but allow
2208 // that to be overridden with -mno-soft-float.
2209 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2210 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002211 if (Arg *A = Args.getLastArg(
2212 options::OPT_msoft_float, options::OPT_mno_soft_float,
2213 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002214 const Option &O = A->getOption();
2215 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2216 O.matches(options::OPT_msoft_float));
2217 }
2218 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002219 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002220
2221 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2222 StringRef Value = A->getValue();
2223 if (Value == "intel" || Value == "att") {
2224 CmdArgs.push_back("-mllvm");
2225 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2226 } else {
2227 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2228 << A->getOption().getName() << Value;
2229 }
2230 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002231
2232 // Set flags to support MCU ABI.
2233 if (Args.hasArg(options::OPT_miamcu)) {
2234 CmdArgs.push_back("-mfloat-abi");
2235 CmdArgs.push_back("soft");
2236 CmdArgs.push_back("-mstack-alignment=4");
2237 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002238}
2239
Tony Linthicum76329bf2011-12-12 21:14:55 +00002240void Clang::AddHexagonTargetArgs(const ArgList &Args,
2241 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002242 CmdArgs.push_back("-mqdsp6-compat");
2243 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002244
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002245 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2246 std::string N = llvm::utostr(G.getValue());
2247 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002248 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002249 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002250 }
2251
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002252 if (!Args.hasArg(options::OPT_fno_short_enums))
2253 CmdArgs.push_back("-fshort-enums");
2254 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002255 CmdArgs.push_back("-mllvm");
2256 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002257 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002258 CmdArgs.push_back("-mllvm");
2259 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002260}
2261
Jacques Pienaard964cc22016-03-28 21:02:54 +00002262void Clang::AddLanaiTargetArgs(const ArgList &Args,
2263 ArgStringList &CmdArgs) const {
2264 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2265 StringRef CPUName = A->getValue();
2266
2267 CmdArgs.push_back("-target-cpu");
2268 CmdArgs.push_back(Args.MakeArgString(CPUName));
2269 }
2270 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2271 StringRef Value = A->getValue();
2272 // Only support mregparm=4 to support old usage. Report error for all other
2273 // cases.
2274 int Mregparm;
2275 if (Value.getAsInteger(10, Mregparm)) {
2276 if (Mregparm != 4) {
2277 getToolChain().getDriver().Diag(
2278 diag::err_drv_unsupported_option_argument)
2279 << A->getOption().getName() << Value;
2280 }
2281 }
2282 }
2283}
2284
Dan Gohmane3d71e12016-01-07 01:00:21 +00002285void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2286 ArgStringList &CmdArgs) const {
2287 // Default to "hidden" visibility.
2288 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2289 options::OPT_fvisibility_ms_compat)) {
2290 CmdArgs.push_back("-fvisibility");
2291 CmdArgs.push_back("hidden");
2292 }
2293}
2294
Kevin Qin110db6f2014-07-18 07:03:22 +00002295// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002296static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002297 std::vector<const char *> &Features) {
2298 SmallVector<StringRef, 8> Split;
2299 text.split(Split, StringRef("+"), -1, false);
2300
Benjamin Kramer72e64312015-09-24 14:48:49 +00002301 for (StringRef Feature : Split) {
Renato Golin3b8709c2016-05-25 12:36:31 +00002302 const char *result = llvm::StringSwitch<const char *>(Feature)
2303 .Case("fp", "+fp-armv8")
2304 .Case("simd", "+neon")
2305 .Case("crc", "+crc")
2306 .Case("crypto", "+crypto")
2307 .Case("fp16", "+fullfp16")
2308 .Case("profile", "+spe")
Sjoerd Meijerba7a16f2016-06-03 14:08:20 +00002309 .Case("ras", "+ras")
Renato Golin3b8709c2016-05-25 12:36:31 +00002310 .Case("nofp", "-fp-armv8")
2311 .Case("nosimd", "-neon")
2312 .Case("nocrc", "-crc")
2313 .Case("nocrypto", "-crypto")
2314 .Case("nofp16", "-fullfp16")
2315 .Case("noprofile", "-spe")
Sjoerd Meijerba7a16f2016-06-03 14:08:20 +00002316 .Case("noras", "-ras")
Renato Golin3b8709c2016-05-25 12:36:31 +00002317 .Default(nullptr);
2318 if (result)
2319 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002320 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002321 D.Diag(diag::err_drv_no_neon_modifier);
2322 else
2323 return false;
2324 }
2325 return true;
2326}
2327
2328// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2329// decode CPU and feature.
2330static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2331 std::vector<const char *> &Features) {
2332 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2333 CPU = Split.first;
Renato Golin3b8709c2016-05-25 12:36:31 +00002334 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
2335 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00002336 CPU == "kryo" || CPU == "cortex-a73") {
Renato Golin3b8709c2016-05-25 12:36:31 +00002337 Features.push_back("+neon");
2338 Features.push_back("+crc");
2339 Features.push_back("+crypto");
2340 } else if (CPU == "cyclone") {
2341 Features.push_back("+neon");
2342 Features.push_back("+crypto");
2343 } else if (CPU == "generic") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002344 Features.push_back("+neon");
2345 } else {
Renato Golin3b8709c2016-05-25 12:36:31 +00002346 return false;
2347 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002348
2349 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2350 return false;
2351
2352 return true;
2353}
2354
2355static bool
2356getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2357 const ArgList &Args,
2358 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002359 std::string MarchLowerCase = March.lower();
2360 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002361
Renato Golin3b8709c2016-05-25 12:36:31 +00002362 if (Split.first == "armv8-a" || Split.first == "armv8a") {
2363 // ok, no additional features.
2364 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
2365 Features.push_back("+v8.1a");
2366 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2367 Features.push_back("+v8.2a");
2368 } else {
2369 return false;
2370 }
2371
2372 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002373 return false;
2374
2375 return true;
2376}
2377
2378static bool
2379getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2380 const ArgList &Args,
2381 std::vector<const char *> &Features) {
2382 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002383 std::string McpuLowerCase = Mcpu.lower();
2384 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002385 return false;
2386
2387 return true;
2388}
2389
2390static bool
2391getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2392 const ArgList &Args,
2393 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002394 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002395 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002396 if (MtuneLowerCase == "native")
2397 MtuneLowerCase = llvm::sys::getHostCPUName();
2398 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002399 Features.push_back("+zcm");
2400 Features.push_back("+zcz");
2401 }
2402 return true;
2403}
2404
2405static bool
2406getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2407 const ArgList &Args,
2408 std::vector<const char *> &Features) {
2409 StringRef CPU;
2410 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002411 std::string McpuLowerCase = Mcpu.lower();
2412 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002413 return false;
2414
2415 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2416}
2417
Justin Bognerf9052562015-11-13 23:07:31 +00002418static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002419 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002420 Arg *A;
2421 bool success = true;
2422 // Enable NEON by default.
2423 Features.push_back("+neon");
2424 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2425 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2426 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2427 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002428 else if (Args.hasArg(options::OPT_arch))
2429 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2430 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002431
2432 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2433 success =
2434 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2435 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2436 success =
2437 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002438 else if (Args.hasArg(options::OPT_arch))
2439 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2440 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002441
2442 if (!success)
2443 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002444
2445 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2446 Features.push_back("-fp-armv8");
2447 Features.push_back("-crypto");
2448 Features.push_back("-neon");
2449 }
Bradley Smith418c5932014-05-02 15:17:51 +00002450
2451 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002452 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002453 if (A->getOption().matches(options::OPT_mcrc))
2454 Features.push_back("+crc");
2455 else
2456 Features.push_back("-crc");
2457 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002458
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002459 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2460 options::OPT_munaligned_access))
2461 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2462 Features.push_back("+strict-align");
2463
Justin Bognerf9052562015-11-13 23:07:31 +00002464 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002465 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002466}
2467
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002468static void getHexagonTargetFeatures(const ArgList &Args,
2469 std::vector<const char *> &Features) {
2470 bool HasHVX = false, HasHVXD = false;
2471
Eric Christopher49062a52015-12-22 03:12:34 +00002472 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2473 // doing dependent option handling here rather than in initFeatureMap or a
2474 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002475 for (auto &A : Args) {
2476 auto &Opt = A->getOption();
2477 if (Opt.matches(options::OPT_mhexagon_hvx))
2478 HasHVX = true;
2479 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2480 HasHVXD = HasHVX = false;
2481 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2482 HasHVXD = HasHVX = true;
2483 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2484 HasHVXD = false;
2485 else
2486 continue;
2487 A->claim();
2488 }
2489
2490 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2491 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2492}
2493
Dan Gohmanc2853072015-09-03 22:51:53 +00002494static void getWebAssemblyTargetFeatures(const ArgList &Args,
2495 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002496 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002497}
2498
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002499static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2500 std::vector<const char *> &Features) {
2501 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2502 StringRef value = dAbi->getValue();
2503 if (value == "1.0") {
2504 Features.push_back("+amdgpu-debugger-insert-nops");
Konstantin Zhuravlyove6dbd902016-05-26 19:36:39 +00002505 Features.push_back("+amdgpu-debugger-reserve-regs");
2506 Features.push_back("+amdgpu-debugger-emit-prologue");
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002507 } else {
2508 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2509 }
2510 }
2511
2512 handleTargetFeaturesGroup(
2513 Args, Features, options::OPT_m_amdgpu_Features_Group);
2514}
2515
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002516static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002517 const ArgList &Args, ArgStringList &CmdArgs,
2518 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002519 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002520 std::vector<const char *> Features;
2521 switch (Triple.getArch()) {
2522 default:
2523 break;
2524 case llvm::Triple::mips:
2525 case llvm::Triple::mipsel:
2526 case llvm::Triple::mips64:
2527 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002528 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002529 break;
2530
2531 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002532 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002533 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002534 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002535 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002536 break;
2537
2538 case llvm::Triple::ppc:
2539 case llvm::Triple::ppc64:
2540 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002541 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002542 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002543 case llvm::Triple::systemz:
2544 getSystemZTargetFeatures(Args, Features);
2545 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002546 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002547 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002548 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002549 break;
2550 case llvm::Triple::x86:
2551 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002552 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002553 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002554 case llvm::Triple::hexagon:
2555 getHexagonTargetFeatures(Args, Features);
2556 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002557 case llvm::Triple::wasm32:
2558 case llvm::Triple::wasm64:
2559 getWebAssemblyTargetFeatures(Args, Features);
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00002560 break;
2561 case llvm::Triple::sparc:
2562 case llvm::Triple::sparcel:
2563 case llvm::Triple::sparcv9:
2564 getSparcTargetFeatures(D, Args, Features);
Dan Gohmanc2853072015-09-03 22:51:53 +00002565 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002566 case llvm::Triple::r600:
2567 case llvm::Triple::amdgcn:
2568 getAMDGPUTargetFeatures(D, Args, Features);
2569 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002570 }
Rafael Espindola43964802013-08-21 17:34:32 +00002571
2572 // Find the last of each feature.
2573 llvm::StringMap<unsigned> LastOpt;
2574 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2575 const char *Name = Features[I];
2576 assert(Name[0] == '-' || Name[0] == '+');
2577 LastOpt[Name + 1] = I;
2578 }
2579
2580 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2581 // If this feature was overridden, ignore it.
2582 const char *Name = Features[I];
2583 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2584 assert(LastI != LastOpt.end());
2585 unsigned Last = LastI->second;
2586 if (Last != I)
2587 continue;
2588
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002589 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002590 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002591 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002592}
2593
David Majnemerae394812014-12-09 00:12:30 +00002594static bool
2595shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2596 const llvm::Triple &Triple) {
2597 // We use the zero-cost exception tables for Objective-C if the non-fragile
2598 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2599 // later.
2600 if (runtime.isNonFragile())
2601 return true;
2602
2603 if (!Triple.isMacOSX())
2604 return false;
2605
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002606 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002607 (Triple.getArch() == llvm::Triple::x86_64 ||
2608 Triple.getArch() == llvm::Triple::arm));
2609}
2610
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002611/// Adds exception related arguments to the driver command arguments. There's a
2612/// master flag, -fexceptions and also language specific flags to enable/disable
2613/// C++ and Objective-C exceptions. This makes it possible to for example
2614/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002615static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002616 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002617 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002618 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002619 const Driver &D = TC.getDriver();
2620 const llvm::Triple &Triple = TC.getTriple();
2621
Chad Rosier4fab82c2012-03-26 22:04:46 +00002622 if (KernelOrKext) {
2623 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2624 // arguments now to avoid warnings about unused arguments.
2625 Args.ClaimAllArgs(options::OPT_fexceptions);
2626 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2627 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2628 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2629 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2630 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002631 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002632 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002633
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002634 // See if the user explicitly enabled exceptions.
2635 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2636 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002637
David Majnemerae394812014-12-09 00:12:30 +00002638 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2639 // is not necessarily sensible, but follows GCC.
2640 if (types::isObjC(InputType) &&
2641 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002642 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002643 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002644
David Majnemerae394812014-12-09 00:12:30 +00002645 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002646 }
2647
2648 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002649 // Disable C++ EH by default on XCore and PS4.
2650 bool CXXExceptionsEnabled =
2651 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002652 Arg *ExceptionArg = Args.getLastArg(
2653 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2654 options::OPT_fexceptions, options::OPT_fno_exceptions);
2655 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002656 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002657 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2658 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002659
2660 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002661 if (Triple.isPS4CPU()) {
2662 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2663 assert(ExceptionArg &&
2664 "On the PS4 exceptions should only be enabled if passing "
2665 "an argument");
2666 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2667 const Arg *RTTIArg = TC.getRTTIArg();
2668 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2669 D.Diag(diag::err_drv_argument_not_allowed_with)
2670 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2671 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2672 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2673 } else
2674 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2675
Anders Carlssone96ab552011-02-28 02:27:16 +00002676 CmdArgs.push_back("-fcxx-exceptions");
2677
David Majnemer8de68642014-12-05 08:11:58 +00002678 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002679 }
2680 }
2681
David Majnemer8de68642014-12-05 08:11:58 +00002682 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002683 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002684}
2685
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002686static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002687 bool Default = true;
2688 if (TC.getTriple().isOSDarwin()) {
2689 // The native darwin assembler doesn't support the linker_option directives,
2690 // so we disable them if we think the .s file will be passed to it.
2691 Default = TC.useIntegratedAs();
2692 }
2693 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2694 Default);
2695}
2696
Ted Kremenek62093662013-03-12 17:02:12 +00002697static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2698 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002699 bool UseDwarfDirectory =
2700 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2701 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002702 return !UseDwarfDirectory;
2703}
2704
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002705/// \brief Check whether the given input tree contains any compilation actions.
2706static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002707 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002708 return true;
2709
Nico Weber5a459f82016-02-23 19:30:43 +00002710 for (const auto &AI : A->inputs())
2711 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002712 return true;
2713
2714 return false;
2715}
2716
2717/// \brief Check if -relax-all should be passed to the internal assembler.
2718/// This is done by default when compiling non-assembler source with -O0.
2719static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2720 bool RelaxDefault = true;
2721
2722 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2723 RelaxDefault = A->getOption().matches(options::OPT_O0);
2724
2725 if (RelaxDefault) {
2726 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002727 for (const auto &Act : C.getActions()) {
2728 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002729 RelaxDefault = true;
2730 break;
2731 }
2732 }
2733 }
2734
2735 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002736 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002737}
2738
Paul Robinson0334a042015-12-19 19:41:48 +00002739// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2740// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002741static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002742 assert(A.getOption().matches(options::OPT_gN_Group) &&
2743 "Not a -g option that specifies a debug-info level");
2744 if (A.getOption().matches(options::OPT_g0) ||
2745 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002746 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002747 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2748 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002749 return codegenoptions::DebugLineTablesOnly;
2750 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002751}
2752
Douglas Katzman3459ce22015-10-08 04:24:12 +00002753// Extract the integer N from a string spelled "-dwarf-N", returning 0
2754// on mismatch. The StringRef input (rather than an Arg) allows
2755// for use by the "-Xassembler" option parser.
2756static unsigned DwarfVersionNum(StringRef ArgValue) {
2757 return llvm::StringSwitch<unsigned>(ArgValue)
2758 .Case("-gdwarf-2", 2)
2759 .Case("-gdwarf-3", 3)
2760 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002761 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002762 .Default(0);
2763}
2764
2765static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002766 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002767 unsigned DwarfVersion,
2768 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002769 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002770 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002771 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2772 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002773 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002774 CmdArgs.push_back("-debug-info-kind=limited");
2775 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002776 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002777 CmdArgs.push_back("-debug-info-kind=standalone");
2778 break;
2779 default:
2780 break;
2781 }
2782 if (DwarfVersion > 0)
2783 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002784 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002785 switch (DebuggerTuning) {
2786 case llvm::DebuggerKind::GDB:
2787 CmdArgs.push_back("-debugger-tuning=gdb");
2788 break;
2789 case llvm::DebuggerKind::LLDB:
2790 CmdArgs.push_back("-debugger-tuning=lldb");
2791 break;
2792 case llvm::DebuggerKind::SCE:
2793 CmdArgs.push_back("-debugger-tuning=sce");
2794 break;
2795 default:
2796 break;
2797 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002798}
2799
David Blaikie9260ed62013-07-25 21:19:01 +00002800static void CollectArgsForIntegratedAssembler(Compilation &C,
2801 const ArgList &Args,
2802 ArgStringList &CmdArgs,
2803 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002804 if (UseRelaxAll(C, Args))
2805 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002806
David Majnemer2b9349d2015-12-21 22:09:34 +00002807 // Only default to -mincremental-linker-compatible if we think we are
2808 // targeting the MSVC linker.
2809 bool DefaultIncrementalLinkerCompatible =
2810 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2811 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2812 options::OPT_mno_incremental_linker_compatible,
2813 DefaultIncrementalLinkerCompatible))
2814 CmdArgs.push_back("-mincremental-linker-compatible");
2815
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002816 // When passing -I arguments to the assembler we sometimes need to
2817 // unconditionally take the next argument. For example, when parsing
2818 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2819 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2820 // arg after parsing the '-I' arg.
2821 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002822
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002823 // When using an integrated assembler, translate -Wa, and -Xassembler
2824 // options.
2825 bool CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002826
2827 bool UseRelaxRelocations = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002828 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002829 for (const Arg *A :
2830 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2831 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002832
Benjamin Kramer72e64312015-09-24 14:48:49 +00002833 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002834 if (TakeNextArg) {
2835 CmdArgs.push_back(Value.data());
2836 TakeNextArg = false;
2837 continue;
2838 }
David Blaikie9260ed62013-07-25 21:19:01 +00002839
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002840 switch (C.getDefaultToolChain().getArch()) {
2841 default:
2842 break;
2843 case llvm::Triple::mips:
2844 case llvm::Triple::mipsel:
2845 case llvm::Triple::mips64:
2846 case llvm::Triple::mips64el:
2847 if (Value == "--trap") {
2848 CmdArgs.push_back("-target-feature");
2849 CmdArgs.push_back("+use-tcc-in-div");
2850 continue;
2851 }
2852 if (Value == "--break") {
2853 CmdArgs.push_back("-target-feature");
2854 CmdArgs.push_back("-use-tcc-in-div");
2855 continue;
2856 }
2857 if (Value.startswith("-msoft-float")) {
2858 CmdArgs.push_back("-target-feature");
2859 CmdArgs.push_back("+soft-float");
2860 continue;
2861 }
2862 if (Value.startswith("-mhard-float")) {
2863 CmdArgs.push_back("-target-feature");
2864 CmdArgs.push_back("-soft-float");
2865 continue;
2866 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002867
2868 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2869 .Case("-mips1", "+mips1")
2870 .Case("-mips2", "+mips2")
2871 .Case("-mips3", "+mips3")
2872 .Case("-mips4", "+mips4")
2873 .Case("-mips5", "+mips5")
2874 .Case("-mips32", "+mips32")
2875 .Case("-mips32r2", "+mips32r2")
2876 .Case("-mips32r3", "+mips32r3")
2877 .Case("-mips32r5", "+mips32r5")
2878 .Case("-mips32r6", "+mips32r6")
2879 .Case("-mips64", "+mips64")
2880 .Case("-mips64r2", "+mips64r2")
2881 .Case("-mips64r3", "+mips64r3")
2882 .Case("-mips64r5", "+mips64r5")
2883 .Case("-mips64r6", "+mips64r6")
2884 .Default(nullptr);
2885 if (MipsTargetFeature)
2886 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002887 }
2888
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002889 if (Value == "-force_cpusubtype_ALL") {
2890 // Do nothing, this is the default and we don't support anything else.
2891 } else if (Value == "-L") {
2892 CmdArgs.push_back("-msave-temp-labels");
2893 } else if (Value == "--fatal-warnings") {
2894 CmdArgs.push_back("-massembler-fatal-warnings");
2895 } else if (Value == "--noexecstack") {
2896 CmdArgs.push_back("-mnoexecstack");
2897 } else if (Value == "-compress-debug-sections" ||
2898 Value == "--compress-debug-sections") {
2899 CompressDebugSections = true;
2900 } else if (Value == "-nocompress-debug-sections" ||
2901 Value == "--nocompress-debug-sections") {
2902 CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002903 } else if (Value == "-mrelax-relocations=yes" ||
2904 Value == "--mrelax-relocations=yes") {
2905 UseRelaxRelocations = true;
2906 } else if (Value == "-mrelax-relocations=no" ||
2907 Value == "--mrelax-relocations=no") {
2908 UseRelaxRelocations = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002909 } else if (Value.startswith("-I")) {
2910 CmdArgs.push_back(Value.data());
2911 // We need to consume the next argument if the current arg is a plain
2912 // -I. The next arg will be the include directory.
2913 if (Value == "-I")
2914 TakeNextArg = true;
2915 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002916 // "-gdwarf-N" options are not cc1as options.
2917 unsigned DwarfVersion = DwarfVersionNum(Value);
2918 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2919 CmdArgs.push_back(Value.data());
2920 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002921 RenderDebugEnablingArgs(Args, CmdArgs,
2922 codegenoptions::LimitedDebugInfo,
2923 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002924 }
Renato Golin7c542b42015-07-27 23:44:45 +00002925 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2926 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2927 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002928 } else {
2929 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002930 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002931 }
2932 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002933 }
2934 if (CompressDebugSections) {
2935 if (llvm::zlib::isAvailable())
2936 CmdArgs.push_back("-compress-debug-sections");
2937 else
2938 D.Diag(diag::warn_debug_compression_unavailable);
2939 }
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002940 if (UseRelaxRelocations)
2941 CmdArgs.push_back("--mrelax-relocations");
Scott Egertonb67d4692016-01-14 13:01:48 +00002942 if (MipsTargetFeature != nullptr) {
2943 CmdArgs.push_back("-target-feature");
2944 CmdArgs.push_back(MipsTargetFeature);
2945 }
David Blaikie9260ed62013-07-25 21:19:01 +00002946}
2947
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002948// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002949// FIXME: Make sure we can also emit shared objects if they're requested
2950// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002951static void addClangRT(const ToolChain &TC, const ArgList &Args,
2952 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002953 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002954}
2955
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002956namespace {
2957enum OpenMPRuntimeKind {
2958 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2959 /// without knowing what runtime to target.
2960 OMPRT_Unknown,
2961
2962 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2963 /// the default for Clang.
2964 OMPRT_OMP,
2965
2966 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2967 /// this runtime but can swallow the pragmas, and find and link against the
2968 /// runtime library itself.
2969 OMPRT_GOMP,
2970
Chandler Carruthc6625c62015-05-28 21:10:31 +00002971 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002972 /// OpenMP runtime. We support this mode for users with existing dependencies
2973 /// on this runtime library name.
2974 OMPRT_IOMP5
2975};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002976}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002977
2978/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002979static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2980 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002981 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2982
2983 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2984 if (A)
2985 RuntimeName = A->getValue();
2986
2987 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002988 .Case("libomp", OMPRT_OMP)
2989 .Case("libgomp", OMPRT_GOMP)
2990 .Case("libiomp5", OMPRT_IOMP5)
2991 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002992
2993 if (RT == OMPRT_Unknown) {
2994 if (A)
2995 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002996 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002997 else
2998 // FIXME: We could use a nicer diagnostic here.
2999 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
3000 }
3001
3002 return RT;
3003}
3004
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00003005static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
3006 const ArgList &Args) {
3007 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3008 options::OPT_fno_openmp, false))
3009 return;
3010
3011 switch (getOpenMPRuntime(TC, Args)) {
3012 case OMPRT_OMP:
3013 CmdArgs.push_back("-lomp");
3014 break;
3015 case OMPRT_GOMP:
3016 CmdArgs.push_back("-lgomp");
3017 break;
3018 case OMPRT_IOMP5:
3019 CmdArgs.push_back("-liomp5");
3020 break;
3021 case OMPRT_Unknown:
3022 // Already diagnosed.
3023 break;
3024 }
3025}
3026
Alexey Samsonov52550342014-09-15 19:58:40 +00003027static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
3028 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00003029 bool IsShared, bool IsWhole) {
3030 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00003031 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00003032 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00003033 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00003034 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00003035}
3036
Alexey Samsonov52550342014-09-15 19:58:40 +00003037// Tries to use a file with the list of dynamic symbols that need to be exported
3038// from the runtime library. Returns true if the file was found.
3039static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
3040 ArgStringList &CmdArgs,
3041 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00003042 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00003043 if (llvm::sys::fs::exists(SanRT + ".syms")) {
3044 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00003045 return true;
3046 }
3047 return false;
3048}
3049
3050static void linkSanitizerRuntimeDeps(const ToolChain &TC,
3051 ArgStringList &CmdArgs) {
3052 // Force linking against the system libraries sanitizers depends on
3053 // (see PR15823 why this is necessary).
3054 CmdArgs.push_back("--no-as-needed");
3055 CmdArgs.push_back("-lpthread");
3056 CmdArgs.push_back("-lrt");
3057 CmdArgs.push_back("-lm");
3058 // There's no libdl on FreeBSD.
3059 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3060 CmdArgs.push_back("-ldl");
3061}
3062
3063static void
3064collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
3065 SmallVectorImpl<StringRef> &SharedRuntimes,
3066 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003067 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
3068 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
3069 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003070 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
3071 // Collect shared runtimes.
3072 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
3073 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00003074 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003075 // The stats_client library is also statically linked into DSOs.
3076 if (SanArgs.needsStatsRt())
3077 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003078
Alexey Samsonov52550342014-09-15 19:58:40 +00003079 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003080 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003081 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003082 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00003083 }
3084 if (SanArgs.needsAsanRt()) {
3085 if (SanArgs.needsSharedAsanRt()) {
3086 HelperStaticRuntimes.push_back("asan-preinit");
3087 } else {
3088 StaticRuntimes.push_back("asan");
3089 if (SanArgs.linkCXXRuntimes())
3090 StaticRuntimes.push_back("asan_cxx");
3091 }
3092 }
3093 if (SanArgs.needsDfsanRt())
3094 StaticRuntimes.push_back("dfsan");
3095 if (SanArgs.needsLsanRt())
3096 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003097 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003098 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003099 if (SanArgs.linkCXXRuntimes())
3100 StaticRuntimes.push_back("msan_cxx");
3101 }
3102 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003103 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003104 if (SanArgs.linkCXXRuntimes())
3105 StaticRuntimes.push_back("tsan_cxx");
3106 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003107 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00003108 StaticRuntimes.push_back("ubsan_standalone");
3109 if (SanArgs.linkCXXRuntimes())
3110 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003111 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003112 if (SanArgs.needsSafeStackRt())
3113 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003114 if (SanArgs.needsCfiRt())
3115 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003116 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003117 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003118 if (SanArgs.linkCXXRuntimes())
3119 StaticRuntimes.push_back("ubsan_standalone_cxx");
3120 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003121 if (SanArgs.needsStatsRt()) {
3122 NonWholeStaticRuntimes.push_back("stats");
3123 RequiredSymbols.push_back("__sanitizer_stats_register");
3124 }
Derek Bruening256c2e12016-04-21 21:32:04 +00003125 if (SanArgs.needsEsanRt())
3126 StaticRuntimes.push_back("esan");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003127}
3128
Alexey Samsonov52550342014-09-15 19:58:40 +00003129// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3130// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3131static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003132 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003133 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003134 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003135 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003136 NonWholeStaticRuntimes, HelperStaticRuntimes,
3137 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003138 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003139 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003140 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003141 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003142 bool AddExportDynamic = false;
3143 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003144 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003145 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3146 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003147 for (auto RT : NonWholeStaticRuntimes) {
3148 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3149 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3150 }
3151 for (auto S : RequiredSymbols) {
3152 CmdArgs.push_back("-u");
3153 CmdArgs.push_back(Args.MakeArgString(S));
3154 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003155 // If there is a static runtime with no dynamic list, force all the symbols
3156 // to be dynamic to be sure we export sanitizer interface functions.
3157 if (AddExportDynamic)
3158 CmdArgs.push_back("-export-dynamic");
3159 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003160}
3161
Reid Kleckner86ea7702015-02-04 23:45:07 +00003162static bool areOptimizationsEnabled(const ArgList &Args) {
3163 // Find the last -O arg and see if it is non-zero.
3164 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3165 return !A->getOption().matches(options::OPT_O0);
3166 // Defaults to -O0.
3167 return false;
3168}
3169
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003170static bool shouldUseFramePointerForTarget(const ArgList &Args,
3171 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003172 switch (Triple.getArch()) {
3173 case llvm::Triple::xcore:
3174 case llvm::Triple::wasm32:
3175 case llvm::Triple::wasm64:
3176 // XCore never wants frame pointers, regardless of OS.
3177 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003178 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003179 default:
3180 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003181 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003182
3183 if (Triple.isOSLinux()) {
3184 switch (Triple.getArch()) {
3185 // Don't use a frame pointer on linux if optimizing for certain targets.
3186 case llvm::Triple::mips64:
3187 case llvm::Triple::mips64el:
3188 case llvm::Triple::mips:
3189 case llvm::Triple::mipsel:
3190 case llvm::Triple::systemz:
3191 case llvm::Triple::x86:
3192 case llvm::Triple::x86_64:
3193 return !areOptimizationsEnabled(Args);
3194 default:
3195 return true;
3196 }
3197 }
3198
3199 if (Triple.isOSWindows()) {
3200 switch (Triple.getArch()) {
3201 case llvm::Triple::x86:
3202 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003203 case llvm::Triple::x86_64:
3204 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003205 case llvm::Triple::arm:
3206 case llvm::Triple::thumb:
3207 // Windows on ARM builds with FPO disabled to aid fast stack walking
3208 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003209 default:
3210 // All other supported Windows ISAs use xdata unwind information, so frame
3211 // pointers are not generally useful.
3212 return false;
3213 }
3214 }
3215
3216 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003217}
3218
Rafael Espindola224dd632011-12-14 21:02:23 +00003219static bool shouldUseFramePointer(const ArgList &Args,
3220 const llvm::Triple &Triple) {
3221 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3222 options::OPT_fomit_frame_pointer))
3223 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003224 if (Args.hasArg(options::OPT_pg))
3225 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003226
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003227 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003228}
3229
Eric Christopherb7d97e92013-04-03 01:58:53 +00003230static bool shouldUseLeafFramePointer(const ArgList &Args,
3231 const llvm::Triple &Triple) {
3232 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3233 options::OPT_momit_leaf_frame_pointer))
3234 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003235 if (Args.hasArg(options::OPT_pg))
3236 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003237
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003238 if (Triple.isPS4CPU())
3239 return false;
3240
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003241 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003242}
3243
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003244/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003245static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003246 SmallString<128> cwd;
3247 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003248 CmdArgs.push_back("-fdebug-compilation-dir");
3249 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003250 }
3251}
3252
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003253static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003254 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3255 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3256 SmallString<128> T(FinalOutput->getValue());
3257 llvm::sys::path::replace_extension(T, "dwo");
3258 return Args.MakeArgString(T);
3259 } else {
3260 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003261 SmallString<128> T(
3262 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003263 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003264 llvm::sys::path::replace_extension(F, "dwo");
3265 T += F;
3266 return Args.MakeArgString(F);
3267 }
3268}
3269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003270static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3271 const JobAction &JA, const ArgList &Args,
3272 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003273 ArgStringList ExtractArgs;
3274 ExtractArgs.push_back("--extract-dwo");
3275
3276 ArgStringList StripArgs;
3277 StripArgs.push_back("--strip-dwo");
3278
3279 // Grabbing the output of the earlier compile step.
3280 StripArgs.push_back(Output.getFilename());
3281 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003282 ExtractArgs.push_back(OutFile);
3283
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003284 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003285 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003286
3287 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003288 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003289
3290 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003291 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003292}
3293
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003294/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003295/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3296static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003297 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003298 if (A->getOption().matches(options::OPT_O4) ||
3299 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003300 return true;
3301
3302 if (A->getOption().matches(options::OPT_O0))
3303 return false;
3304
3305 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3306
Rafael Espindola91780de2013-08-26 14:05:41 +00003307 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003308 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003309 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003310 return true;
3311
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003312 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003313 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003314 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003315
3316 unsigned OptLevel = 0;
3317 if (S.getAsInteger(10, OptLevel))
3318 return false;
3319
3320 return OptLevel > 1;
3321 }
3322
3323 return false;
3324}
3325
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003326/// Add -x lang to \p CmdArgs for \p Input.
3327static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3328 ArgStringList &CmdArgs) {
3329 // When using -verify-pch, we don't want to provide the type
3330 // 'precompiled-header' if it was inferred from the file extension
3331 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3332 return;
3333
3334 CmdArgs.push_back("-x");
3335 if (Args.hasArg(options::OPT_rewrite_objc))
3336 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3337 else
3338 CmdArgs.push_back(types::getTypeName(Input.getType()));
3339}
3340
David Majnemerc371ff02015-03-22 08:39:22 +00003341static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003342 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003343 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003344
3345 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003346 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003347
3348 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003349 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003350 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003351 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003352}
3353
Rafael Espindola577637a2015-01-03 00:06:04 +00003354// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003355// options that build systems might add but are unused when assembling or only
3356// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003357static void claimNoWarnArgs(const ArgList &Args) {
3358 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003359 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003360 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003361 Args.ClaimAllArgs(options::OPT_flto);
3362 Args.ClaimAllArgs(options::OPT_fno_lto);
3363}
3364
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003365static void appendUserToPath(SmallVectorImpl<char> &Result) {
3366#ifdef LLVM_ON_UNIX
3367 const char *Username = getenv("LOGNAME");
3368#else
3369 const char *Username = getenv("USERNAME");
3370#endif
3371 if (Username) {
3372 // Validate that LoginName can be used in a path, and get its length.
3373 size_t Len = 0;
3374 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003375 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003376 Username = nullptr;
3377 break;
3378 }
3379 }
3380
3381 if (Username && Len > 0) {
3382 Result.append(Username, Username + Len);
3383 return;
3384 }
3385 }
3386
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003387// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003388#ifdef LLVM_ON_UNIX
3389 std::string UID = llvm::utostr(getuid());
3390#else
3391 // FIXME: Windows seems to have an 'SID' that might work.
3392 std::string UID = "9999";
3393#endif
3394 Result.append(UID.begin(), UID.end());
3395}
3396
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003397VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC,
David Majnemere11d3732015-06-08 00:22:46 +00003398 const llvm::Triple &Triple,
3399 const llvm::opt::ArgList &Args,
3400 bool IsWindowsMSVC) {
3401 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3402 IsWindowsMSVC) ||
3403 Args.hasArg(options::OPT_fmsc_version) ||
3404 Args.hasArg(options::OPT_fms_compatibility_version)) {
3405 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3406 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003407 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003408
3409 if (MSCVersion && MSCompatibilityVersion) {
3410 if (D)
3411 D->Diag(diag::err_drv_argument_not_allowed_with)
3412 << MSCVersion->getAsString(Args)
3413 << MSCompatibilityVersion->getAsString(Args);
3414 return VersionTuple();
3415 }
3416
3417 if (MSCompatibilityVersion) {
3418 VersionTuple MSVT;
3419 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3420 D->Diag(diag::err_drv_invalid_value)
3421 << MSCompatibilityVersion->getAsString(Args)
3422 << MSCompatibilityVersion->getValue();
3423 return MSVT;
3424 }
3425
3426 if (MSCVersion) {
3427 unsigned Version = 0;
3428 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3429 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3430 << MSCVersion->getValue();
3431 return getMSCompatibilityVersion(Version);
3432 }
3433
3434 unsigned Major, Minor, Micro;
3435 Triple.getEnvironmentVersion(Major, Minor, Micro);
3436 if (Major || Minor || Micro)
3437 return VersionTuple(Major, Minor, Micro);
3438
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003439 if (IsWindowsMSVC) {
3440 VersionTuple MSVT = TC.getMSVCVersionFromExe();
3441 if (!MSVT.empty())
3442 return MSVT;
3443
3444 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
3445 return VersionTuple(18);
3446 }
David Majnemere11d3732015-06-08 00:22:46 +00003447 }
3448 return VersionTuple();
3449}
3450
Diego Novilloa0545962015-07-10 18:00:07 +00003451static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3452 const InputInfo &Output, const ArgList &Args,
3453 ArgStringList &CmdArgs) {
3454 auto *ProfileGenerateArg = Args.getLastArg(
3455 options::OPT_fprofile_instr_generate,
3456 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003457 options::OPT_fprofile_generate_EQ,
3458 options::OPT_fno_profile_instr_generate);
3459 if (ProfileGenerateArg &&
3460 ProfileGenerateArg->getOption().matches(
3461 options::OPT_fno_profile_instr_generate))
3462 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003463
3464 auto *ProfileUseArg = Args.getLastArg(
3465 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003466 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3467 options::OPT_fno_profile_instr_use);
3468 if (ProfileUseArg &&
3469 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3470 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003471
3472 if (ProfileGenerateArg && ProfileUseArg)
3473 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003474 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003475
Diego Novillo758f3f52015-08-05 21:49:51 +00003476 if (ProfileGenerateArg) {
3477 if (ProfileGenerateArg->getOption().matches(
3478 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003479 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3480 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003481 else if (ProfileGenerateArg->getOption().matches(
3482 options::OPT_fprofile_generate_EQ)) {
3483 SmallString<128> Path(ProfileGenerateArg->getValue());
3484 llvm::sys::path::append(Path, "default.profraw");
3485 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003486 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3487 }
3488 // The default is to use Clang Instrumentation.
3489 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003490 }
Diego Novilloa0545962015-07-10 18:00:07 +00003491
Diego Novillo758f3f52015-08-05 21:49:51 +00003492 if (ProfileUseArg) {
3493 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003494 CmdArgs.push_back(Args.MakeArgString(
3495 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003496 else if ((ProfileUseArg->getOption().matches(
3497 options::OPT_fprofile_use_EQ) ||
3498 ProfileUseArg->getOption().matches(
3499 options::OPT_fprofile_instr_use))) {
3500 SmallString<128> Path(
3501 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3502 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3503 llvm::sys::path::append(Path, "default.profdata");
3504 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003505 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003506 }
Diego Novilloa0545962015-07-10 18:00:07 +00003507 }
3508
3509 if (Args.hasArg(options::OPT_ftest_coverage) ||
3510 Args.hasArg(options::OPT_coverage))
3511 CmdArgs.push_back("-femit-coverage-notes");
3512 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3513 false) ||
3514 Args.hasArg(options::OPT_coverage))
3515 CmdArgs.push_back("-femit-coverage-data");
3516
Diego Novilloc4b94da2015-08-05 23:27:40 +00003517 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3518 options::OPT_fno_coverage_mapping, false) &&
3519 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003520 D.Diag(diag::err_drv_argument_only_allowed_with)
3521 << "-fcoverage-mapping"
3522 << "-fprofile-instr-generate";
3523
Diego Novilloc4b94da2015-08-05 23:27:40 +00003524 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3525 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003526 CmdArgs.push_back("-fcoverage-mapping");
3527
3528 if (C.getArgs().hasArg(options::OPT_c) ||
3529 C.getArgs().hasArg(options::OPT_S)) {
3530 if (Output.isFilename()) {
3531 CmdArgs.push_back("-coverage-file");
3532 SmallString<128> CoverageFilename;
3533 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3534 CoverageFilename = FinalOutput->getValue();
3535 } else {
3536 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3537 }
3538 if (llvm::sys::path::is_relative(CoverageFilename)) {
3539 SmallString<128> Pwd;
3540 if (!llvm::sys::fs::current_path(Pwd)) {
3541 llvm::sys::path::append(Pwd, CoverageFilename);
3542 CoverageFilename.swap(Pwd);
3543 }
3544 }
3545 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3546 }
3547 }
3548}
3549
Paul Robinsond083b9a2015-12-16 17:25:27 +00003550static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3551 ArgStringList &CmdArgs) {
3552 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3553 false) ||
3554 Args.hasFlag(options::OPT_fprofile_generate,
3555 options::OPT_fno_profile_instr_generate, false) ||
3556 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3557 options::OPT_fno_profile_instr_generate, false) ||
3558 Args.hasFlag(options::OPT_fprofile_instr_generate,
3559 options::OPT_fno_profile_instr_generate, false) ||
3560 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3561 options::OPT_fno_profile_instr_generate, false) ||
3562 Args.hasArg(options::OPT_fcreate_profile) ||
3563 Args.hasArg(options::OPT_coverage)))
3564 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3565}
3566
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003567/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3568/// smooshes them together with platform defaults, to decide whether
3569/// this compile should be using PIC mode or not. Returns a tuple of
3570/// (RelocationModel, PICLevel, IsPIE).
3571static std::tuple<llvm::Reloc::Model, unsigned, bool>
3572ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3573 const ArgList &Args) {
3574 // FIXME: why does this code...and so much everywhere else, use both
3575 // ToolChain.getTriple() and Triple?
3576 bool PIE = ToolChain.isPIEDefault();
3577 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003578 // The Darwin/MachO default to use PIC does not apply when using -static.
3579 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3580 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003581 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003582 bool IsPICLevelTwo = PIC;
3583
3584 bool KernelOrKext =
3585 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3586
3587 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003588 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003589 switch (ToolChain.getArch()) {
3590 case llvm::Triple::arm:
3591 case llvm::Triple::armeb:
3592 case llvm::Triple::thumb:
3593 case llvm::Triple::thumbeb:
3594 case llvm::Triple::aarch64:
3595 case llvm::Triple::mips:
3596 case llvm::Triple::mipsel:
3597 case llvm::Triple::mips64:
3598 case llvm::Triple::mips64el:
3599 PIC = true; // "-fpic"
3600 break;
3601
3602 case llvm::Triple::x86:
3603 case llvm::Triple::x86_64:
3604 PIC = true; // "-fPIC"
3605 IsPICLevelTwo = true;
3606 break;
3607
3608 default:
3609 break;
3610 }
3611 }
3612
3613 // OpenBSD-specific defaults for PIE
3614 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3615 switch (ToolChain.getArch()) {
3616 case llvm::Triple::mips64:
3617 case llvm::Triple::mips64el:
3618 case llvm::Triple::sparcel:
3619 case llvm::Triple::x86:
3620 case llvm::Triple::x86_64:
3621 IsPICLevelTwo = false; // "-fpie"
3622 break;
3623
3624 case llvm::Triple::ppc:
3625 case llvm::Triple::sparc:
3626 case llvm::Triple::sparcv9:
3627 IsPICLevelTwo = true; // "-fPIE"
3628 break;
3629
3630 default:
3631 break;
3632 }
3633 }
3634
3635 // The last argument relating to either PIC or PIE wins, and no
3636 // other argument is used. If the last argument is any flavor of the
3637 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3638 // option implicitly enables PIC at the same level.
3639 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3640 options::OPT_fpic, options::OPT_fno_pic,
3641 options::OPT_fPIE, options::OPT_fno_PIE,
3642 options::OPT_fpie, options::OPT_fno_pie);
3643 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3644 // is forced, then neither PIC nor PIE flags will have no effect.
3645 if (!ToolChain.isPICDefaultForced()) {
3646 if (LastPICArg) {
3647 Option O = LastPICArg->getOption();
3648 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3649 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3650 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3651 PIC =
3652 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3653 IsPICLevelTwo =
3654 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3655 } else {
3656 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003657 if (Triple.isPS4CPU()) {
3658 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3659 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3660 if (Model != "kernel") {
3661 PIC = true;
3662 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3663 << LastPICArg->getSpelling();
3664 }
3665 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003666 }
3667 }
3668 }
3669
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003670 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3671 // PIC level would've been set to level 1, force it back to level 2 PIC
3672 // instead.
3673 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003674 IsPICLevelTwo |= ToolChain.isPICDefault();
3675
James Y Knightc4015d32015-08-21 04:14:55 +00003676 // This kernel flags are a trump-card: they will disable PIC/PIE
3677 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003678 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3679 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003680 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003681
3682 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3683 // This is a very special mode. It trumps the other modes, almost no one
3684 // uses it, and it isn't even valid on any OS but Darwin.
3685 if (!ToolChain.getTriple().isOSDarwin())
3686 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3687 << A->getSpelling() << ToolChain.getTriple().str();
3688
3689 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3690
3691 // Only a forced PIC mode can cause the actual compile to have PIC defines
3692 // etc., no flags are sufficient. This behavior was selected to closely
3693 // match that of llvm-gcc and Apple GCC before that.
3694 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3695
3696 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3697 }
3698
3699 if (PIC)
3700 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3701
3702 return std::make_tuple(llvm::Reloc::Static, 0, false);
3703}
3704
3705static const char *RelocationModelName(llvm::Reloc::Model Model) {
3706 switch (Model) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003707 case llvm::Reloc::Static:
3708 return "static";
3709 case llvm::Reloc::PIC_:
3710 return "pic";
3711 case llvm::Reloc::DynamicNoPIC:
3712 return "dynamic-no-pic";
3713 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003714 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003715}
3716
3717static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3718 ArgStringList &CmdArgs) {
3719 llvm::Reloc::Model RelocationModel;
3720 unsigned PICLevel;
3721 bool IsPIE;
3722 std::tie(RelocationModel, PICLevel, IsPIE) =
3723 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3724
3725 if (RelocationModel != llvm::Reloc::Static)
3726 CmdArgs.push_back("-KPIC");
3727}
3728
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003729void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003730 const InputInfo &Output, const InputInfoList &Inputs,
3731 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003732 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3733 const llvm::Triple Triple(TripleStr);
3734
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003735 bool KernelOrKext =
3736 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003737 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003738 ArgStringList CmdArgs;
3739
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003740 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003741 bool IsWindowsCygnus =
3742 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003743 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003744 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003745
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003746 // Check number of inputs for sanity. We need at least one input.
3747 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003748 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003749 // CUDA compilation may have multiple inputs (source file + results of
3750 // device-side compilations). All other jobs are expected to have exactly one
3751 // input.
3752 bool IsCuda = types::isCuda(Input.getType());
3753 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003754
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003755 // Invoke ourselves in -cc1 mode.
3756 //
3757 // FIXME: Implement custom jobs for internal actions.
3758 CmdArgs.push_back("-cc1");
3759
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003760 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003761 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003762 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003763
Artem Belevichfa11ab52015-11-17 22:28:46 +00003764 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003765 if (IsCuda) {
3766 // FIXME: We need a (better) way to pass information about
3767 // particular compilation pass we're constructing here. For now we
3768 // can check which toolchain we're using and pick the other one to
3769 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003770 if (&getToolChain() == C.getCudaDeviceToolChain())
3771 AuxToolChain = C.getCudaHostToolChain();
3772 else if (&getToolChain() == C.getCudaHostToolChain())
3773 AuxToolChain = C.getCudaDeviceToolChain();
3774 else
3775 llvm_unreachable("Can't figure out CUDA compilation mode.");
3776 assert(AuxToolChain != nullptr && "No aux toolchain.");
3777 CmdArgs.push_back("-aux-triple");
3778 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3779 }
3780
James Y Knight2db38f32015-08-15 03:45:25 +00003781 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3782 Triple.getArch() == llvm::Triple::thumb)) {
3783 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003784 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003785 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003786 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003787 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003788 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003789 }
3790
Tim Northover336f1892014-03-29 13:16:12 +00003791 // Push all default warning arguments that are specific to
3792 // the given target. These come before user provided warning options
3793 // are provided.
3794 getToolChain().addClangWarningOptions(CmdArgs);
3795
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003796 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003797 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003798
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003799 if (isa<AnalyzeJobAction>(JA)) {
3800 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3801 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003802 } else if (isa<MigrateJobAction>(JA)) {
3803 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003804 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003805 if (Output.getType() == types::TY_Dependencies)
3806 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003807 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003808 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003809 if (Args.hasArg(options::OPT_rewrite_objc) &&
3810 !Args.hasArg(options::OPT_g_Group))
3811 CmdArgs.push_back("-P");
3812 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003813 } else if (isa<AssembleJobAction>(JA)) {
3814 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003815
David Blaikie9260ed62013-07-25 21:19:01 +00003816 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003817
3818 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003819 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003820 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003821 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003822 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003823
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003824 if (JA.getType() == types::TY_Nothing)
3825 CmdArgs.push_back("-fsyntax-only");
3826 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003827 CmdArgs.push_back("-emit-pch");
3828 else
3829 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003830 } else if (isa<VerifyPCHJobAction>(JA)) {
3831 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003832 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003833 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3834 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003835 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003836 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003837 } else if (JA.getType() == types::TY_LLVM_IR ||
3838 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003839 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003840 } else if (JA.getType() == types::TY_LLVM_BC ||
3841 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003842 CmdArgs.push_back("-emit-llvm-bc");
3843 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003844 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003845 } else if (JA.getType() == types::TY_AST) {
3846 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003847 } else if (JA.getType() == types::TY_ModuleFile) {
3848 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003849 } else if (JA.getType() == types::TY_RewrittenObjC) {
3850 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003851 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003852 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3853 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003854 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003855 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003856 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003857 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003858
3859 // Preserve use-list order by default when emitting bitcode, so that
3860 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3861 // same result as running passes here. For LTO, we don't need to preserve
3862 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003863 if (JA.getType() == types::TY_LLVM_BC)
3864 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003865
3866 if (D.isUsingLTO())
3867 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003868 }
3869
Teresa Johnsonaff22322015-12-07 19:21:34 +00003870 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3871 if (!types::isLLVMIR(Input.getType()))
3872 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3873 << "-x ir";
3874 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3875 }
3876
Steven Wu574b0f22016-03-01 01:07:58 +00003877 // Embed-bitcode option.
3878 if (C.getDriver().embedBitcodeEnabled() &&
3879 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3880 // Add flags implied by -fembed-bitcode.
Steven Wu27fb5222016-05-11 16:26:03 +00003881 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
Steven Wu574b0f22016-03-01 01:07:58 +00003882 // Disable all llvm IR level optimizations.
3883 CmdArgs.push_back("-disable-llvm-optzns");
3884 }
3885 if (C.getDriver().embedBitcodeMarkerOnly())
Steven Wu27fb5222016-05-11 16:26:03 +00003886 CmdArgs.push_back("-fembed-bitcode=marker");
Steven Wu574b0f22016-03-01 01:07:58 +00003887
Justin Bognera88f0122014-06-20 22:59:50 +00003888 // We normally speed up the clang process a bit by skipping destructors at
3889 // exit, but when we're generating diagnostics we can rely on some of the
3890 // cleanup.
3891 if (!C.isForDiagnostics())
3892 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003893
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003894// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003895#ifdef NDEBUG
3896 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003897 // Discard LLVM value names in -asserts builds.
3898 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003899#endif
3900
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003901 // Set the main file name, so that debug info works even with
3902 // -save-temps.
3903 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003904 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003905
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003906 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003907 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003908 if (Args.hasArg(options::OPT_static))
3909 CmdArgs.push_back("-static-define");
3910
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003911 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003912 // Enable region store model by default.
3913 CmdArgs.push_back("-analyzer-store=region");
3914
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003915 // Treat blocks as analysis entry points.
3916 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3917
Ted Kremenek49c79792011-03-24 00:28:47 +00003918 CmdArgs.push_back("-analyzer-eagerly-assume");
3919
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003920 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003921 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003922 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003923
Devin Coughlin65c77082016-01-21 20:09:49 +00003924 if (!IsWindowsMSVC) {
3925 CmdArgs.push_back("-analyzer-checker=unix");
3926 } else {
3927 // Enable "unix" checkers that also work on Windows.
3928 CmdArgs.push_back("-analyzer-checker=unix.API");
3929 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3930 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3931 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3932 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3933 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3934 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003935
Sean Evesonb38c32b2016-01-06 10:03:58 +00003936 // Disable some unix checkers for PS4.
3937 if (IsPS4CPU) {
3938 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3939 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3940 }
3941
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003942 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003943 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003945 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003946
Artem Belevichba558952015-05-06 18:20:23 +00003947 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003948 CmdArgs.push_back("-analyzer-checker=cplusplus");
3949
Sean Evesonb38c32b2016-01-06 10:03:58 +00003950 if (!IsPS4CPU) {
3951 CmdArgs.push_back(
3952 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3953 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3954 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3955 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3956 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3957 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3958 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003959
3960 // Default nullability checks.
3961 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3962 CmdArgs.push_back(
3963 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003964 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003965
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003966 // Set the output format. The default is plist, for (lame) historical
3967 // reasons.
3968 CmdArgs.push_back("-analyzer-output");
3969 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003970 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003971 else
3972 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003973
Ted Kremenekfe449a22010-03-22 22:32:05 +00003974 // Disable the presentation of standard compiler warnings when
3975 // using --analyze. We only want to show static analyzer diagnostics
3976 // or frontend errors.
3977 CmdArgs.push_back("-w");
3978
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003979 // Add -Xanalyzer arguments when running as analyzer.
3980 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003981 }
3982
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003983 CheckCodeGenerationOptions(D, Args);
3984
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003985 llvm::Reloc::Model RelocationModel;
3986 unsigned PICLevel;
3987 bool IsPIE;
3988 std::tie(RelocationModel, PICLevel, IsPIE) =
3989 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003990
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003991 const char *RMName = RelocationModelName(RelocationModel);
3992 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003993 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003994 CmdArgs.push_back(RMName);
3995 }
3996 if (PICLevel > 0) {
3997 CmdArgs.push_back("-pic-level");
3998 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3999 if (IsPIE) {
4000 CmdArgs.push_back("-pie-level");
4001 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00004002 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004003 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00004004
Renato Golin4854d802015-11-09 12:40:41 +00004005 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
4006 CmdArgs.push_back("-meabi");
4007 CmdArgs.push_back(A->getValue());
4008 }
4009
Jonathan Roelofsb140a102014-10-03 21:57:44 +00004010 CmdArgs.push_back("-mthread-model");
4011 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
4012 CmdArgs.push_back(A->getValue());
4013 else
4014 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
4015
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00004016 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
4017
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00004018 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
4019 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00004020 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00004021
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004022 // LLVM Code Generator Options.
4023
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004024 if (Args.hasArg(options::OPT_frewrite_map_file) ||
4025 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00004026 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
4027 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004028 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00004029 CmdArgs.push_back(A->getValue());
4030 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004031 }
4032 }
4033
Alp Tokerfb8d02b2014-06-05 22:10:59 +00004034 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
4035 StringRef v = A->getValue();
4036 CmdArgs.push_back("-mllvm");
4037 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
4038 A->claim();
4039 }
4040
Nirav Daved2f44d82016-04-05 17:50:43 +00004041 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
4042 true))
4043 CmdArgs.push_back("-fno-jump-tables");
4044
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004045 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
4046 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00004047 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004048 }
4049
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004050 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
4051 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004052 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00004053 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004054 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00004055 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
4056 CmdArgs.push_back("-fpcc-struct-return");
4057 } else {
4058 assert(A->getOption().matches(options::OPT_freg_struct_return));
4059 CmdArgs.push_back("-freg-struct-return");
4060 }
4061 }
4062
Roman Divacky65b88cd2011-03-01 17:40:53 +00004063 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
Alexey Bataeva7547182016-05-18 09:06:38 +00004064 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
Roman Divacky65b88cd2011-03-01 17:40:53 +00004065
Rafael Espindola224dd632011-12-14 21:02:23 +00004066 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004067 CmdArgs.push_back("-mdisable-fp-elim");
4068 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
4069 options::OPT_fno_zero_initialized_in_bss))
4070 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004071
4072 bool OFastEnabled = isOptimizationLevelFast(Args);
4073 // If -Ofast is the optimization level, then -fstrict-aliasing should be
4074 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004075 OptSpecifier StrictAliasingAliasOption =
4076 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004077 // We turn strict aliasing off by default if we're in CL mode, since MSVC
4078 // doesn't do any TBAA.
4079 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004080 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004081 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00004082 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00004083 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
4084 options::OPT_fno_struct_path_tbaa))
4085 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00004086 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
4087 false))
4088 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00004089 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
4090 options::OPT_fno_strict_vtable_pointers,
4091 false))
4092 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00004093 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
4094 options::OPT_fno_optimize_sibling_calls))
4095 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004096
Eric Christopher006208c2013-04-04 06:29:47 +00004097 // Handle segmented stacks.
4098 if (Args.hasArg(options::OPT_fsplit_stack))
4099 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004100
4101 // If -Ofast is the optimization level, then -ffast-math should be enabled.
4102 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004103 OptSpecifier FastMathAliasOption =
4104 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
4105
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004106 // Handle various floating point optimization flags, mapping them to the
4107 // appropriate LLVM code generation flags. The pattern for all of these is to
4108 // default off the codegen optimizations, and if any flag enables them and no
4109 // flag disables them after the flag enabling them, enable the codegen
4110 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004111 if (Arg *A = Args.getLastArg(
4112 options::OPT_ffast_math, FastMathAliasOption,
4113 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4114 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4115 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004116 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4117 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004118 A->getOption().getID() != options::OPT_fhonor_infinities)
4119 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004120 if (Arg *A = Args.getLastArg(
4121 options::OPT_ffast_math, FastMathAliasOption,
4122 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4123 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4124 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004125 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4126 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004127 A->getOption().getID() != options::OPT_fhonor_nans)
4128 CmdArgs.push_back("-menable-no-nans");
4129
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004130 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4131 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004132 if (Arg *A =
4133 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4134 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4135 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004136 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4137 // However, turning *off* -ffast_math merely restores the toolchain default
4138 // (which may be false).
4139 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4140 A->getOption().getID() == options::OPT_ffast_math ||
4141 A->getOption().getID() == options::OPT_Ofast)
4142 MathErrno = false;
4143 else if (A->getOption().getID() == options::OPT_fmath_errno)
4144 MathErrno = true;
4145 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004146 if (MathErrno)
4147 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004148
4149 // There are several flags which require disabling very specific
4150 // optimizations. Any of these being disabled forces us to turn off the
4151 // entire set of LLVM optimizations, so collect them through all the flag
4152 // madness.
4153 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004154 if (Arg *A = Args.getLastArg(
4155 options::OPT_ffast_math, FastMathAliasOption,
4156 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4157 options::OPT_fno_unsafe_math_optimizations,
4158 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004159 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4160 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004161 A->getOption().getID() != options::OPT_fno_associative_math)
4162 AssociativeMath = true;
4163 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004164 if (Arg *A = Args.getLastArg(
4165 options::OPT_ffast_math, FastMathAliasOption,
4166 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4167 options::OPT_fno_unsafe_math_optimizations,
4168 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004169 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4170 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004171 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4172 ReciprocalMath = true;
4173 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004174 if (Arg *A = Args.getLastArg(
4175 options::OPT_ffast_math, FastMathAliasOption,
4176 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4177 options::OPT_fno_unsafe_math_optimizations,
4178 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004179 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4180 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004181 A->getOption().getID() != options::OPT_fsigned_zeros)
4182 SignedZeros = false;
4183 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004184 if (Arg *A = Args.getLastArg(
4185 options::OPT_ffast_math, FastMathAliasOption,
4186 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4187 options::OPT_fno_unsafe_math_optimizations,
4188 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004189 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4190 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004191 A->getOption().getID() != options::OPT_ftrapping_math)
4192 TrappingMath = false;
4193 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4194 !TrappingMath)
4195 CmdArgs.push_back("-menable-unsafe-fp-math");
4196
Sanjay Patel76c9e092015-01-23 16:40:50 +00004197 if (!SignedZeros)
4198 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004199
Sanjay Patel359b1052015-04-09 15:03:23 +00004200 if (ReciprocalMath)
4201 CmdArgs.push_back("-freciprocal-math");
4202
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004203 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004204 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004205 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004206 options::OPT_ffp_contract)) {
4207 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004208 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004209 if (Val == "fast" || Val == "on" || Val == "off") {
4210 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4211 } else {
4212 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004213 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004214 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004215 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4216 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004217 // If fast-math is set then set the fp-contract mode to fast.
4218 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4219 }
4220 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004221
Sanjay Patel2987c292015-06-11 14:53:41 +00004222 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004223
Bob Wilson6a039162012-07-19 03:52:53 +00004224 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4225 // and if we find them, tell the frontend to provide the appropriate
4226 // preprocessor macros. This is distinct from enabling any optimizations as
4227 // these options induce language changes which must survive serialization
4228 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004229 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4230 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004231 if (!A->getOption().matches(options::OPT_fno_fast_math))
4232 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004233 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4234 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004235 if (A->getOption().matches(options::OPT_ffinite_math_only))
4236 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004237
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004238 // Decide whether to use verbose asm. Verbose assembly is the default on
4239 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004240 bool IsIntegratedAssemblerDefault =
4241 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004242 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004243 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004244 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004245 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004246
Rafael Espindolab8a12932015-05-22 20:44:03 +00004247 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4248 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004249 CmdArgs.push_back("-no-integrated-as");
4250
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004251 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4252 CmdArgs.push_back("-mdebug-pass");
4253 CmdArgs.push_back("Structure");
4254 }
4255 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4256 CmdArgs.push_back("-mdebug-pass");
4257 CmdArgs.push_back("Arguments");
4258 }
4259
Justin Lebar710a35f2016-01-25 22:36:35 +00004260 // Enable -mconstructor-aliases except on darwin, where we have to work around
4261 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4262 // aliases aren't supported.
4263 if (!getToolChain().getTriple().isOSDarwin() &&
4264 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004265 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004266
John McCall7ef5cb32011-03-18 02:56:14 +00004267 // Darwin's kernel doesn't support guard variables; just die if we
4268 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004269 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004270 CmdArgs.push_back("-fforbid-guard-variables");
4271
Akira Hatanaka02028482015-11-12 17:21:22 +00004272 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4273 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004274 CmdArgs.push_back("-mms-bitfields");
4275 }
John McCall8517abc2010-02-19 02:45:38 +00004276
Daniel Dunbar306945d2009-09-16 06:17:29 +00004277 // This is a coarse approximation of what llvm-gcc actually does, both
4278 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4279 // complicated ways.
4280 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004281 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4282 options::OPT_fno_asynchronous_unwind_tables,
4283 (getToolChain().IsUnwindTablesDefault() ||
4284 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4285 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004286 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4287 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004288 CmdArgs.push_back("-munwind-tables");
4289
Chandler Carruth05fb5852012-11-21 23:40:23 +00004290 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004291
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004292 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4293 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004294 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004295 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004296
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004297 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004298 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004299
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004300 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004301 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004302 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004303 }
4304
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004305 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004306 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004307 if (!CPU.empty()) {
4308 CmdArgs.push_back("-target-cpu");
4309 CmdArgs.push_back(Args.MakeArgString(CPU));
4310 }
4311
Rafael Espindolaeb265472013-08-21 21:59:03 +00004312 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4313 CmdArgs.push_back("-mfpmath");
4314 CmdArgs.push_back(A->getValue());
4315 }
4316
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004317 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004318 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004319
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004320 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004321 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004322 default:
4323 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004324
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004325 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004326 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004327 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004328 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004329 // Use the effective triple, which takes into account the deployment target.
4330 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004331 break;
4332
Tim Northover573cbee2014-05-24 12:52:07 +00004333 case llvm::Triple::aarch64:
4334 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004335 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004336 break;
4337
Eric Christopher0b26a612010-03-02 02:41:08 +00004338 case llvm::Triple::mips:
4339 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004340 case llvm::Triple::mips64:
4341 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004342 AddMIPSTargetArgs(Args, CmdArgs);
4343 break;
4344
Ulrich Weigand8afad612014-07-28 13:17:52 +00004345 case llvm::Triple::ppc:
4346 case llvm::Triple::ppc64:
4347 case llvm::Triple::ppc64le:
4348 AddPPCTargetArgs(Args, CmdArgs);
4349 break;
4350
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004351 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004352 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004353 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004354 AddSparcTargetArgs(Args, CmdArgs);
4355 break;
4356
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00004357 case llvm::Triple::systemz:
4358 AddSystemZTargetArgs(Args, CmdArgs);
4359 break;
4360
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004361 case llvm::Triple::x86:
4362 case llvm::Triple::x86_64:
4363 AddX86TargetArgs(Args, CmdArgs);
4364 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004365
Jacques Pienaard964cc22016-03-28 21:02:54 +00004366 case llvm::Triple::lanai:
4367 AddLanaiTargetArgs(Args, CmdArgs);
4368 break;
4369
Tony Linthicum76329bf2011-12-12 21:14:55 +00004370 case llvm::Triple::hexagon:
4371 AddHexagonTargetArgs(Args, CmdArgs);
4372 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004373
4374 case llvm::Triple::wasm32:
4375 case llvm::Triple::wasm64:
4376 AddWebAssemblyTargetArgs(Args, CmdArgs);
4377 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004378 }
4379
Douglas Katzman3459ce22015-10-08 04:24:12 +00004380 // The 'g' groups options involve a somewhat intricate sequence of decisions
4381 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004382 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004383 // * what level of debug info to generate
4384 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004385 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004386 // This avoids having to monkey around further in cc1 other than to disable
4387 // codeview if not running in a Windows environment. Perhaps even that
4388 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004389 unsigned DwarfVersion = 0;
4390 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4391 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004392 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004393 bool EmitCodeView = false;
4394
Hans Wennborg75958c42013-08-08 00:17:41 +00004395 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004396 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004397 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004398 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004399
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004400 // Pass the linker version in use.
4401 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4402 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004403 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004404 }
4405
Eric Christopherb7d97e92013-04-03 01:58:53 +00004406 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004407 CmdArgs.push_back("-momit-leaf-frame-pointer");
4408
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004409 // Explicitly error on some things we know we don't support and can't just
4410 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004411 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4412 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004413 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004414 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004415 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4416 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004417 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004418 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004419 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004420 }
4421
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004422 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004423 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004424 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004425 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004426 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4427 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004428 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004429 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004430 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004431
Chad Rosierbe10f982011-08-02 17:58:04 +00004432 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004433 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004434 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4435 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004436 }
4437
Rafael Espindola08a692a2010-03-07 04:46:18 +00004438 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004439 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004440 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004441 // If the last option explicitly specified a debug-info level, use it.
4442 if (A->getOption().matches(options::OPT_gN_Group)) {
4443 DebugInfoKind = DebugLevelToInfoKind(*A);
4444 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4445 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4446 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004447 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004448 A->getIndex() > SplitDwarfArg->getIndex())
4449 SplitDwarfArg = nullptr;
4450 } else
4451 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004452 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004453 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004454
Paul Robinson0334a042015-12-19 19:41:48 +00004455 // If a debugger tuning argument appeared, remember it.
4456 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4457 options::OPT_ggdbN_Group)) {
4458 if (A->getOption().matches(options::OPT_glldb))
4459 DebuggerTuning = llvm::DebuggerKind::LLDB;
4460 else if (A->getOption().matches(options::OPT_gsce))
4461 DebuggerTuning = llvm::DebuggerKind::SCE;
4462 else
4463 DebuggerTuning = llvm::DebuggerKind::GDB;
4464 }
4465
4466 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004467 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004468 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004469 DwarfVersion = DwarfVersionNum(A->getSpelling());
4470
Reid Kleckner124955a2015-08-05 18:51:13 +00004471 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004472 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4473 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4474 // DwarfVersion remains at 0 if no explicit choice was made.
4475 CmdArgs.push_back("-gcodeview");
4476 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004477 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004478 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4479 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004480
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004481 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4482 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004483
4484 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004485 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004486 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004487 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004488
Eric Christopher138c32b2013-09-13 22:37:55 +00004489 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004490 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004491 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004492 CmdArgs.push_back("-dwarf-ext-refs");
4493 CmdArgs.push_back("-fmodule-format=obj");
4494 }
4495
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004496 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4497 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004498 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004499 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004500 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004501 CmdArgs.push_back("-backend-option");
4502 CmdArgs.push_back("-split-dwarf=Enable");
4503 }
4504
Douglas Katzman3459ce22015-10-08 04:24:12 +00004505 // After we've dealt with all combinations of things that could
4506 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4507 // figure out if we need to "upgrade" it to standalone debug info.
4508 // We parse these two '-f' options whether or not they will be used,
4509 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4510 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4511 options::OPT_fno_standalone_debug,
4512 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004513 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4514 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004515 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4516 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004517
Eric Christopher138c32b2013-09-13 22:37:55 +00004518 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4519 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4520 CmdArgs.push_back("-backend-option");
4521 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4522 }
Eric Christophereec89c22013-06-18 00:03:50 +00004523
Eric Christopher0d403d22014-02-14 01:27:03 +00004524 // -gdwarf-aranges turns on the emission of the aranges section in the
4525 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004526 // Always enabled on the PS4.
4527 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004528 CmdArgs.push_back("-backend-option");
4529 CmdArgs.push_back("-generate-arange-section");
4530 }
4531
David Blaikief36d9ba2014-01-27 18:52:43 +00004532 if (Args.hasFlag(options::OPT_fdebug_types_section,
4533 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004534 CmdArgs.push_back("-backend-option");
4535 CmdArgs.push_back("-generate-type-units");
4536 }
Eric Christophereec89c22013-06-18 00:03:50 +00004537
Dan Gohmana5b804b2016-01-07 00:50:27 +00004538 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4539 // default.
4540 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4541 Triple.getArch() == llvm::Triple::wasm32 ||
4542 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004543
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004544 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004545 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004546 CmdArgs.push_back("-ffunction-sections");
4547 }
4548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004549 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4550 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004551 CmdArgs.push_back("-fdata-sections");
4552 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004553
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004554 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004555 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004556 CmdArgs.push_back("-fno-unique-section-names");
4557
Chris Lattner3c77a352010-06-22 00:03:40 +00004558 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4559
Diego Novilloa0545962015-07-10 18:00:07 +00004560 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004561
Paul Robinsond083b9a2015-12-16 17:25:27 +00004562 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4563 if (getToolChain().getTriple().isPS4CPU())
4564 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4565
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004566 // Pass options for controlling the default header search paths.
4567 if (Args.hasArg(options::OPT_nostdinc)) {
4568 CmdArgs.push_back("-nostdsysteminc");
4569 CmdArgs.push_back("-nobuiltininc");
4570 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004571 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004572 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004573 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4574 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4575 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004576
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004577 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004578 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004579 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004580
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004581 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4582
Ted Kremenekf7639e12012-03-06 20:06:33 +00004583 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004584 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004585 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004586 options::OPT_ccc_arcmt_modify,
4587 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004588 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004589 switch (A->getOption().getID()) {
4590 default:
4591 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004592 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004593 CmdArgs.push_back("-arcmt-check");
4594 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004595 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004596 CmdArgs.push_back("-arcmt-modify");
4597 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004598 case options::OPT_ccc_arcmt_migrate:
4599 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004600 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004601 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004602
4603 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4604 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004605 break;
John McCalld70fb982011-06-15 23:25:17 +00004606 }
4607 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004608 } else {
4609 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4610 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4611 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004612 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004613
Ted Kremenekf7639e12012-03-06 20:06:33 +00004614 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4615 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004616 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4617 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004618 }
4619 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004620 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004621
4622 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004623 options::OPT_objcmt_migrate_subscripting,
4624 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004625 // None specified, means enable them all.
4626 CmdArgs.push_back("-objcmt-migrate-literals");
4627 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004628 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004629 } else {
4630 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4631 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004632 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004633 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004634 } else {
4635 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4636 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4637 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4638 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4639 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4640 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004641 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004642 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4643 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4644 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4645 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4646 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4647 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4648 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004649 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004650 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004651 }
4652
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004653 // Add preprocessing options like -I, -D, etc. if we are using the
4654 // preprocessor.
4655 //
4656 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004657 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004658 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4659 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004660
Rafael Espindolaa7431922011-07-21 23:40:37 +00004661 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4662 // that "The compiler can only warn and ignore the option if not recognized".
4663 // When building with ccache, it will pass -D options to clang even on
4664 // preprocessed inputs and configure concludes that -fPIC is not supported.
4665 Args.ClaimAllArgs(options::OPT_D);
4666
Alp Toker7874bdc2013-11-15 20:40:58 +00004667 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004668 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4669 if (A->getOption().matches(options::OPT_O4)) {
4670 CmdArgs.push_back("-O3");
4671 D.Diag(diag::warn_O4_is_O3);
4672 } else {
4673 A->render(Args, CmdArgs);
4674 }
4675 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004676
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004677 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004678 for (const Arg *A :
4679 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4680 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004681 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004682 }
4683
Rafael Espindola577637a2015-01-03 00:06:04 +00004684 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004685
Richard Smith3be1cb22014-08-07 00:24:21 +00004686 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004687 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004688 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4689 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004690 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004691 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004692
4693 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004694 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004695 //
4696 // If a std is supplied, only add -trigraphs if it follows the
4697 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004698 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004699 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4700 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004701 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004702 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004703 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004704 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004705 else
4706 Std->render(Args, CmdArgs);
4707
Nico Weber00721502014-12-23 22:32:37 +00004708 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004709 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004710 options::OPT_ftrigraphs,
4711 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004712 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004713 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004714 } else {
4715 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004716 //
4717 // FIXME: Clang doesn't correctly handle -std= when the input language
4718 // doesn't match. For the time being just ignore this for C++ inputs;
4719 // eventually we want to do all the standard defaulting here instead of
4720 // splitting it between the driver and clang -cc1.
4721 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004722 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4723 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004724 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004725 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004726
Nico Weber00721502014-12-23 22:32:37 +00004727 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4728 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004729 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004730
Richard Smith282b4492013-09-04 22:50:31 +00004731 // GCC's behavior for -Wwrite-strings is a bit strange:
4732 // * In C, this "warning flag" changes the types of string literals from
4733 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4734 // for the discarded qualifier.
4735 // * In C++, this is just a normal warning flag.
4736 //
4737 // Implementing this warning correctly in C is hard, so we follow GCC's
4738 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4739 // a non-const char* in C, rather than using this crude hack.
4740 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004741 // FIXME: This should behave just like a warning flag, and thus should also
4742 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4743 Arg *WriteStrings =
4744 Args.getLastArg(options::OPT_Wwrite_strings,
4745 options::OPT_Wno_write_strings, options::OPT_w);
4746 if (WriteStrings &&
4747 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004748 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004749 }
4750
Chandler Carruth61fbf622011-04-23 09:27:53 +00004751 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004752 // during C++ compilation, which it is by default. GCC keeps this define even
4753 // in the presence of '-w', match this behavior bug-for-bug.
4754 if (types::isCXX(InputType) &&
4755 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4756 true)) {
4757 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004758 }
4759
Chandler Carruthe0391482010-05-22 02:21:53 +00004760 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4761 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4762 if (Asm->getOption().matches(options::OPT_fasm))
4763 CmdArgs.push_back("-fgnu-keywords");
4764 else
4765 CmdArgs.push_back("-fno-gnu-keywords");
4766 }
4767
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004768 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4769 CmdArgs.push_back("-fno-dwarf-directory-asm");
4770
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004771 if (ShouldDisableAutolink(Args, getToolChain()))
4772 CmdArgs.push_back("-fno-autolink");
4773
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004774 // Add in -fdebug-compilation-dir if necessary.
4775 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004776
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004777 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4778 StringRef Map = A->getValue();
4779 if (Map.find('=') == StringRef::npos)
4780 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4781 else
4782 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4783 A->claim();
4784 }
4785
Richard Smith9a568822011-11-21 19:36:32 +00004786 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4787 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004788 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004789 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004790 }
4791
Richard Smith79c927b2013-11-06 19:31:51 +00004792 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4793 CmdArgs.push_back("-foperator-arrow-depth");
4794 CmdArgs.push_back(A->getValue());
4795 }
4796
Richard Smith9a568822011-11-21 19:36:32 +00004797 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4798 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004799 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004800 }
4801
Richard Smitha3d3bd22013-05-08 02:12:03 +00004802 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4803 CmdArgs.push_back("-fconstexpr-steps");
4804 CmdArgs.push_back(A->getValue());
4805 }
4806
Richard Smithb3a14522013-02-22 01:59:51 +00004807 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4808 CmdArgs.push_back("-fbracket-depth");
4809 CmdArgs.push_back(A->getValue());
4810 }
4811
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004812 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4813 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004814 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004815 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004816 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4817 } else
4818 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004819 }
4820
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004821 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004822 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004823
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004824 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4825 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004826 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004827 }
David Chisnall5778fce2009-08-31 16:41:57 +00004828
Chris Lattnere23003d2010-01-09 21:54:33 +00004829 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4830 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004831 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004832 }
4833
Chris Lattnerb35583d2010-04-07 20:49:23 +00004834 CmdArgs.push_back("-ferror-limit");
4835 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004836 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004837 else
4838 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004839
Chandler Carrutha77a7272010-05-06 04:55:18 +00004840 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4841 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004842 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004843 }
4844
4845 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4846 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004847 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004848 }
4849
Richard Smithf6f003a2011-12-16 19:06:07 +00004850 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4851 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004852 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004853 }
4854
Nick Lewycky24653262014-12-16 21:39:02 +00004855 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4856 CmdArgs.push_back("-fspell-checking-limit");
4857 CmdArgs.push_back(A->getValue());
4858 }
4859
Daniel Dunbar2c978472009-11-04 06:24:47 +00004860 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004861 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004862 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004863 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004864 } else {
4865 // If -fmessage-length=N was not specified, determine whether this is a
4866 // terminal and, if so, implicitly define -fmessage-length appropriately.
4867 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004868 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004869 }
4870
John McCallb4a99d32013-02-19 01:57:35 +00004871 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4872 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4873 options::OPT_fvisibility_ms_compat)) {
4874 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4875 CmdArgs.push_back("-fvisibility");
4876 CmdArgs.push_back(A->getValue());
4877 } else {
4878 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4879 CmdArgs.push_back("-fvisibility");
4880 CmdArgs.push_back("hidden");
4881 CmdArgs.push_back("-ftype-visibility");
4882 CmdArgs.push_back("default");
4883 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004884 }
4885
Douglas Gregor08329632010-06-15 17:05:35 +00004886 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004887
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004888 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4889
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004890 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004891 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4892 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004893 CmdArgs.push_back("-ffreestanding");
4894
Daniel Dunbare357d562009-12-03 18:42:11 +00004895 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004896 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004897 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004898 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004899 // Emulated TLS is enabled by default on Android, and can be enabled manually
4900 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004901 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004902 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4903 EmulatedTLSDefault))
4904 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004905 // AltiVec-like language extensions aren't relevant for assembling.
4906 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004907 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004908 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4909 }
Richard Trieu91844232012-06-26 18:18:47 +00004910 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4911 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004912
Alexey Bataevdb390212015-05-20 04:24:19 +00004913 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004914 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004915 options::OPT_fno_openmp, false)) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004916 switch (getOpenMPRuntime(getToolChain(), Args)) {
4917 case OMPRT_OMP:
4918 case OMPRT_IOMP5:
4919 // Clang can generate useful OpenMP code for these two runtime libraries.
4920 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004921
4922 // If no option regarding the use of TLS in OpenMP codegeneration is
4923 // given, decide a default based on the target. Otherwise rely on the
4924 // options and pass the right information to the frontend.
4925 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004926 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004927 CmdArgs.push_back("-fnoopenmp-use-tls");
Alexey Bataev18c48522016-05-27 04:13:39 +00004928 Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004929 break;
4930 default:
4931 // By default, if Clang doesn't know how to generate useful OpenMP code
4932 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4933 // down to the actual compilation.
4934 // FIXME: It would be better to have a mode which *only* omits IR
4935 // generation based on the OpenMP support so that we get consistent
4936 // semantic analysis, etc.
4937 break;
4938 }
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004939 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004940
Peter Collingbourne32701642013-11-01 18:16:25 +00004941 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004942 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004943
Eric Christopher459d2712013-02-19 06:16:53 +00004944 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004945 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4946 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4947 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4948 Arch == llvm::Triple::ppc64le))
4949 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4950 << "ppc/ppc64/ppc64le";
4951 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004952
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004953 // -fzvector is incompatible with -faltivec.
4954 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4955 if (Args.hasArg(options::OPT_faltivec))
4956 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4957 << "-faltivec";
4958
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004959 if (getToolChain().SupportsProfiling())
4960 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004961
4962 // -flax-vector-conversions is default.
4963 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4964 options::OPT_fno_lax_vector_conversions))
4965 CmdArgs.push_back("-fno-lax-vector-conversions");
4966
John Brawna7b4ec02015-08-10 11:11:28 +00004967 if (Args.getLastArg(options::OPT_fapple_kext) ||
4968 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004969 CmdArgs.push_back("-fapple-kext");
4970
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004971 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004972 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004973 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004974 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4975 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004976
4977 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4978 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004979 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004980 }
4981
Bob Wilson14adb362012-02-03 06:27:22 +00004982 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004983
Chandler Carruth6e501032011-03-27 00:04:55 +00004984 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4985 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004986 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004987 if (A->getOption().matches(options::OPT_fwrapv))
4988 CmdArgs.push_back("-fwrapv");
4989 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4990 options::OPT_fno_strict_overflow)) {
4991 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4992 CmdArgs.push_back("-fwrapv");
4993 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004994
4995 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4996 options::OPT_fno_reroll_loops))
4997 if (A->getOption().matches(options::OPT_freroll_loops))
4998 CmdArgs.push_back("-freroll-loops");
4999
Daniel Dunbar3a148f22009-04-07 21:51:40 +00005000 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00005001 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
5002 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005003
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00005004 Args.AddLastArg(CmdArgs, options::OPT_pthread);
5005
Daniel Dunbar4930e332009-11-17 08:07:36 +00005006 // -stack-protector=0 is default.
5007 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00005008 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
5009 options::OPT_fstack_protector_all,
5010 options::OPT_fstack_protector_strong,
5011 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00005012 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005013 StackProtectorLevel = std::max<unsigned>(
5014 LangOptions::SSPOn,
5015 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00005016 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00005017 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00005018 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00005019 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00005020 } else {
5021 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005022 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00005023 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00005024 if (StackProtectorLevel) {
5025 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005026 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005027 }
Chad Rosierdb3da832012-08-21 16:16:06 +00005028
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005029 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00005030 for (const Arg *A : Args.filtered(options::OPT__param)) {
5031 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005032 if (Str.startswith("ssp-buffer-size=")) {
5033 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00005034 CmdArgs.push_back("-stack-protector-buffer-size");
5035 // FIXME: Verify the argument is a valid integer.
5036 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00005037 }
Sean Silva14facf32015-06-09 01:57:17 +00005038 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00005039 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00005040 }
5041
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005042 // Translate -mstackrealign
5043 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00005044 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005045 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005046
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00005047 if (Args.hasArg(options::OPT_mstack_alignment)) {
5048 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
5049 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00005050 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00005051
Hans Wennborg77dc2362015-01-20 19:45:50 +00005052 if (Args.hasArg(options::OPT_mstack_probe_size)) {
5053 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
5054
5055 if (!Size.empty())
5056 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
5057 else
5058 CmdArgs.push_back("-mstack-probe-size=0");
5059 }
5060
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005061 switch (getToolChain().getArch()) {
5062 case llvm::Triple::aarch64:
5063 case llvm::Triple::aarch64_be:
5064 case llvm::Triple::arm:
5065 case llvm::Triple::armeb:
5066 case llvm::Triple::thumb:
5067 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005068 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005069 break;
5070
5071 default:
5072 break;
5073 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005074
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005075 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
5076 options::OPT_mno_restrict_it)) {
5077 if (A->getOption().matches(options::OPT_mrestrict_it)) {
5078 CmdArgs.push_back("-backend-option");
5079 CmdArgs.push_back("-arm-restrict-it");
5080 } else {
5081 CmdArgs.push_back("-backend-option");
5082 CmdArgs.push_back("-arm-no-restrict-it");
5083 }
James Y Knight2db38f32015-08-15 03:45:25 +00005084 } else if (Triple.isOSWindows() &&
5085 (Triple.getArch() == llvm::Triple::arm ||
5086 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00005087 // Windows on ARM expects restricted IT blocks
5088 CmdArgs.push_back("-backend-option");
5089 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005090 }
5091
Daniel Dunbard18049a2009-04-07 21:16:11 +00005092 // Forward -f options with positive and negative forms; we translate
5093 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00005094 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5095 StringRef fname = A->getValue();
5096 if (!llvm::sys::fs::exists(fname))
5097 D.Diag(diag::err_drv_no_such_file) << fname;
5098 else
5099 A->render(Args, CmdArgs);
5100 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005101
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005102 // -fbuiltin is default unless -mkernel is used.
5103 bool UseBuiltins =
5104 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5105 !Args.hasArg(options::OPT_mkernel));
5106 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005107 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005108
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005109 // -ffreestanding implies -fno-builtin.
5110 if (Args.hasArg(options::OPT_ffreestanding))
5111 UseBuiltins = false;
5112
5113 // Process the -fno-builtin-* options.
5114 for (const auto &Arg : Args) {
5115 const Option &O = Arg->getOption();
5116 if (!O.matches(options::OPT_fno_builtin_))
5117 continue;
5118
5119 Arg->claim();
5120 // If -fno-builtin is specified, then there's no need to pass the option to
5121 // the frontend.
5122 if (!UseBuiltins)
5123 continue;
5124
5125 StringRef FuncName = Arg->getValue();
5126 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5127 }
5128
Nuno Lopes13c88c72009-12-16 16:59:22 +00005129 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5130 options::OPT_fno_assume_sane_operator_new))
5131 CmdArgs.push_back("-fno-assume-sane-operator-new");
5132
Daniel Dunbar4930e332009-11-17 08:07:36 +00005133 // -fblocks=0 is default.
5134 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005135 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005136 (Args.hasArg(options::OPT_fgnu_runtime) &&
5137 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5138 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005139 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005141 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005142 !getToolChain().hasBlocksRuntime())
5143 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005144 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005145
Richard Smith47972af2015-06-16 00:08:24 +00005146 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005147 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005148 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005149 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005150 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005151 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5152 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005153 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005154 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005155 HaveModules = true;
5156 }
5157 }
5158
Richard Smith47972af2015-06-16 00:08:24 +00005159 // -fmodule-maps enables implicit reading of module map files. By default,
5160 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005161 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5162 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005163 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005164 }
5165
Daniel Jasperac42b752013-10-21 06:34:34 +00005166 // -fmodules-decluse checks that modules used are declared so (off by
5167 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005168 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005170 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005171 }
5172
Daniel Jasper962b38e2014-04-11 11:47:45 +00005173 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5174 // all #included headers are part of modules.
5175 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005176 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005177 CmdArgs.push_back("-fmodules-strict-decluse");
5178 }
5179
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005180 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5181 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5182 options::OPT_fno_implicit_modules)) {
5183 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005184 } else if (HaveModules) {
5185 // -fmodule-cache-path specifies where our implicitly-built module files
5186 // should be written.
5187 SmallString<128> Path;
5188 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5189 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005190 if (C.isForDiagnostics()) {
5191 // When generating crash reports, we want to emit the modules along with
5192 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005193 Path = Output.getFilename();
5194 llvm::sys::path::replace_extension(Path, ".cache");
5195 llvm::sys::path::append(Path, "modules");
5196 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005197 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005198 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005199 llvm::sys::path::append(Path, "org.llvm.clang.");
5200 appendUserToPath(Path);
5201 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005202 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005203 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005204 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5205 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005206 }
5207
Richard Smith8d83d6d2016-03-21 19:06:06 +00005208 // -fmodule-name specifies the module that is currently being built (or
5209 // used for header checking by -fmodule-maps).
5210 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5211
5212 // -fmodule-map-file can be used to specify files containing module
5213 // definitions.
5214 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5215
5216 // -fmodule-file can be used to specify files containing precompiled modules.
5217 if (HaveModules)
5218 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5219 else
5220 Args.ClaimAllArgs(options::OPT_fmodule_file);
5221
Justin Bognera88f0122014-06-20 22:59:50 +00005222 // When building modules and generating crashdumps, we need to dump a module
5223 // dependency VFS alongside the output.
5224 if (HaveModules && C.isForDiagnostics()) {
5225 SmallString<128> VFSDir(Output.getFilename());
5226 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005227 // Add the cache directory as a temp so the crash diagnostics pick it up.
5228 C.addTempFile(Args.MakeArgString(VFSDir));
5229
Justin Bognera88f0122014-06-20 22:59:50 +00005230 llvm::sys::path::append(VFSDir, "vfs");
5231 CmdArgs.push_back("-module-dependency-dir");
5232 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005233 }
5234
Richard Smith9887d792014-10-17 01:42:53 +00005235 if (HaveModules)
5236 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005237
Douglas Gregor35b04d62013-02-07 19:01:24 +00005238 // Pass through all -fmodules-ignore-macro arguments.
5239 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005240 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5241 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005242
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005243 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5244
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005245 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5246 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5247 D.Diag(diag::err_drv_argument_not_allowed_with)
5248 << A->getAsString(Args) << "-fbuild-session-timestamp";
5249
5250 llvm::sys::fs::file_status Status;
5251 if (llvm::sys::fs::status(A->getValue(), Status))
5252 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005253 CmdArgs.push_back(Args.MakeArgString(
5254 "-fbuild-session-timestamp=" +
5255 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005256 }
5257
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005258 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005259 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5260 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005261 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5262
5263 Args.AddLastArg(CmdArgs,
5264 options::OPT_fmodules_validate_once_per_build_session);
5265 }
5266
Ben Langmuirdcf73862014-03-12 00:06:17 +00005267 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5268
John McCalldfea9982010-04-09 19:12:06 +00005269 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005270 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005271 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005272 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005273
Anders Carlssond470fef2010-11-21 00:09:52 +00005274 // -felide-constructors is the default.
5275 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005276 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005277 CmdArgs.push_back("-fno-elide-constructors");
5278
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005279 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005280
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005281 if (KernelOrKext || (types::isCXX(InputType) &&
5282 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5283 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005284 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005285
Tony Linthicum76329bf2011-12-12 21:14:55 +00005286 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005287 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5288 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005289 CmdArgs.push_back("-fshort-enums");
5290
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005291 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005292 if (Arg *A = Args.getLastArg(
5293 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5294 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5295 if (A->getOption().matches(options::OPT_funsigned_char) ||
5296 A->getOption().matches(options::OPT_fno_signed_char)) {
5297 CmdArgs.push_back("-fno-signed-char");
5298 }
5299 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005300 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005301 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005302
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005303 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005304 if (!Args.hasFlag(
5305 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5306 !IsWindowsCygnus && !IsWindowsGNU &&
5307 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5308 getToolChain().getArch() != llvm::Triple::hexagon &&
5309 getToolChain().getArch() != llvm::Triple::xcore &&
5310 ((getToolChain().getTriple().getVendor() !=
5311 llvm::Triple::MipsTechnologies) ||
5312 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005313 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005314 CmdArgs.push_back("-fno-use-cxa-atexit");
5315
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005316 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005317 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005318 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005319 CmdArgs.push_back("-fms-extensions");
5320
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005321 // -fno-use-line-directives is default.
5322 if (Args.hasFlag(options::OPT_fuse_line_directives,
5323 options::OPT_fno_use_line_directives, false))
5324 CmdArgs.push_back("-fuse-line-directives");
5325
Francois Pichet1b4f1632011-09-17 04:32:15 +00005326 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005327 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005328 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005329 (IsWindowsMSVC &&
5330 Args.hasFlag(options::OPT_fms_extensions,
5331 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005332 CmdArgs.push_back("-fms-compatibility");
5333
David Majnemerc371ff02015-03-22 08:39:22 +00005334 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005335 VersionTuple MSVT = visualstudio::getMSVCVersion(
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00005336 &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +00005337 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005338 CmdArgs.push_back(
5339 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005340
David Majnemer8db91762015-05-18 04:49:30 +00005341 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5342 if (ImplyVCPPCXXVer) {
5343 if (IsMSVC2015Compatible)
5344 CmdArgs.push_back("-std=c++14");
5345 else
5346 CmdArgs.push_back("-std=c++11");
5347 }
5348
Eric Christopher5ecce122013-02-18 00:38:31 +00005349 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005350 if (Args.hasFlag(options::OPT_fborland_extensions,
5351 options::OPT_fno_borland_extensions, false))
5352 CmdArgs.push_back("-fborland-extensions");
5353
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005354 // -fno-declspec is default, except for PS4.
5355 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5356 getToolChain().getTriple().isPS4()))
5357 CmdArgs.push_back("-fdeclspec");
5358 else if (Args.hasArg(options::OPT_fno_declspec))
5359 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5360
David Majnemerc371ff02015-03-22 08:39:22 +00005361 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5362 // than 19.
5363 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5364 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005365 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005366 CmdArgs.push_back("-fno-threadsafe-statics");
5367
Francois Pichet02744872011-09-01 16:38:08 +00005368 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5369 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005370 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005371 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005372 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005373
Chandler Carruthe03aa552010-04-17 20:17:31 +00005374 // -fgnu-keywords default varies depending on language; only pass if
5375 // specified.
5376 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005377 options::OPT_fno_gnu_keywords))
5378 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005379
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005380 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005381 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005382 CmdArgs.push_back("-fgnu89-inline");
5383
Chad Rosier9c76d242012-03-15 22:31:42 +00005384 if (Args.hasArg(options::OPT_fno_inline))
5385 CmdArgs.push_back("-fno-inline");
5386
Hans Wennborg7a008882016-05-24 20:40:51 +00005387 if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
5388 options::OPT_fno_inline_functions))
5389 InlineArg->render(Args, CmdArgs);
Chad Rosier80603182012-03-06 18:49:20 +00005390
John McCall5fb5df92012-06-20 06:18:46 +00005391 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005392
John McCall5fb5df92012-06-20 06:18:46 +00005393 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005394 // legacy is the default. Except for deployment taget of 10.5,
5395 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5396 // gets ignored silently.
5397 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005398 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5399 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005400 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005401 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005402 if (getToolChain().UseObjCMixedDispatch())
5403 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5404 else
5405 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5406 }
5407 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005408
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005409 // When ObjectiveC legacy runtime is in effect on MacOSX,
5410 // turn on the option to do Array/Dictionary subscripting
5411 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005412 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005413 getToolChain().getTriple().isMacOSX() &&
5414 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5415 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005416 objcRuntime.isNeXTFamily())
5417 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005418
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005419 // -fencode-extended-block-signature=1 is default.
5420 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5421 CmdArgs.push_back("-fencode-extended-block-signature");
5422 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005423
John McCall24fc0de2011-07-06 00:26:06 +00005424 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5425 // NOTE: This logic is duplicated in ToolChains.cpp.
5426 bool ARC = isObjCAutoRefCount(Args);
5427 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005428 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005429
John McCall24fc0de2011-07-06 00:26:06 +00005430 CmdArgs.push_back("-fobjc-arc");
5431
Chandler Carruth491db322011-11-04 07:34:47 +00005432 // FIXME: It seems like this entire block, and several around it should be
5433 // wrapped in isObjC, but for now we just use it here as this is where it
5434 // was being used previously.
5435 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5436 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5437 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5438 else
5439 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5440 }
5441
John McCall24fc0de2011-07-06 00:26:06 +00005442 // Allow the user to enable full exceptions code emission.
5443 // We define off for Objective-CC, on for Objective-C++.
5444 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5445 options::OPT_fno_objc_arc_exceptions,
5446 /*default*/ types::isCXX(InputType)))
5447 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005448
John McCall24fc0de2011-07-06 00:26:06 +00005449 }
5450
5451 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5452 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005453 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005454 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005455
John McCall24fc0de2011-07-06 00:26:06 +00005456 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5457 // takes precedence.
5458 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5459 if (!GCArg)
5460 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5461 if (GCArg) {
5462 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005463 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005464 } else if (getToolChain().SupportsObjCGC()) {
5465 GCArg->render(Args, CmdArgs);
5466 } else {
5467 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005468 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005469 }
5470 }
5471
John McCallfbe5ed72015-11-05 19:19:56 +00005472 // Pass down -fobjc-weak or -fno-objc-weak if present.
5473 if (types::isObjC(InputType)) {
5474 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5475 options::OPT_fno_objc_weak);
5476 if (!WeakArg) {
5477 // nothing to do
5478 } else if (GCArg) {
5479 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5480 D.Diag(diag::err_objc_weak_with_gc);
5481 } else if (!objcRuntime.allowsWeak()) {
5482 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5483 D.Diag(diag::err_objc_weak_unsupported);
5484 } else {
5485 WeakArg->render(Args, CmdArgs);
5486 }
5487 }
5488
Bob Wilsonb111ec92015-03-02 19:01:14 +00005489 if (Args.hasFlag(options::OPT_fapplication_extension,
5490 options::OPT_fno_application_extension, false))
5491 CmdArgs.push_back("-fapplication-extension");
5492
Reid Klecknerc542d372014-06-27 17:02:02 +00005493 // Handle GCC-style exception args.
5494 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005495 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5496 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005497
Tim Northovere931f9f2015-10-30 16:30:41 +00005498 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005499 CmdArgs.push_back("-fsjlj-exceptions");
5500
5501 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005502 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5503 options::OPT_fno_assume_sane_operator_new))
5504 CmdArgs.push_back("-fno-assume-sane-operator-new");
5505
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005506 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5507 // most platforms.
5508 if (Args.hasFlag(options::OPT_fsized_deallocation,
5509 options::OPT_fno_sized_deallocation, false))
5510 CmdArgs.push_back("-fsized-deallocation");
5511
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005512 // -fconstant-cfstrings is default, and may be subject to argument translation
5513 // on Darwin.
5514 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5515 options::OPT_fno_constant_cfstrings) ||
5516 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5517 options::OPT_mno_constant_cfstrings))
5518 CmdArgs.push_back("-fno-constant-cfstrings");
5519
John Thompsoned4e2952009-11-05 20:14:16 +00005520 // -fshort-wchar default varies depending on platform; only
5521 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005522 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5523 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005524 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005525
Hans Wennborg28c96312013-07-31 23:39:13 +00005526 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005527 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005528 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005529 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005530
Daniel Dunbar096ed292011-10-05 21:04:55 +00005531 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5532 // -fno-pack-struct doesn't apply to -fpack-struct=.
5533 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005534 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005535 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005536 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005537 } else if (Args.hasFlag(options::OPT_fpack_struct,
5538 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005539 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005540 }
5541
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005542 // Handle -fmax-type-align=N and -fno-type-align
5543 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5544 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5545 if (!SkipMaxTypeAlign) {
5546 std::string MaxTypeAlignStr = "-fmax-type-align=";
5547 MaxTypeAlignStr += A->getValue();
5548 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5549 }
5550 } else if (getToolChain().getTriple().isOSDarwin()) {
5551 if (!SkipMaxTypeAlign) {
5552 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5553 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5554 }
5555 }
5556
John Brawna7b4ec02015-08-10 11:11:28 +00005557 // -fcommon is the default unless compiling kernel code or the target says so
5558 bool NoCommonDefault =
5559 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5560 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5561 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005562 CmdArgs.push_back("-fno-common");
5563
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005564 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005565 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005566 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005567 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005568 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005569 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005570
Daniel Dunbar6358d682010-10-15 22:30:42 +00005571 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005572 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005573 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005574 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005575
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005576 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5578 StringRef value = inputCharset->getValue();
5579 if (value != "UTF-8")
5580 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5581 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005582 }
5583
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005584 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005585 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5586 StringRef value = execCharset->getValue();
5587 if (value != "UTF-8")
5588 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5589 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005590 }
5591
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005592 // -fcaret-diagnostics is default.
5593 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5594 options::OPT_fno_caret_diagnostics, true))
5595 CmdArgs.push_back("-fno-caret-diagnostics");
5596
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005597 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005598 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005599 options::OPT_fno_diagnostics_fixit_info))
5600 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005601
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005602 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005603 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005604 options::OPT_fno_diagnostics_show_option))
5605 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005606
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005607 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005608 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005609 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005610 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005611 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005613 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005614 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005615 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005616 }
5617
Chandler Carruthb6766f02011-03-27 01:50:55 +00005618 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005619 options::OPT_fdiagnostics_show_note_include_stack,
5620 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005621 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005622 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005623 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5624 else
5625 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5626 }
5627
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005628 // Color diagnostics are parsed by the driver directly from argv
5629 // and later re-parsed to construct this job; claim any possible
5630 // color diagnostic here to avoid warn_drv_unused_argument and
5631 // diagnose bad OPT_fdiagnostics_color_EQ values.
5632 for (Arg *A : Args) {
5633 const Option &O = A->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005634 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5635 !O.matches(options::OPT_fdiagnostics_color) &&
5636 !O.matches(options::OPT_fno_color_diagnostics) &&
5637 !O.matches(options::OPT_fno_diagnostics_color) &&
5638 !O.matches(options::OPT_fdiagnostics_color_EQ))
5639 continue;
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005640 if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
5641 StringRef Value(A->getValue());
5642 if (Value != "always" && Value != "never" && Value != "auto")
Nico Weber7e2da792013-04-17 21:52:44 +00005643 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005644 << ("-fdiagnostics-color=" + Value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005645 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005646 A->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005647 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005648 if (D.getDiags().getDiagnosticOptions().ShowColors)
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005649 CmdArgs.push_back("-fcolor-diagnostics");
5650
Nico Rieck7857d462013-09-11 00:38:02 +00005651 if (Args.hasArg(options::OPT_fansi_escape_codes))
5652 CmdArgs.push_back("-fansi-escape-codes");
5653
Daniel Dunbardb097022009-06-08 21:13:54 +00005654 if (!Args.hasFlag(options::OPT_fshow_source_location,
5655 options::OPT_fno_show_source_location))
5656 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005657
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005658 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005659 true))
5660 CmdArgs.push_back("-fno-show-column");
5661
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005662 if (!Args.hasFlag(options::OPT_fspell_checking,
5663 options::OPT_fno_spell_checking))
5664 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005665
Chad Rosierc8e56e82012-12-05 21:08:21 +00005666 // -fno-asm-blocks is default.
5667 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5668 false))
5669 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005670
Steven Wucb0d13f2015-01-16 23:05:28 +00005671 // -fgnu-inline-asm is default.
5672 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5673 options::OPT_fno_gnu_inline_asm, true))
5674 CmdArgs.push_back("-fno-gnu-inline-asm");
5675
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005676 // Enable vectorization per default according to the optimization level
5677 // selected. For optimization levels that want vectorization we use the alias
5678 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005679 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005680 OptSpecifier VectorizeAliasOption =
5681 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005682 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005683 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005684 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005685
Chad Rosier136d67d2014-04-28 19:30:57 +00005686 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005687 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005688 OptSpecifier SLPVectAliasOption =
5689 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005690 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005691 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005692 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005693
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005694 // -fno-slp-vectorize-aggressive is default.
5695 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005696 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005697 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005698
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005699 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5700 A->render(Args, CmdArgs);
5701
Filipe Cabecinhasab731f72016-05-12 16:51:36 +00005702 if (Arg *A = Args.getLastArg(
5703 options::OPT_fsanitize_undefined_strip_path_components_EQ))
5704 A->render(Args, CmdArgs);
5705
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005706 // -fdollars-in-identifiers default varies depending on platform and
5707 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005708 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005709 options::OPT_fno_dollars_in_identifiers)) {
5710 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005711 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005712 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005713 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005714 }
5715
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005716 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5717 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005718 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005719 options::OPT_fno_unit_at_a_time)) {
5720 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005721 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005722 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005723
Eli Friedman055c9702011-11-02 01:53:16 +00005724 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5725 options::OPT_fno_apple_pragma_pack, false))
5726 CmdArgs.push_back("-fapple-pragma-pack");
5727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005728 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005729 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5730 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005731 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005732 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005733 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005734
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005735// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5736//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005737// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005738#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005739 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005740 (getToolChain().getArch() == llvm::Triple::arm ||
5741 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005742 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5743 CmdArgs.push_back("-fno-builtin-strcat");
5744 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5745 CmdArgs.push_back("-fno-builtin-strcpy");
5746 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005747#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005748
Justin Bognera88f0122014-06-20 22:59:50 +00005749 // Enable rewrite includes if the user's asked for it or if we're generating
5750 // diagnostics.
5751 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5752 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005753 if (Args.hasFlag(options::OPT_frewrite_includes,
5754 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005755 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005756 CmdArgs.push_back("-frewrite-includes");
5757
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005758 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005759 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005760 options::OPT_traditional_cpp)) {
5761 if (isa<PreprocessJobAction>(JA))
5762 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005763 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005764 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005765 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005766
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005767 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005768 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005769
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005770 // Handle serialized diagnostics.
5771 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5772 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005773 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005774 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005775
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005776 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5777 CmdArgs.push_back("-fretain-comments-from-system-headers");
5778
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005779 // Forward -fcomment-block-commands to -cc1.
5780 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005781 // Forward -fparse-all-comments to -cc1.
5782 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005783
John Brawnad31ace2015-09-23 13:55:40 +00005784 // Turn -fplugin=name.so into -load name.so
5785 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5786 CmdArgs.push_back("-load");
5787 CmdArgs.push_back(A->getValue());
5788 A->claim();
5789 }
5790
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005791 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5792 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005793 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005794 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5795 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005796
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005797 // We translate this by hand to the -cc1 argument, since nightly test uses
5798 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005799 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005800 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005801 } else
Sean Silva14facf32015-06-09 01:57:17 +00005802 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005803 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005804
Bob Wilson23a55f12014-12-21 07:00:00 +00005805 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005806 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5807 // by the frontend.
Steven Wu27fb5222016-05-11 16:26:03 +00005808 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
5809 // has slightly different breakdown between stages.
5810 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
5811 // pristine IR generated by the frontend. Ideally, a new compile action should
5812 // be added so both IR can be captured.
5813 if (C.getDriver().isSaveTempsEnabled() &&
5814 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Steven Wu546a1962015-07-17 20:09:56 +00005815 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005816
Daniel Dunbard67a3222009-03-30 06:36:42 +00005817 if (Output.getType() == types::TY_Dependencies) {
5818 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005819 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005820 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005821 CmdArgs.push_back(Output.getFilename());
5822 } else {
5823 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005824 }
5825
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005826 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005827
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005828 if (Input.isFilename())
5829 CmdArgs.push_back(Input.getFilename());
5830 else
5831 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005832
Chris Lattnere9d7d782009-11-03 19:50:27 +00005833 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5834
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005835 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005836
5837 // Optionally embed the -cc1 level arguments into the debug info, for build
5838 // analysis.
5839 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005840 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005841 for (const auto &Arg : Args)
5842 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005843
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005844 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005845 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005846 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005847 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005848 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005849 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005850 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005851 }
5852 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005853 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005854 }
5855
Eric Christopherd3804002013-02-22 20:12:52 +00005856 // Add the split debug info name to the command lines here so we
5857 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005858 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5860 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005861 const char *SplitDwarfOut;
5862 if (SplitDwarf) {
5863 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005864 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005865 CmdArgs.push_back(SplitDwarfOut);
5866 }
5867
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005868 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5869 // Include them with -fcuda-include-gpubinary.
5870 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005871 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005872 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005873 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005874 }
5875
Peter Collingbourne3afb2662016-04-28 17:09:37 +00005876 bool WholeProgramVTables =
5877 Args.hasFlag(options::OPT_fwhole_program_vtables,
5878 options::OPT_fno_whole_program_vtables, false);
5879 if (WholeProgramVTables) {
5880 if (!D.isUsingLTO())
5881 D.Diag(diag::err_drv_argument_only_allowed_with)
5882 << "-fwhole-program-vtables"
5883 << "-flto";
5884 CmdArgs.push_back("-fwhole-program-vtables");
5885 }
5886
Eric Christopherd3804002013-02-22 20:12:52 +00005887 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005888 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005889 Output.getType() == types::TY_Object &&
5890 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005891 auto CLCommand =
5892 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005893 C.addCommand(llvm::make_unique<FallbackCommand>(
5894 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005895 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5896 isa<PrecompileJobAction>(JA)) {
5897 // In /fallback builds, run the main compilation even if the pch generation
5898 // fails, so that the main compilation's fallback to cl.exe runs.
5899 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5900 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005901 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005902 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005903 }
5904
Eric Christopherf1545832013-02-22 23:50:16 +00005905 // Handle the debug info splitting at object creation time if we're
5906 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005907 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005908 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005909 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005910
Roman Divacky178e01602011-02-10 16:52:03 +00005911 if (Arg *A = Args.getLastArg(options::OPT_pg))
5912 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005913 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5914 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005915
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005916 // Claim some arguments which clang supports automatically.
5917
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005918 // -fpch-preprocess is used with gcc to add a special marker in the output to
5919 // include the PCH file. Clang's PTH solution is completely transparent, so we
5920 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005921 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005922
Daniel Dunbar17731772009-03-23 19:03:36 +00005923 // Claim some arguments which clang doesn't support, but we don't
5924 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005925 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5926 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005927
Rafael Espindolab0092d72013-09-04 19:37:35 +00005928 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005929 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005930}
5931
John McCall5fb5df92012-06-20 06:18:46 +00005932/// Add options related to the Objective-C runtime/ABI.
5933///
5934/// Returns true if the runtime is non-fragile.
5935ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5936 ArgStringList &cmdArgs,
5937 RewriteKind rewriteKind) const {
5938 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005939 Arg *runtimeArg =
5940 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5941 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005942
5943 // Just forward -fobjc-runtime= to the frontend. This supercedes
5944 // options about fragility.
5945 if (runtimeArg &&
5946 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5947 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005948 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005949 if (runtime.tryParse(value)) {
5950 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005951 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005952 }
5953
5954 runtimeArg->render(args, cmdArgs);
5955 return runtime;
5956 }
5957
5958 // Otherwise, we'll need the ABI "version". Version numbers are
5959 // slightly confusing for historical reasons:
5960 // 1 - Traditional "fragile" ABI
5961 // 2 - Non-fragile ABI, version 1
5962 // 3 - Non-fragile ABI, version 2
5963 unsigned objcABIVersion = 1;
5964 // If -fobjc-abi-version= is present, use that to set the version.
5965 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005966 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005967 if (value == "1")
5968 objcABIVersion = 1;
5969 else if (value == "2")
5970 objcABIVersion = 2;
5971 else if (value == "3")
5972 objcABIVersion = 3;
5973 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005975 } else {
5976 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005977 bool nonFragileABIIsDefault =
5978 (rewriteKind == RK_NonFragile ||
5979 (rewriteKind == RK_None &&
5980 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005981 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5982 options::OPT_fno_objc_nonfragile_abi,
5983 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005984// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005985#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5986 unsigned nonFragileABIVersion = 1;
5987#else
5988 unsigned nonFragileABIVersion = 2;
5989#endif
5990
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005991 if (Arg *abiArg =
5992 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005993 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005994 if (value == "1")
5995 nonFragileABIVersion = 1;
5996 else if (value == "2")
5997 nonFragileABIVersion = 2;
5998 else
5999 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006000 << value;
John McCall5fb5df92012-06-20 06:18:46 +00006001 }
6002
6003 objcABIVersion = 1 + nonFragileABIVersion;
6004 } else {
6005 objcABIVersion = 1;
6006 }
6007 }
6008
6009 // We don't actually care about the ABI version other than whether
6010 // it's non-fragile.
6011 bool isNonFragile = objcABIVersion != 1;
6012
6013 // If we have no runtime argument, ask the toolchain for its default runtime.
6014 // However, the rewriter only really supports the Mac runtime, so assume that.
6015 ObjCRuntime runtime;
6016 if (!runtimeArg) {
6017 switch (rewriteKind) {
6018 case RK_None:
6019 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6020 break;
6021 case RK_Fragile:
6022 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
6023 break;
6024 case RK_NonFragile:
6025 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6026 break;
6027 }
6028
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006029 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006030 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
6031 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006032 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00006033 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6034
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006035 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00006036 } else {
6037 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6038 }
6039
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006040 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006041 } else {
6042 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00006043 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00006044 // non-fragile mode or the GCC runtime in fragile mode.
6045 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006046 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00006047 else
6048 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00006049 }
6050
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006051 cmdArgs.push_back(
6052 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00006053 return runtime;
6054}
6055
Reid Klecknerc542d372014-06-27 17:02:02 +00006056static bool maybeConsumeDash(const std::string &EH, size_t &I) {
6057 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
6058 I += HaveDash;
6059 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00006060}
Reid Klecknerc542d372014-06-27 17:02:02 +00006061
Benjamin Kramere003ca22015-10-28 13:54:16 +00006062namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00006063struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00006064 bool Synch = false;
6065 bool Asynch = false;
6066 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00006067};
Benjamin Kramere003ca22015-10-28 13:54:16 +00006068} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00006069
6070/// /EH controls whether to run destructor cleanups when exceptions are
6071/// thrown. There are three modifiers:
6072/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
6073/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
6074/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00006075/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00006076/// The default is /EHs-c-, meaning cleanups are disabled.
6077static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
6078 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006079
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006080 std::vector<std::string> EHArgs =
6081 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00006082 for (auto EHVal : EHArgs) {
6083 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
6084 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006085 case 'a':
6086 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006087 if (EH.Asynch)
6088 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006089 continue;
6090 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00006091 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006092 continue;
6093 case 's':
6094 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006095 if (EH.Synch)
6096 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006097 continue;
6098 default:
6099 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006100 }
6101 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6102 break;
6103 }
6104 }
David Majnemerb8809092016-02-20 09:23:44 +00006105 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006106 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006107 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006108 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6109 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006110 EH.Synch = true;
6111 EH.NoUnwindC = true;
6112 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006113
Reid Klecknerc542d372014-06-27 17:02:02 +00006114 return EH;
6115}
6116
David Majnemercd5855e2016-02-29 01:40:36 +00006117void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6118 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006119 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006120 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006121 unsigned RTOptionID = options::OPT__SLASH_MT;
6122
Hans Wennborgf1a74252013-09-10 20:18:04 +00006123 if (Args.hasArg(options::OPT__SLASH_LDd))
6124 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6125 // but defining _DEBUG is sticky.
6126 RTOptionID = options::OPT__SLASH_MTd;
6127
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006128 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006129 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006130
David Majnemere2afb472015-07-24 06:49:13 +00006131 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006132 switch (RTOptionID) {
6133 case options::OPT__SLASH_MD:
6134 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006135 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006136 CmdArgs.push_back("-D_MT");
6137 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006138 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006139 break;
6140 case options::OPT__SLASH_MDd:
6141 CmdArgs.push_back("-D_DEBUG");
6142 CmdArgs.push_back("-D_MT");
6143 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006144 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006145 break;
6146 case options::OPT__SLASH_MT:
6147 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006148 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006149 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006150 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006151 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006152 break;
6153 case options::OPT__SLASH_MTd:
6154 CmdArgs.push_back("-D_DEBUG");
6155 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006156 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006157 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006158 break;
6159 default:
6160 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006161 }
6162
David Majnemere2afb472015-07-24 06:49:13 +00006163 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6164 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6165 } else {
6166 CmdArgs.push_back(FlagForCRT.data());
6167
6168 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6169 // users want. The /Za flag to cl.exe turns this off, but it's not
6170 // implemented in clang.
6171 CmdArgs.push_back("--dependent-lib=oldnames");
6172 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006173
Hans Wennborg8858a032014-07-21 23:42:07 +00006174 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6175 // would produce interleaved output, so ignore /showIncludes in such cases.
6176 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6177 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6178 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006179
David Majnemerf6072342014-07-01 22:24:56 +00006180 // This controls whether or not we emit RTTI data for polymorphic types.
6181 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6182 /*default=*/false))
6183 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006184
Reid Kleckner124955a2015-08-05 18:51:13 +00006185 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006186 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006187 if (*EmitCodeView)
6188 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006189 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006190 CmdArgs.push_back("-gcodeview");
6191
Reid Klecknerc542d372014-06-27 17:02:02 +00006192 const Driver &D = getToolChain().getDriver();
6193 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006194 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006195 if (types::isCXX(InputType))
6196 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006197 CmdArgs.push_back("-fexceptions");
6198 }
David Majnemercd5855e2016-02-29 01:40:36 +00006199 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6200 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006201
Hans Wennborge50cec32014-06-13 20:59:54 +00006202 // /EP should expand to -E -P.
6203 if (Args.hasArg(options::OPT__SLASH_EP)) {
6204 CmdArgs.push_back("-E");
6205 CmdArgs.push_back("-P");
6206 }
6207
David Majnemera5b195a2015-02-14 01:35:12 +00006208 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006209 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6210 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006211 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6212 else
6213 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6214
6215 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6216 VolatileOptionID = A->getOption().getID();
6217
6218 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6219 CmdArgs.push_back("-fms-volatile");
6220
David Majnemer86c318f2014-02-11 21:05:00 +00006221 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6222 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6223 if (MostGeneralArg && BestCaseArg)
6224 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6225 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6226
6227 if (MostGeneralArg) {
6228 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6229 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6230 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6231
6232 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6233 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6234 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6235 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6236 << FirstConflict->getAsString(Args)
6237 << SecondConflict->getAsString(Args);
6238
6239 if (SingleArg)
6240 CmdArgs.push_back("-fms-memptr-rep=single");
6241 else if (MultipleArg)
6242 CmdArgs.push_back("-fms-memptr-rep=multiple");
6243 else
6244 CmdArgs.push_back("-fms-memptr-rep=virtual");
6245 }
6246
Alexey Bataeva7547182016-05-18 09:06:38 +00006247 if (Args.getLastArg(options::OPT__SLASH_Gd))
6248 CmdArgs.push_back("-fdefault-calling-conv=cdecl");
6249 else if (Args.getLastArg(options::OPT__SLASH_Gr))
6250 CmdArgs.push_back("-fdefault-calling-conv=fastcall");
6251 else if (Args.getLastArg(options::OPT__SLASH_Gz))
6252 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
6253 else if (Args.getLastArg(options::OPT__SLASH_Gv))
6254 CmdArgs.push_back("-fdefault-calling-conv=vectorcall");
6255
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006256 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6257 A->render(Args, CmdArgs);
6258
Hans Wennborg81f74482013-09-10 01:07:07 +00006259 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6260 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006261 if (Args.hasArg(options::OPT__SLASH_fallback))
6262 CmdArgs.push_back("msvc-fallback");
6263 else
6264 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006265 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006266}
6267
Douglas Katzman95354292015-06-23 20:42:09 +00006268visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006269 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006270 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006271 return CLFallback.get();
6272}
6273
Daniel Sanders7f933f42015-01-30 17:35:23 +00006274void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6275 ArgStringList &CmdArgs) const {
6276 StringRef CPUName;
6277 StringRef ABIName;
6278 const llvm::Triple &Triple = getToolChain().getTriple();
6279 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6280
6281 CmdArgs.push_back("-target-abi");
6282 CmdArgs.push_back(ABIName.data());
6283}
6284
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006285void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006286 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006287 const ArgList &Args,
6288 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006289 ArgStringList CmdArgs;
6290
6291 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6292 const InputInfo &Input = Inputs[0];
6293
James Y Knight2db38f32015-08-15 03:45:25 +00006294 std::string TripleStr =
6295 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6296 const llvm::Triple Triple(TripleStr);
6297
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006298 // Don't warn about "clang -w -c foo.s"
6299 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006300 // and "clang -emit-llvm -c foo.s"
6301 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006302
Rafael Espindola577637a2015-01-03 00:06:04 +00006303 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006304
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006305 // Invoke ourselves in -cc1as mode.
6306 //
6307 // FIXME: Implement custom jobs for internal actions.
6308 CmdArgs.push_back("-cc1as");
6309
6310 // Add the "effective" target triple.
6311 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006312 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6313
6314 // Set the output mode, we currently only expect to be used as a real
6315 // assembler.
6316 CmdArgs.push_back("-filetype");
6317 CmdArgs.push_back("obj");
6318
Eric Christopher45f2e712012-12-18 00:31:10 +00006319 // Set the main file name, so that debug info works even with
6320 // -save-temps or preprocessed assembly.
6321 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006322 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006323
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006324 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006325 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006326 if (!CPU.empty()) {
6327 CmdArgs.push_back("-target-cpu");
6328 CmdArgs.push_back(Args.MakeArgString(CPU));
6329 }
6330
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006331 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006332 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006333
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006334 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006335 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006336
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006337 // Pass along any -I options so we get proper .include search paths.
6338 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6339
Eric Christopherfc3ee562012-01-10 00:38:01 +00006340 // Determine the original source input.
6341 const Action *SourceAction = &JA;
6342 while (SourceAction->getKind() != Action::InputClass) {
6343 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6344 SourceAction = SourceAction->getInputs()[0];
6345 }
6346
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006347 // Forward -g and handle debug info related flags, assuming we are dealing
6348 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006349 bool WantDebug = false;
6350 unsigned DwarfVersion = 0;
6351 Args.ClaimAllArgs(options::OPT_g_Group);
6352 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6353 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6354 !A->getOption().matches(options::OPT_ggdb0);
6355 if (WantDebug)
6356 DwarfVersion = DwarfVersionNum(A->getSpelling());
6357 }
6358 if (DwarfVersion == 0)
6359 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6360
6361 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6362
Eric Christopherfc3ee562012-01-10 00:38:01 +00006363 if (SourceAction->getType() == types::TY_Asm ||
6364 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006365 // You might think that it would be ok to set DebugInfoKind outside of
6366 // the guard for source type, however there is a test which asserts
6367 // that some assembler invocation receives no -debug-info-kind,
6368 // and it's not clear whether that test is just overly restrictive.
6369 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6370 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006371 // Add the -fdebug-compilation-dir flag if needed.
6372 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006373
6374 // Set the AT_producer to the clang version when using the integrated
6375 // assembler on assembly source files.
6376 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopes34c549e2016-05-02 20:20:49 +00006377 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006378
6379 // And pass along -I options
6380 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006381 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006382 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6383 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006384
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006385 // Handle -fPIC et al -- the relocation-model affects the assembler
6386 // for some targets.
6387 llvm::Reloc::Model RelocationModel;
6388 unsigned PICLevel;
6389 bool IsPIE;
6390 std::tie(RelocationModel, PICLevel, IsPIE) =
6391 ParsePICArgs(getToolChain(), Triple, Args);
6392
6393 const char *RMName = RelocationModelName(RelocationModel);
6394 if (RMName) {
6395 CmdArgs.push_back("-mrelocation-model");
6396 CmdArgs.push_back(RMName);
6397 }
6398
Kevin Enderby292dc082011-12-22 19:31:58 +00006399 // Optionally embed the -cc1as level arguments into the debug info, for build
6400 // analysis.
6401 if (getToolChain().UseDwarfDebugFlags()) {
6402 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006403 for (const auto &Arg : Args)
6404 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006405
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006406 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006407 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6408 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006409 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006410 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006411 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006412 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006413 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006414 }
6415 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006416 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006417 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006418
6419 // FIXME: Add -static support, once we have it.
6420
Daniel Sanders7f933f42015-01-30 17:35:23 +00006421 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006422 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006423 default:
6424 break;
6425
6426 case llvm::Triple::mips:
6427 case llvm::Triple::mipsel:
6428 case llvm::Triple::mips64:
6429 case llvm::Triple::mips64el:
6430 AddMIPSTargetArgs(Args, CmdArgs);
6431 break;
6432 }
6433
David Blaikie372d9502014-01-17 03:17:40 +00006434 // Consume all the warning flags. Usually this would be handled more
6435 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6436 // doesn't handle that so rather than warning about unused flags that are
6437 // actually used, we'll lie by omission instead.
6438 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006439 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006440
David Blaikie9260ed62013-07-25 21:19:01 +00006441 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6442 getToolChain().getDriver());
6443
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006444 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006445
6446 assert(Output.isFilename() && "Unexpected lipo output.");
6447 CmdArgs.push_back("-o");
6448 CmdArgs.push_back(Output.getFilename());
6449
Daniel Dunbarb440f562010-08-02 02:38:21 +00006450 assert(Input.isFilename() && "Invalid input.");
6451 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006452
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006453 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006454 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006455
6456 // Handle the debug info splitting at object creation time if we're
6457 // creating an object.
6458 // TODO: Currently only works on linux with newer objcopy.
6459 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006460 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006461 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006462 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006463}
6464
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006465void GnuTool::anchor() {}
6466
Daniel Dunbara3246a02009-03-18 08:07:30 +00006467void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006468 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006469 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006470 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006471 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006472 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006473
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006474 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006475 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006476 // It is unfortunate that we have to claim here, as this means
6477 // we will basically never report anything interesting for
6478 // platforms using a generic gcc, even if we are just using gcc
6479 // to get to the assembler.
6480 A->claim();
6481
Daniel Dunbar939c1212010-08-03 16:14:14 +00006482 // Don't forward any -g arguments to assembly steps.
6483 if (isa<AssembleJobAction>(JA) &&
6484 A->getOption().matches(options::OPT_g_Group))
6485 continue;
6486
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006487 // Don't forward any -W arguments to assembly and link steps.
6488 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6489 A->getOption().matches(options::OPT_W_Group))
6490 continue;
6491
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006492 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006493 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006494 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006495
Daniel Dunbar4e295052010-01-25 22:35:08 +00006496 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006497
6498 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006499 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006500 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006501 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006502 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006503 }
6504
Daniel Dunbar5716d872009-05-02 21:41:52 +00006505 // Try to force gcc to match the tool chain we want, if we recognize
6506 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006507 //
6508 // FIXME: The triple class should directly provide the information we want
6509 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006510 switch (getToolChain().getArch()) {
6511 default:
6512 break;
6513 case llvm::Triple::x86:
6514 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006515 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006516 break;
6517 case llvm::Triple::x86_64:
6518 case llvm::Triple::ppc64:
6519 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006520 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006521 break;
6522 case llvm::Triple::sparcel:
6523 CmdArgs.push_back("-EL");
6524 break;
6525 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006526
Daniel Dunbarb440f562010-08-02 02:38:21 +00006527 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006528 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006529 CmdArgs.push_back(Output.getFilename());
6530 } else {
6531 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006532 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006533 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006534
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006535 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006536
6537 // Only pass -x if gcc will understand it; otherwise hope gcc
6538 // understands the suffix correctly. The main use case this would go
6539 // wrong in is for linker inputs if they happened to have an odd
6540 // suffix; really the only way to get this to happen is a command
6541 // like '-x foobar a.c' which will treat a.c like a linker input.
6542 //
6543 // FIXME: For the linker case specifically, can we safely convert
6544 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006545 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006546 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006547 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006548 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006549 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006550 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006551 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006552 else if (II.getType() == types::TY_ModuleFile)
6553 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006554 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006555
Daniel Dunbara3246a02009-03-18 08:07:30 +00006556 if (types::canTypeBeUserSpecified(II.getType())) {
6557 CmdArgs.push_back("-x");
6558 CmdArgs.push_back(types::getTypeName(II.getType()));
6559 }
6560
Daniel Dunbarb440f562010-08-02 02:38:21 +00006561 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006562 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006563 else {
6564 const Arg &A = II.getInputArg();
6565
6566 // Reverse translate some rewritten options.
6567 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6568 CmdArgs.push_back("-lstdc++");
6569 continue;
6570 }
6571
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006572 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006573 A.render(Args, CmdArgs);
6574 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006575 }
6576
Benjamin Kramer2e018ef2016-05-27 13:36:58 +00006577 const std::string &customGCCName = D.getCCCGenericGCCName();
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006578 const char *GCCName;
6579 if (!customGCCName.empty())
6580 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006581 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006582 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006583 } else
6584 GCCName = "gcc";
6585
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006586 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006587 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006588}
6589
Douglas Katzman95354292015-06-23 20:42:09 +00006590void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6591 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006592 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006593}
6594
Douglas Katzman95354292015-06-23 20:42:09 +00006595void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6596 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006597 const Driver &D = getToolChain().getDriver();
6598
Eric Christophercc7ff502015-01-29 00:56:17 +00006599 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006600 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006601 case types::TY_LLVM_IR:
6602 case types::TY_LTO_IR:
6603 case types::TY_LLVM_BC:
6604 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006605 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006606 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006607 // We assume we've got an "integrated" assembler in that gcc will produce an
6608 // object file itself.
6609 case types::TY_Object:
6610 CmdArgs.push_back("-c");
6611 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006612 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006613 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006614 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006615 case types::TY_Nothing:
6616 CmdArgs.push_back("-fsyntax-only");
6617 break;
6618 default:
6619 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006620 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006621}
6622
Douglas Katzman95354292015-06-23 20:42:09 +00006623void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6624 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006625 // The types are (hopefully) good enough.
6626}
6627
Tony Linthicum76329bf2011-12-12 21:14:55 +00006628// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006629void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006630 ArgStringList &CmdArgs) const {
6631}
6632
Douglas Katzman95354292015-06-23 20:42:09 +00006633void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6634 const InputInfo &Output,
6635 const InputInfoList &Inputs,
6636 const ArgList &Args,
6637 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006638 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006639
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006640 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6641 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006642 ArgStringList CmdArgs;
6643
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006644 std::string MArchString = "-march=hexagon";
6645 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006646
6647 RenderExtraToolArgs(JA, CmdArgs);
6648
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006649 std::string AsName = "hexagon-llvm-mc";
6650 std::string MCpuString = "-mcpu=hexagon" +
6651 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6652 CmdArgs.push_back("-filetype=obj");
6653 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6654
Tony Linthicum76329bf2011-12-12 21:14:55 +00006655 if (Output.isFilename()) {
6656 CmdArgs.push_back("-o");
6657 CmdArgs.push_back(Output.getFilename());
6658 } else {
6659 assert(Output.isNothing() && "Unexpected output");
6660 CmdArgs.push_back("-fsyntax-only");
6661 }
6662
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006663 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6664 std::string N = llvm::utostr(G.getValue());
6665 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6666 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006667
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006668 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006669
Tony Linthicum76329bf2011-12-12 21:14:55 +00006670 // Only pass -x if gcc will understand it; otherwise hope gcc
6671 // understands the suffix correctly. The main use case this would go
6672 // wrong in is for linker inputs if they happened to have an odd
6673 // suffix; really the only way to get this to happen is a command
6674 // like '-x foobar a.c' which will treat a.c like a linker input.
6675 //
6676 // FIXME: For the linker case specifically, can we safely convert
6677 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006678 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006679 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006680 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006681 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006682 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006683 else if (II.getType() == types::TY_AST)
6684 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006685 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006686 else if (II.getType() == types::TY_ModuleFile)
6687 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006688 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006689
6690 if (II.isFilename())
6691 CmdArgs.push_back(II.getFilename());
6692 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006693 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006694 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006695 II.getInputArg().render(Args, CmdArgs);
6696 }
6697
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006698 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006699 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006700}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006701
Douglas Katzman95354292015-06-23 20:42:09 +00006702void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6703 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006704}
6705
Douglas Katzman54366072015-07-27 16:53:08 +00006706static void
6707constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006708 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006709 const InputInfo &Output, const InputInfoList &Inputs,
6710 const ArgList &Args, ArgStringList &CmdArgs,
6711 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006712
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006713 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006714
Matthew Curtise689b052012-12-06 15:46:07 +00006715 //----------------------------------------------------------------------------
6716 //
6717 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006718 bool IsStatic = Args.hasArg(options::OPT_static);
6719 bool IsShared = Args.hasArg(options::OPT_shared);
6720 bool IsPIE = Args.hasArg(options::OPT_pie);
6721 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6722 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6723 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6724 bool UseG0 = false;
6725 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006726
Matthew Curtise689b052012-12-06 15:46:07 +00006727 //----------------------------------------------------------------------------
6728 // Silence warnings for various options
6729 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006730 Args.ClaimAllArgs(options::OPT_g_Group);
6731 Args.ClaimAllArgs(options::OPT_emit_llvm);
6732 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6733 // handled somewhere else.
6734 Args.ClaimAllArgs(options::OPT_static_libgcc);
6735
6736 //----------------------------------------------------------------------------
6737 //
6738 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006739 if (Args.hasArg(options::OPT_s))
6740 CmdArgs.push_back("-s");
6741
6742 if (Args.hasArg(options::OPT_r))
6743 CmdArgs.push_back("-r");
6744
6745 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006746 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006747
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006748 CmdArgs.push_back("-march=hexagon");
6749 std::string CpuVer =
6750 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6751 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6752 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006753
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006754 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006755 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006756 // The following should be the default, but doing as hexagon-gcc does.
6757 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006758 }
6759
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006760 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006761 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006762
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006763 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006764 CmdArgs.push_back("-pie");
6765
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006766 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6767 std::string N = llvm::utostr(G.getValue());
6768 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6769 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006770 }
6771
Matthew Curtise689b052012-12-06 15:46:07 +00006772 //----------------------------------------------------------------------------
6773 //
6774 //----------------------------------------------------------------------------
6775 CmdArgs.push_back("-o");
6776 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006777
Matthew Curtise689b052012-12-06 15:46:07 +00006778 //----------------------------------------------------------------------------
6779 // moslib
6780 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006781 std::vector<std::string> OsLibs;
6782 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006783
Sean Silva14facf32015-06-09 01:57:17 +00006784 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6785 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006786 OsLibs.emplace_back(A->getValue());
6787 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006788 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006789 if (OsLibs.empty()) {
6790 OsLibs.push_back("standalone");
6791 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006792 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006793
Matthew Curtise689b052012-12-06 15:46:07 +00006794 //----------------------------------------------------------------------------
6795 // Start Files
6796 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006797 const std::string MCpuSuffix = "/" + CpuVer;
6798 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6799 const std::string RootDir =
6800 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6801 const std::string StartSubDir =
6802 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006803
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006804 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6805 const char *Name) -> std::string {
6806 std::string RelName = SubDir + Name;
6807 std::string P = HTC.GetFilePath(RelName.c_str());
6808 if (llvm::sys::fs::exists(P))
6809 return P;
6810 return RootDir + RelName;
6811 };
6812
6813 if (IncStdLib && IncStartFiles) {
6814 if (!IsShared) {
6815 if (HasStandalone) {
6816 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6817 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006818 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006819 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6820 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006821 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006822 std::string Init = UseShared
6823 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6824 : Find(RootDir, StartSubDir, "/init.o");
6825 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006826 }
6827
6828 //----------------------------------------------------------------------------
6829 // Library Search Paths
6830 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006831 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6832 for (const auto &LibPath : LibPaths)
6833 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006834
6835 //----------------------------------------------------------------------------
6836 //
6837 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006838 Args.AddAllArgs(CmdArgs,
6839 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6840 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006841
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006842 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006843
6844 //----------------------------------------------------------------------------
6845 // Libraries
6846 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006847 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006848 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006849 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006850 CmdArgs.push_back("-lm");
6851 }
6852
6853 CmdArgs.push_back("--start-group");
6854
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006855 if (!IsShared) {
6856 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006857 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006858 CmdArgs.push_back("-lc");
6859 }
6860 CmdArgs.push_back("-lgcc");
6861
6862 CmdArgs.push_back("--end-group");
6863 }
6864
6865 //----------------------------------------------------------------------------
6866 // End files
6867 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006868 if (IncStdLib && IncStartFiles) {
6869 std::string Fini = UseShared
6870 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6871 : Find(RootDir, StartSubDir, "/fini.o");
6872 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006873 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006874}
6875
Douglas Katzman95354292015-06-23 20:42:09 +00006876void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6877 const InputInfo &Output,
6878 const InputInfoList &Inputs,
6879 const ArgList &Args,
6880 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006881 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006882
6883 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006884 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006885 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006886
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006887 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006888 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006889 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006890}
6891// Hexagon tools end.
6892
Tom Stellard8fa33092015-07-18 01:49:05 +00006893void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6894 const InputInfo &Output,
6895 const InputInfoList &Inputs,
6896 const ArgList &Args,
6897 const char *LinkingOutput) const {
6898
6899 std::string Linker = getToolChain().GetProgramPath(getShortName());
6900 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006901 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellardf6699f52016-05-05 17:03:41 +00006902 CmdArgs.push_back("-shared");
6903 CmdArgs.push_back("-o");
Tom Stellard8fa33092015-07-18 01:49:05 +00006904 CmdArgs.push_back(Output.getFilename());
6905 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6906 CmdArgs, Inputs));
6907}
6908// AMDGPU tools end.
6909
Dan Gohman52816862015-12-16 23:30:41 +00006910wasm::Linker::Linker(const ToolChain &TC)
6911 : GnuTool("wasm::Linker", "lld", TC) {}
6912
6913bool wasm::Linker::isLinkJob() const {
6914 return true;
6915}
6916
6917bool wasm::Linker::hasIntegratedCPP() const {
6918 return false;
6919}
6920
6921void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6922 const InputInfo &Output,
6923 const InputInfoList &Inputs,
6924 const ArgList &Args,
6925 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006926
6927 const ToolChain &ToolChain = getToolChain();
6928 const Driver &D = ToolChain.getDriver();
6929 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006930 ArgStringList CmdArgs;
6931 CmdArgs.push_back("-flavor");
6932 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006933
6934 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006935 // size is of particular importance. This is significantly facilitated by
6936 // the enabling of -ffunction-sections and -fdata-sections in
6937 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006938 if (areOptimizationsEnabled(Args))
6939 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006940
Dan Gohman57b62c52016-02-22 19:26:15 +00006941 if (Args.hasArg(options::OPT_rdynamic))
6942 CmdArgs.push_back("-export-dynamic");
6943 if (Args.hasArg(options::OPT_s))
6944 CmdArgs.push_back("--strip-all");
6945 if (Args.hasArg(options::OPT_shared))
6946 CmdArgs.push_back("-shared");
6947 if (Args.hasArg(options::OPT_static))
6948 CmdArgs.push_back("-Bstatic");
6949
6950 Args.AddAllArgs(CmdArgs, options::OPT_L);
6951 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6952
6953 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6954 if (Args.hasArg(options::OPT_shared))
6955 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6956 else if (Args.hasArg(options::OPT_pie))
6957 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6958 else
6959 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6960
6961 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6962 }
6963
6964 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6965
6966 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6967 if (D.CCCIsCXX())
6968 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6969
6970 if (Args.hasArg(options::OPT_pthread))
6971 CmdArgs.push_back("-lpthread");
6972
6973 CmdArgs.push_back("-lc");
6974 CmdArgs.push_back("-lcompiler_rt");
6975 }
6976
6977 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6978 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6979
Dan Gohman52816862015-12-16 23:30:41 +00006980 CmdArgs.push_back("-o");
6981 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006982
Dan Gohman52816862015-12-16 23:30:41 +00006983 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6984}
6985
Renato Golin7c542b42015-07-27 23:44:45 +00006986const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006987 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006988 if (!Arch.empty())
6989 MArch = Arch;
6990 else
Bernard Ogden31561762013-12-12 13:27:11 +00006991 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006992 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006993
6994 // Handle -march=native.
6995 if (MArch == "native") {
6996 std::string CPU = llvm::sys::getHostCPUName();
6997 if (CPU != "generic") {
6998 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006999 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007000 // If there is no valid architecture suffix for this CPU we don't know how
7001 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007002 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00007003 MArch = "";
7004 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007005 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00007006 }
7007 }
7008
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007009 return MArch;
7010}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007011
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007012/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007013StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00007014 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007015 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
7016 // here means an -march=native that we can't handle, so instead return no CPU.
7017 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007018 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00007019
John Brawna95c1a82015-05-08 12:52:18 +00007020 // We need to return an empty string here on invalid MArch values as the
7021 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007022 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00007023}
7024
7025/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00007026std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007027 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00007028 // FIXME: Warn on inconsistent use of -mcpu and -march.
7029 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00007030 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00007031 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00007032 // Handle -mcpu=native.
7033 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00007034 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00007035 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00007036 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00007037 }
7038
Renato Goline17c5802015-07-27 23:44:42 +00007039 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00007040}
7041
7042/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007043/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00007044// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007045StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
7046 const llvm::Triple &Triple) {
7047 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007048 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00007049 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007050 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007051 if (ArchKind == llvm::ARM::AK_INVALID)
7052 // In case of generic Arch, i.e. "arm",
7053 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007054 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007055 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00007056 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
7057 // armv7k triple if it's actually been specified via "-arch armv7k".
7058 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00007059 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00007060 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007061 }
Renato Golin3c007252015-05-28 15:05:53 +00007062 if (ArchKind == llvm::ARM::AK_INVALID)
7063 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00007064 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00007065}
7066
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007067void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007068 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007069 if (Args.hasArg(options::OPT_r))
7070 return;
7071
John Brawn94fd9632015-05-21 12:19:49 +00007072 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
7073 // to generate BE-8 executables.
7074 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
7075 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007076}
7077
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007078mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00007079 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
7080 // was first introduced in Release 3. However, other compilers have
7081 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007082 return (NanEncoding)llvm::StringSwitch<int>(CPU)
7083 .Case("mips1", NanLegacy)
7084 .Case("mips2", NanLegacy)
7085 .Case("mips3", NanLegacy)
7086 .Case("mips4", NanLegacy)
7087 .Case("mips5", NanLegacy)
7088 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007089 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007090 .Case("mips32r3", NanLegacy | Nan2008)
7091 .Case("mips32r5", NanLegacy | Nan2008)
7092 .Case("mips32r6", Nan2008)
7093 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007094 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007095 .Case("mips64r3", NanLegacy | Nan2008)
7096 .Case("mips64r5", NanLegacy | Nan2008)
7097 .Case("mips64r6", Nan2008)
7098 .Default(NanLegacy);
7099}
7100
Simon Dardisd0e83ba2016-05-27 15:13:31 +00007101bool mips::hasCompactBranches(StringRef &CPU) {
7102 // mips32r6 and mips64r6 have compact branches.
7103 return llvm::StringSwitch<bool>(CPU)
7104 .Case("mips32r6", true)
7105 .Case("mips64r6", true)
7106 .Default(false);
7107}
7108
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007109bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
7110 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
7111 return A && (A->getValue() == StringRef(Value));
7112}
7113
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007114bool mips::isUCLibc(const ArgList &Args) {
7115 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00007116 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007117}
7118
Daniel Sanders2bf13662014-07-10 14:40:57 +00007119bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007120 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7121 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007122 .Case("2008", true)
7123 .Case("legacy", false)
7124 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007125
7126 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007127 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007128 .Cases("mips32r6", "mips64r6", true)
7129 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007130
7131 return false;
7132}
7133
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007134bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) {
7135 if (!Triple.isAndroid())
7136 return false;
7137
7138 // Android MIPS32R6 defaults to FP64A.
7139 return llvm::StringSwitch<bool>(CPUName)
7140 .Case("mips32r6", true)
7141 .Default(false);
7142}
7143
Daniel Sanders379d44b2014-07-16 11:52:23 +00007144bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007145 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007146 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007147 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
7148 !Triple.isAndroid())
Daniel Sanders379d44b2014-07-16 11:52:23 +00007149 return false;
7150
7151 if (ABIName != "32")
7152 return false;
7153
Toma Tabacu94ea6862015-06-16 13:54:13 +00007154 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7155 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007156 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007157 return false;
7158
Daniel Sanders379d44b2014-07-16 11:52:23 +00007159 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007160 .Cases("mips2", "mips3", "mips4", "mips5", true)
7161 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7162 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7163 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007164}
7165
Toma Tabacu94ea6862015-06-16 13:54:13 +00007166bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7167 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007168 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007169 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7170
7171 // FPXX shouldn't be used if -msingle-float is present.
7172 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7173 options::OPT_mdouble_float))
7174 if (A->getOption().matches(options::OPT_msingle_float))
7175 UseFPXX = false;
7176
7177 return UseFPXX;
7178}
7179
Tim Northover157d9112014-01-16 08:48:16 +00007180llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007181 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7182 // archs which Darwin doesn't use.
7183
7184 // The matching this routine does is fairly pointless, since it is neither the
7185 // complete architecture list, nor a reasonable subset. The problem is that
7186 // historically the driver driver accepts this and also ties its -march=
7187 // handling to the architecture name, so we need to be careful before removing
7188 // support for it.
7189
7190 // This code must be kept in sync with Clang's Darwin specific argument
7191 // translation.
7192
7193 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007194 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7195 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7196 .Case("ppc64", llvm::Triple::ppc64)
7197 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7198 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7199 llvm::Triple::x86)
7200 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7201 // This is derived from the driver driver.
7202 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7203 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7204 .Cases("armv7s", "xscale", llvm::Triple::arm)
7205 .Case("arm64", llvm::Triple::aarch64)
7206 .Case("r600", llvm::Triple::r600)
7207 .Case("amdgcn", llvm::Triple::amdgcn)
7208 .Case("nvptx", llvm::Triple::nvptx)
7209 .Case("nvptx64", llvm::Triple::nvptx64)
7210 .Case("amdil", llvm::Triple::amdil)
7211 .Case("spir", llvm::Triple::spir)
7212 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007213}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007214
Tim Northover157d9112014-01-16 08:48:16 +00007215void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007216 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007217 T.setArch(Arch);
7218
7219 if (Str == "x86_64h")
7220 T.setArchName(Str);
7221 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7222 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007223 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007224 }
7225}
7226
Bob Wilsondecc03e2012-11-23 06:14:39 +00007227const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007228 const InputInfo &Input) {
7229 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007230}
7231
Bob Wilsondecc03e2012-11-23 06:14:39 +00007232const char *Clang::getBaseInputStem(const ArgList &Args,
7233 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007234 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007235
Chris Lattner906bb902011-01-16 08:14:11 +00007236 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007237 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007238
7239 return Str;
7240}
7241
Bob Wilsondecc03e2012-11-23 06:14:39 +00007242const char *Clang::getDependencyFileName(const ArgList &Args,
7243 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007244 // FIXME: Think about this more.
7245 std::string Res;
7246
7247 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007248 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007249 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007250 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007251 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007252 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007253 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007254}
7255
Douglas Katzman95354292015-06-23 20:42:09 +00007256void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7257 const InputInfo &Output,
7258 const InputInfoList &Inputs,
7259 const ArgList &Args,
7260 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007261 const ToolChain &ToolChain = getToolChain();
7262 const Driver &D = ToolChain.getDriver();
7263 ArgStringList CmdArgs;
7264
7265 // Silence warning for "clang -g foo.o -o foo"
7266 Args.ClaimAllArgs(options::OPT_g_Group);
7267 // and "clang -emit-llvm foo.o -o foo"
7268 Args.ClaimAllArgs(options::OPT_emit_llvm);
7269 // and for "clang -w foo.o -o foo". Other warning options are already
7270 // handled somewhere else.
7271 Args.ClaimAllArgs(options::OPT_w);
7272
7273 if (!D.SysRoot.empty())
7274 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7275
7276 // CloudABI only supports static linkage.
7277 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007278
7279 // CloudABI uses Position Independent Executables exclusively.
7280 CmdArgs.push_back("-pie");
7281 CmdArgs.push_back("--no-dynamic-linker");
7282 CmdArgs.push_back("-zrelro");
7283
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007284 CmdArgs.push_back("--eh-frame-hdr");
7285 CmdArgs.push_back("--gc-sections");
7286
7287 if (Output.isFilename()) {
7288 CmdArgs.push_back("-o");
7289 CmdArgs.push_back(Output.getFilename());
7290 } else {
7291 assert(Output.isNothing() && "Invalid output.");
7292 }
7293
Douglas Katzman78b37b02015-11-17 20:28:07 +00007294 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007295 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7296 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7297 }
7298
7299 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007300 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007301 Args.AddAllArgs(CmdArgs,
7302 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7303 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007304
Teresa Johnson945bc502015-10-15 20:35:53 +00007305 if (D.isUsingLTO())
7306 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007307
7308 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7309
Douglas Katzman78b37b02015-11-17 20:28:07 +00007310 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007311 if (D.CCCIsCXX())
7312 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7313 CmdArgs.push_back("-lc");
7314 CmdArgs.push_back("-lcompiler_rt");
7315 }
7316
Douglas Katzman78b37b02015-11-17 20:28:07 +00007317 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007318 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7319
7320 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007321 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007322}
7323
Douglas Katzman95354292015-06-23 20:42:09 +00007324void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7325 const InputInfo &Output,
7326 const InputInfoList &Inputs,
7327 const ArgList &Args,
7328 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007329 ArgStringList CmdArgs;
7330
7331 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7332 const InputInfo &Input = Inputs[0];
7333
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007334 // Determine the original source input.
7335 const Action *SourceAction = &JA;
7336 while (SourceAction->getKind() != Action::InputClass) {
7337 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7338 SourceAction = SourceAction->getInputs()[0];
7339 }
7340
Eric Christopherf5a8f492015-12-08 00:10:10 +00007341 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007342 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007343 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7344 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007345 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007346 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007347 const llvm::Triple &T(getToolChain().getTriple());
7348 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007349 CmdArgs.push_back("-Q");
7350 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007351
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007352 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007353 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007354 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007355 if (Args.hasArg(options::OPT_gstabs))
7356 CmdArgs.push_back("--gstabs");
7357 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007358 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007359 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007360
Daniel Dunbarbe220842009-03-20 16:06:39 +00007361 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007362 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007363
Daniel Dunbar6d484762010-07-22 01:47:22 +00007364 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007365 if (getToolChain().getArch() == llvm::Triple::x86 ||
7366 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007367 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7368 CmdArgs.push_back("-force_cpusubtype_ALL");
7369
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007370 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007371 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007372 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007373 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007374 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007375 CmdArgs.push_back("-static");
7376
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007377 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007378
7379 assert(Output.isFilename() && "Unexpected lipo output.");
7380 CmdArgs.push_back("-o");
7381 CmdArgs.push_back(Output.getFilename());
7382
Daniel Dunbarb440f562010-08-02 02:38:21 +00007383 assert(Input.isFilename() && "Invalid input.");
7384 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007385
7386 // asm_final spec is empty.
7387
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007388 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007389 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007390}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007391
Tim Northover157d9112014-01-16 08:48:16 +00007392void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007393
Tim Northover157d9112014-01-16 08:48:16 +00007394void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7395 ArgStringList &CmdArgs) const {
7396 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007397
Daniel Dunbarc1964212009-03-26 16:23:12 +00007398 // Derived from darwin_arch spec.
7399 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007400 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007401
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007402 // FIXME: Is this needed anymore?
7403 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007404 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007405}
7406
Douglas Katzman95354292015-06-23 20:42:09 +00007407bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007408 // We only need to generate a temp path for LTO if we aren't compiling object
7409 // files. When compiling source files, we run 'dsymutil' after linking. We
7410 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007411 for (const auto &Input : Inputs)
7412 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007413 return true;
7414
7415 return false;
7416}
7417
Douglas Katzman95354292015-06-23 20:42:09 +00007418void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7419 ArgStringList &CmdArgs,
7420 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007421 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007422 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007423
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007424 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007425 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007426 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007427 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007428 }
7429
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007430 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007431 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007432 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7433 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007434
Bob Wilson3d27dad2013-08-02 22:25:34 +00007435 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7436 CmdArgs.push_back("-export_dynamic");
7437
Bob Wilsonb111ec92015-03-02 19:01:14 +00007438 // If we are using App Extension restrictions, pass a flag to the linker
7439 // telling it that the compiled code has been audited.
7440 if (Args.hasFlag(options::OPT_fapplication_extension,
7441 options::OPT_fno_application_extension, false))
7442 CmdArgs.push_back("-application_extension");
7443
Teresa Johnson945bc502015-10-15 20:35:53 +00007444 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007445 // If we are using LTO, then automatically create a temporary file path for
7446 // the linker to use, so that it's lifetime will extend past a possible
7447 // dsymutil step.
7448 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7449 const char *TmpPath = C.getArgs().MakeArgString(
7450 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7451 C.addTempFile(TmpPath);
7452 CmdArgs.push_back("-object_path_lto");
7453 CmdArgs.push_back(TmpPath);
7454 }
7455
7456 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7457 // it in clang installed libraries. If not found, the option is not used
7458 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7459 if (Version[0] >= 133) {
7460 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7461 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7462 SmallString<128> LibLTOPath(P);
7463 llvm::sys::path::append(LibLTOPath, "lib");
7464 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7465 if (llvm::sys::fs::exists(LibLTOPath)) {
7466 CmdArgs.push_back("-lto_library");
7467 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7468 } else {
7469 D.Diag(diag::warn_drv_lto_libpath);
7470 }
7471 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007472 }
7473
Daniel Dunbarc1964212009-03-26 16:23:12 +00007474 // Derived from the "link" spec.
7475 Args.AddAllArgs(CmdArgs, options::OPT_static);
7476 if (!Args.hasArg(options::OPT_static))
7477 CmdArgs.push_back("-dynamic");
7478 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7479 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7480 // here. How do we wish to handle such things?
7481 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007482
Daniel Dunbarc1964212009-03-26 16:23:12 +00007483 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007484 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007485 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007486 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007487
7488 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7489 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7490 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7491
7492 Arg *A;
7493 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7494 (A = Args.getLastArg(options::OPT_current__version)) ||
7495 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007496 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7497 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007498
7499 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7500 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7501 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7502 } else {
7503 CmdArgs.push_back("-dylib");
7504
7505 Arg *A;
7506 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7507 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7508 (A = Args.getLastArg(options::OPT_client__name)) ||
7509 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7510 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7511 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007512 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7513 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007514
Daniel Dunbarc1964212009-03-26 16:23:12 +00007515 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7516 "-dylib_compatibility_version");
7517 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7518 "-dylib_current_version");
7519
Tim Northover157d9112014-01-16 08:48:16 +00007520 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007521
7522 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7523 "-dylib_install_name");
7524 }
7525
7526 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7527 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7528 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007529 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007530 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007531 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7532 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7533 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7534 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7535 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7536 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007537 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007538 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7539 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7540 Args.AddAllArgs(CmdArgs, options::OPT_init);
7541
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007542 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007543 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007544
Daniel Dunbarc1964212009-03-26 16:23:12 +00007545 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7546 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7547 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7548 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7549 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007551 if (const Arg *A =
7552 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7553 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007554 if (A->getOption().matches(options::OPT_fpie) ||
7555 A->getOption().matches(options::OPT_fPIE))
7556 CmdArgs.push_back("-pie");
7557 else
7558 CmdArgs.push_back("-no_pie");
7559 }
Steven Wu574b0f22016-03-01 01:07:58 +00007560 // for embed-bitcode, use -bitcode_bundle in linker command
7561 if (C.getDriver().embedBitcodeEnabled() ||
7562 C.getDriver().embedBitcodeMarkerOnly()) {
7563 // Check if the toolchain supports bitcode build flow.
7564 if (MachOTC.SupportsEmbeddedBitcode())
7565 CmdArgs.push_back("-bitcode_bundle");
7566 else
7567 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7568 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007569
7570 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7571 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7572 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7573 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7574 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7575 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7576 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7577 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7578 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7579 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7580 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7581 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7582 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7583 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7584 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7585 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007586
Daniel Dunbar84384642011-05-02 21:03:47 +00007587 // Give --sysroot= preference, over the Apple specific behavior to also use
7588 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007589 StringRef sysroot = C.getSysRoot();
7590 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007591 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007592 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007593 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7594 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007595 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007596 }
7597
Daniel Dunbarc1964212009-03-26 16:23:12 +00007598 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7599 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7600 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7601 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7602 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007603 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007604 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7605 Args.AddAllArgs(CmdArgs, options::OPT_y);
7606 Args.AddLastArg(CmdArgs, options::OPT_w);
7607 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7608 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7609 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7610 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7611 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7612 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7613 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7614 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7615 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7616 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7617 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7618 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7619}
7620
Douglas Katzman95354292015-06-23 20:42:09 +00007621void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7622 const InputInfo &Output,
7623 const InputInfoList &Inputs,
7624 const ArgList &Args,
7625 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007626 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007627
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007628 // If the number of arguments surpasses the system limits, we will encode the
7629 // input files in a separate file, shortening the command line. To this end,
7630 // build a list of input file names that can be passed via a file with the
7631 // -filelist linker option.
7632 llvm::opt::ArgStringList InputFileList;
7633
Daniel Dunbarc1964212009-03-26 16:23:12 +00007634 // The logic here is derived from gcc's behavior; most of which
7635 // comes from specs (starting with link_command). Consult gcc for
7636 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007637 ArgStringList CmdArgs;
7638
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007639 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7640 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7641 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007642 for (const auto &Arg : Args)
7643 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007644 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007645 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007646 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007648 return;
7649 }
7650
Daniel Dunbarc1964212009-03-26 16:23:12 +00007651 // I'm not sure why this particular decomposition exists in gcc, but
7652 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007653 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007654
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007655 // It seems that the 'e' option is completely ignored for dynamic executables
7656 // (the default), and with static executables, the last one wins, as expected.
7657 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7658 options::OPT_Z_Flag, options::OPT_u_Group,
7659 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007660
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007661 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7662 // members of static archive libraries which implement Objective-C classes or
7663 // categories.
7664 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7665 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007666
Daniel Dunbarc1964212009-03-26 16:23:12 +00007667 CmdArgs.push_back("-o");
7668 CmdArgs.push_back(Output.getFilename());
7669
Douglas Katzman78b37b02015-11-17 20:28:07 +00007670 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007671 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007672
Peter Collingbournec4122c12015-06-15 21:08:13 +00007673 // SafeStack requires its own runtime libraries
7674 // These libraries should be linked first, to make sure the
7675 // __safestack_init constructor executes before everything else
7676 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7677 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7678 "libclang_rt.safestack_osx.a",
7679 /*AlwaysLink=*/true);
7680 }
7681
Daniel Dunbarc1964212009-03-26 16:23:12 +00007682 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007683
Douglas Gregor9295df02012-05-15 21:00:27 +00007684 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007685 // Build the input file for -filelist (list of linker input files) in case we
7686 // need it later
7687 for (const auto &II : Inputs) {
7688 if (!II.isFilename()) {
7689 // This is a linker input argument.
7690 // We cannot mix input arguments and file names in a -filelist input, thus
7691 // we prematurely stop our list (remaining files shall be passed as
7692 // arguments).
7693 if (InputFileList.size() > 0)
7694 break;
7695
7696 continue;
7697 }
7698
7699 InputFileList.push_back(II.getFilename());
7700 }
7701
Douglas Katzman78b37b02015-11-17 20:28:07 +00007702 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007703 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7704
Douglas Katzman78b37b02015-11-17 20:28:07 +00007705 if (isObjCRuntimeLinked(Args) &&
7706 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007707 // We use arclite library for both ARC and subscripting support.
7708 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7709
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007710 CmdArgs.push_back("-framework");
7711 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007712 // Link libobj.
7713 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007714 }
John McCall31168b02011-06-15 23:02:42 +00007715
Daniel Dunbarc1964212009-03-26 16:23:12 +00007716 if (LinkingOutput) {
7717 CmdArgs.push_back("-arch_multiple");
7718 CmdArgs.push_back("-final_output");
7719 CmdArgs.push_back(LinkingOutput);
7720 }
7721
Daniel Dunbarc1964212009-03-26 16:23:12 +00007722 if (Args.hasArg(options::OPT_fnested_functions))
7723 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007724
Justin Bognerc7701242015-05-12 05:44:36 +00007725 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7726
Douglas Katzman78b37b02015-11-17 20:28:07 +00007727 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007728 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007729 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007730
Daniel Dunbarc1964212009-03-26 16:23:12 +00007731 // link_ssp spec is empty.
7732
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007733 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007734 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007735 }
7736
Douglas Katzman78b37b02015-11-17 20:28:07 +00007737 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007738 // endfile_spec is empty.
7739 }
7740
7741 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7742 Args.AddAllArgs(CmdArgs, options::OPT_F);
7743
Steven Wu3ffb61b2015-02-06 18:08:29 +00007744 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007745 for (const Arg *A : Args.filtered(options::OPT_iframework))
7746 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007747
Douglas Katzman78b37b02015-11-17 20:28:07 +00007748 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007749 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7750 if (A->getValue() == StringRef("Accelerate")) {
7751 CmdArgs.push_back("-framework");
7752 CmdArgs.push_back("Accelerate");
7753 }
7754 }
7755 }
7756
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007757 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007758 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007759 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007760 Cmd->setInputFileList(std::move(InputFileList));
7761 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007762}
7763
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007764void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007765 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007766 const InputInfoList &Inputs,
7767 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007768 const char *LinkingOutput) const {
7769 ArgStringList CmdArgs;
7770
7771 CmdArgs.push_back("-create");
7772 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007773
7774 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007775 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007776
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007777 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007778 assert(II.isFilename() && "Unexpected lipo input.");
7779 CmdArgs.push_back(II.getFilename());
7780 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007781
7782 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007783 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007784}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007785
Daniel Dunbar88299622010-06-04 18:28:36 +00007786void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007787 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007788 const InputInfoList &Inputs,
7789 const ArgList &Args,
7790 const char *LinkingOutput) const {
7791 ArgStringList CmdArgs;
7792
Daniel Dunbareb86b042011-05-09 17:23:16 +00007793 CmdArgs.push_back("-o");
7794 CmdArgs.push_back(Output.getFilename());
7795
Daniel Dunbar88299622010-06-04 18:28:36 +00007796 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7797 const InputInfo &Input = Inputs[0];
7798 assert(Input.isFilename() && "Unexpected dsymutil input.");
7799 CmdArgs.push_back(Input.getFilename());
7800
Daniel Dunbar88299622010-06-04 18:28:36 +00007801 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007802 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007803 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007804}
7805
Eric Christopher551ef452011-08-23 17:56:55 +00007806void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007807 const InputInfo &Output,
7808 const InputInfoList &Inputs,
7809 const ArgList &Args,
7810 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007811 ArgStringList CmdArgs;
7812 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007813 CmdArgs.push_back("--debug-info");
7814 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007815 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007816
7817 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7818 const InputInfo &Input = Inputs[0];
7819 assert(Input.isFilename() && "Unexpected verify input");
7820
7821 // Grabbing the output of the earlier dsymutil run.
7822 CmdArgs.push_back(Input.getFilename());
7823
7824 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007825 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007826 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007827}
7828
Douglas Katzman95354292015-06-23 20:42:09 +00007829void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007830 const InputInfo &Output,
7831 const InputInfoList &Inputs,
7832 const ArgList &Args,
7833 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007834 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007835 ArgStringList CmdArgs;
7836
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007837 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007838
7839 CmdArgs.push_back("-o");
7840 CmdArgs.push_back(Output.getFilename());
7841
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007842 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007843 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007844
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007845 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007846 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007847}
7848
Douglas Katzman95354292015-06-23 20:42:09 +00007849void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7850 const InputInfo &Output,
7851 const InputInfoList &Inputs,
7852 const ArgList &Args,
7853 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007854 ArgStringList CmdArgs;
7855
David Chisnall272a0712012-02-29 15:06:12 +00007856 // Demangle C++ names in errors
7857 CmdArgs.push_back("-C");
7858
Douglas Katzman78b37b02015-11-17 20:28:07 +00007859 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007860 CmdArgs.push_back("-e");
7861 CmdArgs.push_back("_start");
7862 }
7863
7864 if (Args.hasArg(options::OPT_static)) {
7865 CmdArgs.push_back("-Bstatic");
7866 CmdArgs.push_back("-dn");
7867 } else {
7868 CmdArgs.push_back("-Bdynamic");
7869 if (Args.hasArg(options::OPT_shared)) {
7870 CmdArgs.push_back("-shared");
7871 } else {
7872 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007873 CmdArgs.push_back(
7874 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007875 }
7876 }
7877
7878 if (Output.isFilename()) {
7879 CmdArgs.push_back("-o");
7880 CmdArgs.push_back(Output.getFilename());
7881 } else {
7882 assert(Output.isNothing() && "Invalid output.");
7883 }
7884
Douglas Katzman78b37b02015-11-17 20:28:07 +00007885 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007886 if (!Args.hasArg(options::OPT_shared))
7887 CmdArgs.push_back(
7888 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7889
7890 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7891 CmdArgs.push_back(
7892 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7893 CmdArgs.push_back(
7894 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007895 }
7896
Douglas Katzman6059ef92015-11-17 17:41:23 +00007897 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007898
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007899 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7900 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007901
7902 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7903
Douglas Katzman78b37b02015-11-17 20:28:07 +00007904 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007905 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007906 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007907 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007908 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007909 if (!Args.hasArg(options::OPT_shared)) {
7910 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007911 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007912 }
David Chisnallf571cde2012-02-15 13:39:01 +00007913 }
7914
Douglas Katzman78b37b02015-11-17 20:28:07 +00007915 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007916 CmdArgs.push_back(
7917 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007918 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007919 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007920
Xinliang David Li69306c02015-10-22 06:15:31 +00007921 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007922
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007923 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007924 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007925}
7926
Douglas Katzman95354292015-06-23 20:42:09 +00007927void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7928 const InputInfo &Output,
7929 const InputInfoList &Inputs,
7930 const ArgList &Args,
7931 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007932 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007933 ArgStringList CmdArgs;
7934
Rafael Espindolacc126272014-02-28 01:55:21 +00007935 switch (getToolChain().getArch()) {
7936 case llvm::Triple::x86:
7937 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7938 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007939 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007940 break;
7941
7942 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007943 CmdArgs.push_back("-mppc");
7944 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007945 break;
7946
7947 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007948 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007949 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007950 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7951 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7952 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007953 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007954 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007955
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007956 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007957 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007958 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7959 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7960 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007961 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007962 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007963
7964 case llvm::Triple::mips64:
7965 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007966 StringRef CPUName;
7967 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007968 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007969
7970 CmdArgs.push_back("-mabi");
7971 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7972
7973 if (getToolChain().getArch() == llvm::Triple::mips64)
7974 CmdArgs.push_back("-EB");
7975 else
7976 CmdArgs.push_back("-EL");
7977
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007978 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007979 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007980 }
7981
Rafael Espindolacc126272014-02-28 01:55:21 +00007982 default:
7983 break;
7984 }
7985
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007986 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007987
7988 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007989 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007990
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007991 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007992 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007993
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007994 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007995 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007996}
7997
Douglas Katzman95354292015-06-23 20:42:09 +00007998void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7999 const InputInfo &Output,
8000 const InputInfoList &Inputs,
8001 const ArgList &Args,
8002 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008003 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008004 ArgStringList CmdArgs;
8005
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00008006 // Silence warning for "clang -g foo.o -o foo"
8007 Args.ClaimAllArgs(options::OPT_g_Group);
8008 // and "clang -emit-llvm foo.o -o foo"
8009 Args.ClaimAllArgs(options::OPT_emit_llvm);
8010 // and for "clang -w foo.o -o foo". Other warning options are already
8011 // handled somewhere else.
8012 Args.ClaimAllArgs(options::OPT_w);
8013
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008014 if (getToolChain().getArch() == llvm::Triple::mips64)
8015 CmdArgs.push_back("-EB");
8016 else if (getToolChain().getArch() == llvm::Triple::mips64el)
8017 CmdArgs.push_back("-EL");
8018
Douglas Katzman78b37b02015-11-17 20:28:07 +00008019 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008020 CmdArgs.push_back("-e");
8021 CmdArgs.push_back("__start");
8022 }
8023
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008024 if (Args.hasArg(options::OPT_static)) {
8025 CmdArgs.push_back("-Bstatic");
8026 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008027 if (Args.hasArg(options::OPT_rdynamic))
8028 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008029 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008030 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008031 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008032 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008033 } else {
8034 CmdArgs.push_back("-dynamic-linker");
8035 CmdArgs.push_back("/usr/libexec/ld.so");
8036 }
8037 }
8038
Rafael Espindola044f7832013-06-05 04:28:55 +00008039 if (Args.hasArg(options::OPT_nopie))
8040 CmdArgs.push_back("-nopie");
8041
Daniel Dunbarb440f562010-08-02 02:38:21 +00008042 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008043 CmdArgs.push_back("-o");
8044 CmdArgs.push_back(Output.getFilename());
8045 } else {
8046 assert(Output.isNothing() && "Invalid output.");
8047 }
8048
Douglas Katzman78b37b02015-11-17 20:28:07 +00008049 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008050 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008051 if (Args.hasArg(options::OPT_pg))
8052 CmdArgs.push_back(
8053 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00008054 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008055 CmdArgs.push_back(
8056 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8057 CmdArgs.push_back(
8058 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008059 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008060 CmdArgs.push_back(
8061 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008062 }
8063 }
8064
Edward O'Callaghan5c521462009-10-28 15:13:08 +00008065 std::string Triple = getToolChain().getTripleString();
8066 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008067 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008068 CmdArgs.push_back(
8069 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008070
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008071 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8072 options::OPT_e, options::OPT_s, options::OPT_t,
8073 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008074
Daniel Dunbar54423b22010-09-17 00:24:54 +00008075 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008076
Douglas Katzman78b37b02015-11-17 20:28:07 +00008077 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008078 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008079 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008080 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00008081 CmdArgs.push_back("-lm_p");
8082 else
8083 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00008084 }
8085
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008086 // FIXME: For some reason GCC passes -lgcc before adding
8087 // the default system libraries. Just mimic this for now.
8088 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008089
Eric Christopher17674ec2012-09-13 06:32:34 +00008090 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008091 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
8092 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00008093 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008094 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00008095 }
8096
Chandler Carruth45661652011-12-17 22:32:42 +00008097 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00008098 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008099 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00008100 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008101 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00008102 }
Eric Christopher17674ec2012-09-13 06:32:34 +00008103
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008104 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008105 }
8106
Douglas Katzman78b37b02015-11-17 20:28:07 +00008107 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008108 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008109 CmdArgs.push_back(
8110 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008111 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008112 CmdArgs.push_back(
8113 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008114 }
8115
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008116 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008117 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008118}
Ed Schoutene33194b2009-04-02 19:13:12 +00008119
Douglas Katzman95354292015-06-23 20:42:09 +00008120void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8121 const InputInfo &Output,
8122 const InputInfoList &Inputs,
8123 const ArgList &Args,
8124 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008125 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00008126 ArgStringList CmdArgs;
8127
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008128 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00008129
8130 CmdArgs.push_back("-o");
8131 CmdArgs.push_back(Output.getFilename());
8132
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008133 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008134 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008135
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008136 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008137 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008138}
8139
Douglas Katzman95354292015-06-23 20:42:09 +00008140void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8141 const InputInfo &Output,
8142 const InputInfoList &Inputs,
8143 const ArgList &Args,
8144 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008145 const Driver &D = getToolChain().getDriver();
8146 ArgStringList CmdArgs;
8147
Douglas Katzman78b37b02015-11-17 20:28:07 +00008148 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008149 CmdArgs.push_back("-e");
8150 CmdArgs.push_back("__start");
8151 }
8152
8153 if (Args.hasArg(options::OPT_static)) {
8154 CmdArgs.push_back("-Bstatic");
8155 } else {
8156 if (Args.hasArg(options::OPT_rdynamic))
8157 CmdArgs.push_back("-export-dynamic");
8158 CmdArgs.push_back("--eh-frame-hdr");
8159 CmdArgs.push_back("-Bdynamic");
8160 if (Args.hasArg(options::OPT_shared)) {
8161 CmdArgs.push_back("-shared");
8162 } else {
8163 CmdArgs.push_back("-dynamic-linker");
8164 CmdArgs.push_back("/usr/libexec/ld.so");
8165 }
8166 }
8167
8168 if (Output.isFilename()) {
8169 CmdArgs.push_back("-o");
8170 CmdArgs.push_back(Output.getFilename());
8171 } else {
8172 assert(Output.isNothing() && "Invalid output.");
8173 }
8174
Douglas Katzman78b37b02015-11-17 20:28:07 +00008175 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008176 if (!Args.hasArg(options::OPT_shared)) {
8177 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008178 CmdArgs.push_back(
8179 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008180 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008181 CmdArgs.push_back(
8182 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8183 CmdArgs.push_back(
8184 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008185 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008186 CmdArgs.push_back(
8187 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008188 }
8189 }
8190
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008191 Args.AddAllArgs(CmdArgs,
8192 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008193
8194 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8195
Douglas Katzman78b37b02015-11-17 20:28:07 +00008196 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008197 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008198 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8199 if (Args.hasArg(options::OPT_pg))
8200 CmdArgs.push_back("-lm_p");
8201 else
8202 CmdArgs.push_back("-lm");
8203 }
8204
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008205 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008206 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008207 CmdArgs.push_back("-lpthread_p");
8208 else
8209 CmdArgs.push_back("-lpthread");
8210 }
8211
Eli Friedman9fa28852012-08-08 23:57:20 +00008212 if (!Args.hasArg(options::OPT_shared)) {
8213 if (Args.hasArg(options::OPT_pg))
8214 CmdArgs.push_back("-lc_p");
8215 else
8216 CmdArgs.push_back("-lc");
8217 }
8218
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008219 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008220 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008221 case llvm::Triple::arm:
8222 MyArch = "arm";
8223 break;
8224 case llvm::Triple::x86:
8225 MyArch = "i386";
8226 break;
8227 case llvm::Triple::x86_64:
8228 MyArch = "amd64";
8229 break;
8230 default:
8231 llvm_unreachable("Unsupported architecture");
8232 }
8233 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008234 }
8235
Douglas Katzman78b37b02015-11-17 20:28:07 +00008236 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008237 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008238 CmdArgs.push_back(
8239 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008240 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008241 CmdArgs.push_back(
8242 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008243 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008244
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008245 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008246 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008247}
8248
Douglas Katzman95354292015-06-23 20:42:09 +00008249void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8250 const InputInfo &Output,
8251 const InputInfoList &Inputs,
8252 const ArgList &Args,
8253 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008254 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008255 ArgStringList CmdArgs;
8256
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008257 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8258 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008259 switch (getToolChain().getArch()) {
8260 default:
8261 break;
8262 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008263 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008264 break;
8265 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008266 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008267 break;
8268 case llvm::Triple::mips:
8269 case llvm::Triple::mipsel:
8270 case llvm::Triple::mips64:
8271 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008272 StringRef CPUName;
8273 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008274 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008275
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008276 CmdArgs.push_back("-march");
8277 CmdArgs.push_back(CPUName.data());
8278
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008279 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008280 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008281
8282 if (getToolChain().getArch() == llvm::Triple::mips ||
8283 getToolChain().getArch() == llvm::Triple::mips64)
8284 CmdArgs.push_back("-EB");
8285 else
8286 CmdArgs.push_back("-EL");
8287
Dimitry Andric46f338c2015-12-27 10:36:44 +00008288 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8289 StringRef v = A->getValue();
8290 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8291 A->claim();
8292 }
8293
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008294 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008295 break;
8296 }
8297 case llvm::Triple::arm:
8298 case llvm::Triple::armeb:
8299 case llvm::Triple::thumb:
8300 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008301 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008302
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008303 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008304 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008305 else
Renato Golinf4421f72014-02-19 10:44:07 +00008306 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008307
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008308 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008309 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008310 case llvm::Triple::GNUEABI:
8311 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008312 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008313 break;
8314
8315 default:
8316 CmdArgs.push_back("-matpcs");
8317 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008318 break;
8319 }
8320 case llvm::Triple::sparc:
8321 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008322 case llvm::Triple::sparcv9: {
8323 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8324 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008325 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008326 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008327 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008328 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008329
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008330 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008331
8332 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008333 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008334
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008335 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008336 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008337
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008338 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008339 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008340}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008341
Douglas Katzman95354292015-06-23 20:42:09 +00008342void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8343 const InputInfo &Output,
8344 const InputInfoList &Inputs,
8345 const ArgList &Args,
8346 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008347 const toolchains::FreeBSD &ToolChain =
8348 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008349 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008350 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008351 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008352 !Args.hasArg(options::OPT_shared) &&
8353 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008354 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008355
8356 // Silence warning for "clang -g foo.o -o foo"
8357 Args.ClaimAllArgs(options::OPT_g_Group);
8358 // and "clang -emit-llvm foo.o -o foo"
8359 Args.ClaimAllArgs(options::OPT_emit_llvm);
8360 // and for "clang -w foo.o -o foo". Other warning options are already
8361 // handled somewhere else.
8362 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008363
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008364 if (!D.SysRoot.empty())
8365 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8366
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008367 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008368 CmdArgs.push_back("-pie");
8369
Ed Maste1bc232d2016-04-12 21:11:46 +00008370 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008371 if (Args.hasArg(options::OPT_static)) {
8372 CmdArgs.push_back("-Bstatic");
8373 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008374 if (Args.hasArg(options::OPT_rdynamic))
8375 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008376 if (Args.hasArg(options::OPT_shared)) {
8377 CmdArgs.push_back("-Bshareable");
8378 } else {
8379 CmdArgs.push_back("-dynamic-linker");
8380 CmdArgs.push_back("/libexec/ld-elf.so.1");
8381 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008382 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008383 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8384 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8385 CmdArgs.push_back("--hash-style=both");
8386 }
8387 }
8388 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008389 }
8390
8391 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8392 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008393 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008394 CmdArgs.push_back("-m");
8395 CmdArgs.push_back("elf_i386_fbsd");
8396 }
8397
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008398 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008399 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008400 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008401 }
8402
Dimitry Andric904895f2015-12-27 06:47:09 +00008403 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8404 if (ToolChain.getArch() == llvm::Triple::mips ||
8405 ToolChain.getArch() == llvm::Triple::mipsel ||
8406 ToolChain.getArch() == llvm::Triple::mips64 ||
8407 ToolChain.getArch() == llvm::Triple::mips64el) {
8408 StringRef v = A->getValue();
8409 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8410 A->claim();
8411 }
8412 }
8413
Daniel Dunbarb440f562010-08-02 02:38:21 +00008414 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008415 CmdArgs.push_back("-o");
8416 CmdArgs.push_back(Output.getFilename());
8417 } else {
8418 assert(Output.isNothing() && "Invalid output.");
8419 }
8420
Douglas Katzman78b37b02015-11-17 20:28:07 +00008421 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008422 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008423 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008424 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008425 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008426 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008427 crt1 = "Scrt1.o";
8428 else
8429 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008430 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008431 if (crt1)
8432 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8433
8434 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8435
Craig Topper92fc2df2014-05-17 16:56:41 +00008436 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008437 if (Args.hasArg(options::OPT_static))
8438 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008439 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008440 crtbegin = "crtbeginS.o";
8441 else
8442 crtbegin = "crtbegin.o";
8443
8444 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008445 }
8446
8447 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008448 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008449 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8450 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008451 Args.AddAllArgs(CmdArgs, options::OPT_s);
8452 Args.AddAllArgs(CmdArgs, options::OPT_t);
8453 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8454 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008455
Teresa Johnson945bc502015-10-15 20:35:53 +00008456 if (D.isUsingLTO())
8457 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008458
Alexey Samsonov52550342014-09-15 19:58:40 +00008459 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008460 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008461
Douglas Katzman78b37b02015-11-17 20:28:07 +00008462 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008463 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008464 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008465 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008466 if (Args.hasArg(options::OPT_pg))
8467 CmdArgs.push_back("-lm_p");
8468 else
8469 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008470 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008471 if (NeedsSanitizerDeps)
8472 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008473 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8474 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008475 if (Args.hasArg(options::OPT_pg))
8476 CmdArgs.push_back("-lgcc_p");
8477 else
8478 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008479 if (Args.hasArg(options::OPT_static)) {
8480 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008481 } else if (Args.hasArg(options::OPT_pg)) {
8482 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008483 } else {
8484 CmdArgs.push_back("--as-needed");
8485 CmdArgs.push_back("-lgcc_s");
8486 CmdArgs.push_back("--no-as-needed");
8487 }
8488
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008489 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008490 if (Args.hasArg(options::OPT_pg))
8491 CmdArgs.push_back("-lpthread_p");
8492 else
8493 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008494 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008495
Roman Divacky66f22762011-02-10 16:59:40 +00008496 if (Args.hasArg(options::OPT_pg)) {
8497 if (Args.hasArg(options::OPT_shared))
8498 CmdArgs.push_back("-lc");
8499 else
8500 CmdArgs.push_back("-lc_p");
8501 CmdArgs.push_back("-lgcc_p");
8502 } else {
8503 CmdArgs.push_back("-lc");
8504 CmdArgs.push_back("-lgcc");
8505 }
8506
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008507 if (Args.hasArg(options::OPT_static)) {
8508 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008509 } else if (Args.hasArg(options::OPT_pg)) {
8510 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008511 } else {
8512 CmdArgs.push_back("--as-needed");
8513 CmdArgs.push_back("-lgcc_s");
8514 CmdArgs.push_back("--no-as-needed");
8515 }
8516 }
8517
Douglas Katzman78b37b02015-11-17 20:28:07 +00008518 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008519 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008520 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008521 else
8522 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008523 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008524 }
8525
Xinliang David Li69306c02015-10-22 06:15:31 +00008526 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008527
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008528 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008529 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008530}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008531
Douglas Katzman95354292015-06-23 20:42:09 +00008532void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008533 const InputInfo &Output,
8534 const InputInfoList &Inputs,
8535 const ArgList &Args,
8536 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008537 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008538 ArgStringList CmdArgs;
8539
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008540 // GNU as needs different flags for creating the correct output format
8541 // on architectures with different ABIs or optional feature sets.
8542 switch (getToolChain().getArch()) {
8543 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008544 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008545 break;
8546 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008547 case llvm::Triple::armeb:
8548 case llvm::Triple::thumb:
8549 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008550 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008551 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8552 std::string Arch =
8553 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008554 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008555 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008556 }
8557
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008558 case llvm::Triple::mips:
8559 case llvm::Triple::mipsel:
8560 case llvm::Triple::mips64:
8561 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008562 StringRef CPUName;
8563 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008564 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008565
8566 CmdArgs.push_back("-march");
8567 CmdArgs.push_back(CPUName.data());
8568
8569 CmdArgs.push_back("-mabi");
8570 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8571
8572 if (getToolChain().getArch() == llvm::Triple::mips ||
8573 getToolChain().getArch() == llvm::Triple::mips64)
8574 CmdArgs.push_back("-EB");
8575 else
8576 CmdArgs.push_back("-EL");
8577
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008578 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008579 break;
8580 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008581
8582 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008583 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008584 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008585 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8586 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008587 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008588 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008589 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008590
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008591 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008592 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008593 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8594 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008595 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008596 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008597 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008598
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008599 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008600 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008601 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008602
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008603 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008604
8605 CmdArgs.push_back("-o");
8606 CmdArgs.push_back(Output.getFilename());
8607
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008608 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008609 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008610
David Chisnallddbd68f2011-09-27 22:03:18 +00008611 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008612 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008613}
8614
Douglas Katzman95354292015-06-23 20:42:09 +00008615void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8616 const InputInfo &Output,
8617 const InputInfoList &Inputs,
8618 const ArgList &Args,
8619 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008620 const Driver &D = getToolChain().getDriver();
8621 ArgStringList CmdArgs;
8622
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008623 if (!D.SysRoot.empty())
8624 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8625
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008626 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008627 if (Args.hasArg(options::OPT_static)) {
8628 CmdArgs.push_back("-Bstatic");
8629 } else {
8630 if (Args.hasArg(options::OPT_rdynamic))
8631 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008632 if (Args.hasArg(options::OPT_shared)) {
8633 CmdArgs.push_back("-Bshareable");
8634 } else {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008635 Args.AddAllArgs(CmdArgs, options::OPT_pie);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008636 CmdArgs.push_back("-dynamic-linker");
8637 CmdArgs.push_back("/libexec/ld.elf_so");
8638 }
8639 }
8640
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008641 // Many NetBSD architectures support more than one ABI.
8642 // Determine the correct emulation for ld.
8643 switch (getToolChain().getArch()) {
8644 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008645 CmdArgs.push_back("-m");
8646 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008647 break;
8648 case llvm::Triple::arm:
8649 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008650 CmdArgs.push_back("-m");
8651 switch (getToolChain().getTriple().getEnvironment()) {
8652 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008653 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008654 CmdArgs.push_back("armelf_nbsd_eabi");
8655 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008656 case llvm::Triple::EABIHF:
8657 case llvm::Triple::GNUEABIHF:
8658 CmdArgs.push_back("armelf_nbsd_eabihf");
8659 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008660 default:
8661 CmdArgs.push_back("armelf_nbsd");
8662 break;
8663 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008664 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008665 case llvm::Triple::armeb:
8666 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008667 arm::appendEBLinkFlags(
8668 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008669 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008670 CmdArgs.push_back("-m");
8671 switch (getToolChain().getTriple().getEnvironment()) {
8672 case llvm::Triple::EABI:
8673 case llvm::Triple::GNUEABI:
8674 CmdArgs.push_back("armelfb_nbsd_eabi");
8675 break;
8676 case llvm::Triple::EABIHF:
8677 case llvm::Triple::GNUEABIHF:
8678 CmdArgs.push_back("armelfb_nbsd_eabihf");
8679 break;
8680 default:
8681 CmdArgs.push_back("armelfb_nbsd");
8682 break;
8683 }
8684 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008685 case llvm::Triple::mips64:
8686 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008687 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008688 CmdArgs.push_back("-m");
8689 if (getToolChain().getArch() == llvm::Triple::mips64)
8690 CmdArgs.push_back("elf32btsmip");
8691 else
8692 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008693 } else if (mips::hasMipsAbiArg(Args, "64")) {
8694 CmdArgs.push_back("-m");
8695 if (getToolChain().getArch() == llvm::Triple::mips64)
8696 CmdArgs.push_back("elf64btsmip");
8697 else
8698 CmdArgs.push_back("elf64ltsmip");
8699 }
8700 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008701 case llvm::Triple::ppc:
8702 CmdArgs.push_back("-m");
8703 CmdArgs.push_back("elf32ppc_nbsd");
8704 break;
8705
8706 case llvm::Triple::ppc64:
8707 case llvm::Triple::ppc64le:
8708 CmdArgs.push_back("-m");
8709 CmdArgs.push_back("elf64ppc");
8710 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008711
8712 case llvm::Triple::sparc:
8713 CmdArgs.push_back("-m");
8714 CmdArgs.push_back("elf32_sparc");
8715 break;
8716
8717 case llvm::Triple::sparcv9:
8718 CmdArgs.push_back("-m");
8719 CmdArgs.push_back("elf64_sparc");
8720 break;
8721
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008722 default:
8723 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008724 }
8725
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008726 if (Output.isFilename()) {
8727 CmdArgs.push_back("-o");
8728 CmdArgs.push_back(Output.getFilename());
8729 } else {
8730 assert(Output.isNothing() && "Invalid output.");
8731 }
8732
Douglas Katzman78b37b02015-11-17 20:28:07 +00008733 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008734 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008735 CmdArgs.push_back(
8736 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008737 }
8738 CmdArgs.push_back(
8739 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8740 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008741 CmdArgs.push_back(
8742 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008743 } else {
8744 CmdArgs.push_back(
8745 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008746 }
8747 }
8748
8749 Args.AddAllArgs(CmdArgs, options::OPT_L);
8750 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8751 Args.AddAllArgs(CmdArgs, options::OPT_e);
8752 Args.AddAllArgs(CmdArgs, options::OPT_s);
8753 Args.AddAllArgs(CmdArgs, options::OPT_t);
8754 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8755 Args.AddAllArgs(CmdArgs, options::OPT_r);
8756
8757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8758
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008759 unsigned Major, Minor, Micro;
8760 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8761 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008762 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008763 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008764 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008765 case llvm::Triple::arm:
8766 case llvm::Triple::armeb:
8767 case llvm::Triple::thumb:
8768 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008769 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008770 case llvm::Triple::ppc64:
8771 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008772 case llvm::Triple::sparc:
8773 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008774 case llvm::Triple::x86:
8775 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008776 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008777 break;
8778 default:
8779 break;
8780 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008781 }
8782
Douglas Katzman78b37b02015-11-17 20:28:07 +00008783 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008784 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008785 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008786 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8787 CmdArgs.push_back("-lm");
8788 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008789 if (Args.hasArg(options::OPT_pthread))
8790 CmdArgs.push_back("-lpthread");
8791 CmdArgs.push_back("-lc");
8792
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008793 if (useLibgcc) {
8794 if (Args.hasArg(options::OPT_static)) {
8795 // libgcc_eh depends on libc, so resolve as much as possible,
8796 // pull in any new requirements from libc and then get the rest
8797 // of libgcc.
8798 CmdArgs.push_back("-lgcc_eh");
8799 CmdArgs.push_back("-lc");
8800 CmdArgs.push_back("-lgcc");
8801 } else {
8802 CmdArgs.push_back("-lgcc");
8803 CmdArgs.push_back("--as-needed");
8804 CmdArgs.push_back("-lgcc_s");
8805 CmdArgs.push_back("--no-as-needed");
8806 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008807 }
8808 }
8809
Douglas Katzman78b37b02015-11-17 20:28:07 +00008810 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008811 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008812 CmdArgs.push_back(
8813 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008814 else
8815 CmdArgs.push_back(
8816 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008817 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008818 }
8819
Xinliang David Li69306c02015-10-22 06:15:31 +00008820 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008821
Logan Chieneb9162f2014-06-26 14:23:45 +00008822 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008823 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008824}
8825
Douglas Katzman95354292015-06-23 20:42:09 +00008826void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8827 const InputInfo &Output,
8828 const InputInfoList &Inputs,
8829 const ArgList &Args,
8830 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008831 claimNoWarnArgs(Args);
8832
James Y Knight2db38f32015-08-15 03:45:25 +00008833 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8834 llvm::Triple Triple = llvm::Triple(TripleStr);
8835
Rafael Espindola92b00932010-08-10 00:25:48 +00008836 ArgStringList CmdArgs;
8837
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008838 llvm::Reloc::Model RelocationModel;
8839 unsigned PICLevel;
8840 bool IsPIE;
8841 std::tie(RelocationModel, PICLevel, IsPIE) =
8842 ParsePICArgs(getToolChain(), Triple, Args);
8843
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008844 switch (getToolChain().getArch()) {
8845 default:
8846 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008847 // Add --32/--64 to make sure we get the format we want.
8848 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008849 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008850 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008851 break;
8852 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008853 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8854 CmdArgs.push_back("--x32");
8855 else
8856 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008857 break;
8858 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008859 CmdArgs.push_back("-a32");
8860 CmdArgs.push_back("-mppc");
8861 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008862 break;
8863 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008864 CmdArgs.push_back("-a64");
8865 CmdArgs.push_back("-mppc64");
8866 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008867 break;
8868 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008869 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008870 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008871 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008872 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008873 break;
8874 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008875 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008876 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008877 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8878 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8879 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008880 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008881 }
8882 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008883 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008884 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8885 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8886 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008887 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008888 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008889 case llvm::Triple::arm:
8890 case llvm::Triple::armeb:
8891 case llvm::Triple::thumb:
8892 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008893 const llvm::Triple &Triple2 = getToolChain().getTriple();
8894 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008895 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008896 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008897 break;
8898 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008899 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008900 break;
8901 default:
8902 break;
8903 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008904
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008905 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008906 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8907 case arm::FloatABI::Soft:
8908 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8909 break;
8910 case arm::FloatABI::SoftFP:
8911 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8912 break;
8913 case arm::FloatABI::Hard:
8914 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8915 break;
8916 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008917
8918 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008919
8920 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008921 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008922 // march from being picked in the absence of a cpu flag.
8923 Arg *A;
8924 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008925 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008926 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008927 else
8928 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008929 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008930 break;
8931 }
8932 case llvm::Triple::mips:
8933 case llvm::Triple::mipsel:
8934 case llvm::Triple::mips64:
8935 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008936 StringRef CPUName;
8937 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008938 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008939 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008940
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008941 CmdArgs.push_back("-march");
8942 CmdArgs.push_back(CPUName.data());
8943
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008944 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008945 CmdArgs.push_back(ABIName.data());
8946
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008947 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8948 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008949 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008950 CmdArgs.push_back("-mno-shared");
8951
Daniel Sanders379d44b2014-07-16 11:52:23 +00008952 // LLVM doesn't support -mplt yet and acts as if it is always given.
8953 // However, -mplt has no effect with the N64 ABI.
8954 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008955
8956 if (getToolChain().getArch() == llvm::Triple::mips ||
8957 getToolChain().getArch() == llvm::Triple::mips64)
8958 CmdArgs.push_back("-EB");
8959 else
8960 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008961
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008962 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8963 if (StringRef(A->getValue()) == "2008")
8964 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8965 }
8966
Daniel Sanders379d44b2014-07-16 11:52:23 +00008967 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8968 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8969 options::OPT_mfp64)) {
8970 A->claim();
8971 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008972 } else if (mips::shouldUseFPXX(
8973 Args, getToolChain().getTriple(), CPUName, ABIName,
8974 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008975 CmdArgs.push_back("-mfpxx");
8976
8977 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8978 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008979 if (Arg *A =
8980 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008981 if (A->getOption().matches(options::OPT_mips16)) {
8982 A->claim();
8983 A->render(Args, CmdArgs);
8984 } else {
8985 A->claim();
8986 CmdArgs.push_back("-no-mips16");
8987 }
8988 }
8989
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008990 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8991 options::OPT_mno_micromips);
8992 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8993 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8994
Simon Atanasyanbd986632013-11-26 11:58:04 +00008995 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8996 // Do not use AddLastArg because not all versions of MIPS assembler
8997 // support -mmsa / -mno-msa options.
8998 if (A->getOption().matches(options::OPT_mmsa))
8999 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
9000 }
9001
Daniel Sanders379d44b2014-07-16 11:52:23 +00009002 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
9003 options::OPT_msoft_float);
9004
Toma Tabacub36d6102015-06-11 12:13:18 +00009005 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
9006 options::OPT_msingle_float);
9007
Daniel Sanders379d44b2014-07-16 11:52:23 +00009008 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
9009 options::OPT_mno_odd_spreg);
9010
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009011 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009012 break;
9013 }
9014 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009015 // Always pass an -march option, since our default of z10 is later
9016 // than the GNU assembler's default.
9017 StringRef CPUName = getSystemZTargetCPU(Args);
9018 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009019 break;
9020 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009021 }
9022
Renato Golina74bbc72015-07-22 15:32:36 +00009023 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009024 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00009025
9026 CmdArgs.push_back("-o");
9027 CmdArgs.push_back(Output.getFilename());
9028
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009029 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00009030 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00009031
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009032 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009033 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00009034
9035 // Handle the debug info splitting at object creation time if we're
9036 // creating an object.
9037 // TODO: Currently only works on linux with newer objcopy.
9038 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00009039 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00009040 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00009041 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00009042}
9043
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00009044static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009045 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009046 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00009047 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00009048 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
9049 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00009050 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009051 CmdArgs.push_back("-lgcc");
9052
Logan Chien3d3373c2012-11-19 12:04:11 +00009053 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009054 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009055 CmdArgs.push_back("-lgcc");
9056 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00009057 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009058 CmdArgs.push_back("--as-needed");
9059 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00009060 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009061 CmdArgs.push_back("--no-as-needed");
9062 }
9063
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009064 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00009065 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00009066 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009067 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00009068
9069 // According to Android ABI, we have to link with libdl if we are
9070 // linking with non-static libgcc.
9071 //
9072 // NOTE: This fixes a link error on Android MIPS as well. The non-static
9073 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
9074 if (isAndroid && !StaticLibgcc)
9075 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00009076}
9077
Renato Golinc4b49242014-02-13 10:01:16 +00009078static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009079 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009080 // Make use of compiler-rt if --rtlib option is used
9081 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9082
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009083 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009084 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009085 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009086 default:
9087 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009088 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009089 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009090 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009091 break;
9092 }
Renato Golinc4b49242014-02-13 10:01:16 +00009093 break;
9094 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009095 // Make sure libgcc is not used under MSVC environment by default
9096 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9097 // Issue error diagnostic if libgcc is explicitly specified
9098 // through command line as --rtlib option argument.
9099 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9100 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9101 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9102 }
9103 } else
9104 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009105 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009106 }
9107}
9108
Rafael Espindola1e085772014-08-15 17:14:35 +00009109static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9110 switch (T.getArch()) {
9111 case llvm::Triple::x86:
9112 return "elf_i386";
9113 case llvm::Triple::aarch64:
9114 return "aarch64linux";
9115 case llvm::Triple::aarch64_be:
9116 return "aarch64_be_linux";
9117 case llvm::Triple::arm:
9118 case llvm::Triple::thumb:
9119 return "armelf_linux_eabi";
9120 case llvm::Triple::armeb:
9121 case llvm::Triple::thumbeb:
9122 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9123 case llvm::Triple::ppc:
9124 return "elf32ppclinux";
9125 case llvm::Triple::ppc64:
9126 return "elf64ppc";
9127 case llvm::Triple::ppc64le:
9128 return "elf64lppc";
9129 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009130 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009131 return "elf32_sparc";
9132 case llvm::Triple::sparcv9:
9133 return "elf64_sparc";
9134 case llvm::Triple::mips:
9135 return "elf32btsmip";
9136 case llvm::Triple::mipsel:
9137 return "elf32ltsmip";
9138 case llvm::Triple::mips64:
9139 if (mips::hasMipsAbiArg(Args, "n32"))
9140 return "elf32btsmipn32";
9141 return "elf64btsmip";
9142 case llvm::Triple::mips64el:
9143 if (mips::hasMipsAbiArg(Args, "n32"))
9144 return "elf32ltsmipn32";
9145 return "elf64ltsmip";
9146 case llvm::Triple::systemz:
9147 return "elf64_s390";
9148 case llvm::Triple::x86_64:
9149 if (T.getEnvironment() == llvm::Triple::GNUX32)
9150 return "elf32_x86_64";
9151 return "elf_x86_64";
9152 default:
9153 llvm_unreachable("Unexpected arch");
9154 }
9155}
9156
Douglas Katzman95354292015-06-23 20:42:09 +00009157void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9158 const InputInfo &Output,
9159 const InputInfoList &Inputs,
9160 const ArgList &Args,
9161 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009162 const toolchains::Linux &ToolChain =
9163 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009164 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009165
9166 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9167 llvm::Triple Triple = llvm::Triple(TripleStr);
9168
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009169 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009170 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009171 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009172 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9173 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009174 const bool HasCRTBeginEndFiles =
9175 ToolChain.getTriple().hasEnvironment() ||
9176 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009177
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009178 ArgStringList CmdArgs;
9179
Rafael Espindolad1002f62010-11-15 18:28:16 +00009180 // Silence warning for "clang -g foo.o -o foo"
9181 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009182 // and "clang -emit-llvm foo.o -o foo"
9183 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009184 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009185 // handled somewhere else.
9186 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009187
Peter Collingbourne39719a72015-11-20 20:49:39 +00009188 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9189 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009190 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009191 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009192 CmdArgs.push_back("-target");
9193 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9194 }
9195
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009196 if (!D.SysRoot.empty())
9197 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009198
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009199 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009200 CmdArgs.push_back("-pie");
9201
Rafael Espindola1c76c592010-11-07 22:57:16 +00009202 if (Args.hasArg(options::OPT_rdynamic))
9203 CmdArgs.push_back("-export-dynamic");
9204
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009205 if (Args.hasArg(options::OPT_s))
9206 CmdArgs.push_back("-s");
9207
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009208 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009209 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009210
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009211 for (const auto &Opt : ToolChain.ExtraOpts)
9212 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009213
9214 if (!Args.hasArg(options::OPT_static)) {
9215 CmdArgs.push_back("--eh-frame-hdr");
9216 }
9217
9218 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009219 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009220
9221 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009222 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9223 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009224 CmdArgs.push_back("-Bstatic");
9225 else
9226 CmdArgs.push_back("-static");
9227 } else if (Args.hasArg(options::OPT_shared)) {
9228 CmdArgs.push_back("-shared");
9229 }
9230
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009231 if (!Args.hasArg(options::OPT_static)) {
9232 if (Args.hasArg(options::OPT_rdynamic))
9233 CmdArgs.push_back("-export-dynamic");
9234
9235 if (!Args.hasArg(options::OPT_shared)) {
9236 const std::string Loader =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00009237 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009238 CmdArgs.push_back("-dynamic-linker");
9239 CmdArgs.push_back(Args.MakeArgString(Loader));
9240 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009241 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009242
9243 CmdArgs.push_back("-o");
9244 CmdArgs.push_back(Output.getFilename());
9245
Douglas Katzman78b37b02015-11-17 20:28:07 +00009246 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009247 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009248 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009249 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009250 if (Args.hasArg(options::OPT_pg))
9251 crt1 = "gcrt1.o";
9252 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009253 crt1 = "Scrt1.o";
9254 else
9255 crt1 = "crt1.o";
9256 }
9257 if (crt1)
9258 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009259
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009260 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9261 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009262
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009263 const char *crtbegin;
9264 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009265 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009266 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009267 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009268 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009269 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009270 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009271 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009272
9273 if (HasCRTBeginEndFiles)
9274 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009275
9276 // Add crtfastmath.o if available and fast math is enabled.
9277 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009278 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009279
9280 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009281 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009282
Douglas Katzman6059ef92015-11-17 17:41:23 +00009283 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009284
Teresa Johnson945bc502015-10-15 20:35:53 +00009285 if (D.isUsingLTO())
9286 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009287
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009288 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9289 CmdArgs.push_back("--no-demangle");
9290
Alexey Samsonov52550342014-09-15 19:58:40 +00009291 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009292 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009293 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009294 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009295
Douglas Katzman78b37b02015-11-17 20:28:07 +00009296 if (D.CCCIsCXX() &&
9297 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009298 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009299 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009300 if (OnlyLibstdcxxStatic)
9301 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009302 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009303 if (OnlyLibstdcxxStatic)
9304 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009305 CmdArgs.push_back("-lm");
9306 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009307 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9308 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009309
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009310 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009311 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9312 if (Args.hasArg(options::OPT_static))
9313 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009314
Alexey Samsonov52550342014-09-15 19:58:40 +00009315 if (NeedsSanitizerDeps)
9316 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9317
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009318 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9319 Args.hasArg(options::OPT_pthreads);
9320
9321 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9322 options::OPT_fno_openmp, false)) {
9323 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9324 // FIXME: Does this really make sense for all GNU toolchains?
9325 WantPthread = true;
9326
9327 // Also link the particular OpenMP runtimes.
9328 switch (getOpenMPRuntime(ToolChain, Args)) {
9329 case OMPRT_OMP:
9330 CmdArgs.push_back("-lomp");
9331 break;
9332 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009333 CmdArgs.push_back("-lgomp");
9334
9335 // FIXME: Exclude this for platforms with libgomp that don't require
9336 // librt. Most modern Linux platforms require it, but some may not.
9337 CmdArgs.push_back("-lrt");
9338 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009339 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009340 CmdArgs.push_back("-liomp5");
9341 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009342 case OMPRT_Unknown:
9343 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009344 break;
9345 }
Chandler Carruth01538002013-01-17 13:19:29 +00009346 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009347
Renato Golinc4b49242014-02-13 10:01:16 +00009348 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009349
Richard Smith31d1de22015-05-20 22:48:44 +00009350 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009351 CmdArgs.push_back("-lpthread");
9352
Rafael Espindolab17bc532016-01-25 18:29:16 +00009353 if (Args.hasArg(options::OPT_fsplit_stack))
9354 CmdArgs.push_back("--wrap=pthread_create");
9355
Chandler Carruth94a32012012-05-14 18:31:18 +00009356 CmdArgs.push_back("-lc");
9357
9358 if (Args.hasArg(options::OPT_static))
9359 CmdArgs.push_back("--end-group");
9360 else
Renato Golinc4b49242014-02-13 10:01:16 +00009361 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009362 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009363
Rafael Espindola81937ec2010-12-01 01:52:43 +00009364 if (!Args.hasArg(options::OPT_nostartfiles)) {
9365 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009366 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009367 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009368 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009369 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009370 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009371 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009372
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009373 if (HasCRTBeginEndFiles)
9374 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009375 if (!isAndroid)
9376 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009377 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009378 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009379
Peter Collingbourne39719a72015-11-20 20:49:39 +00009380 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009381}
9382
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009383// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9384// for the various SFI requirements like register masking. The assembly tool
9385// inserts the file containing the macros as an input into all the assembly
9386// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009387void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9388 const InputInfo &Output,
9389 const InputInfoList &Inputs,
9390 const ArgList &Args,
9391 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009392 const toolchains::NaClToolChain &ToolChain =
9393 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009394 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009395 "nacl-arm-macros.s");
9396 InputInfoList NewInputs;
9397 NewInputs.push_back(NaClMacros);
9398 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009399 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9400 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009401}
9402
Douglas Katzman750cfc52015-06-29 18:42:16 +00009403// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009404// we use static by default, do not yet support sanitizers or LTO, and a few
9405// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009406// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009407void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9408 const InputInfo &Output,
9409 const InputInfoList &Inputs,
9410 const ArgList &Args,
9411 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009412
Douglas Katzman54366072015-07-27 16:53:08 +00009413 const toolchains::NaClToolChain &ToolChain =
9414 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009415 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009416 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009417 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009418 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009419
9420 ArgStringList CmdArgs;
9421
9422 // Silence warning for "clang -g foo.o -o foo"
9423 Args.ClaimAllArgs(options::OPT_g_Group);
9424 // and "clang -emit-llvm foo.o -o foo"
9425 Args.ClaimAllArgs(options::OPT_emit_llvm);
9426 // and for "clang -w foo.o -o foo". Other warning options are already
9427 // handled somewhere else.
9428 Args.ClaimAllArgs(options::OPT_w);
9429
9430 if (!D.SysRoot.empty())
9431 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9432
9433 if (Args.hasArg(options::OPT_rdynamic))
9434 CmdArgs.push_back("-export-dynamic");
9435
9436 if (Args.hasArg(options::OPT_s))
9437 CmdArgs.push_back("-s");
9438
Douglas Katzman54366072015-07-27 16:53:08 +00009439 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9440 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009441 CmdArgs.push_back("--build-id");
9442
9443 if (!IsStatic)
9444 CmdArgs.push_back("--eh-frame-hdr");
9445
9446 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009447 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009448 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009449 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009450 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009451 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009452 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009453 else if (Arch == llvm::Triple::mipsel)
9454 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009455 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009456 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9457 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009458
9459 if (IsStatic)
9460 CmdArgs.push_back("-static");
9461 else if (Args.hasArg(options::OPT_shared))
9462 CmdArgs.push_back("-shared");
9463
9464 CmdArgs.push_back("-o");
9465 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009466 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009467 if (!Args.hasArg(options::OPT_shared))
9468 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9469 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9470
9471 const char *crtbegin;
9472 if (IsStatic)
9473 crtbegin = "crtbeginT.o";
9474 else if (Args.hasArg(options::OPT_shared))
9475 crtbegin = "crtbeginS.o";
9476 else
9477 crtbegin = "crtbegin.o";
9478 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9479 }
9480
9481 Args.AddAllArgs(CmdArgs, options::OPT_L);
9482 Args.AddAllArgs(CmdArgs, options::OPT_u);
9483
Douglas Katzman6059ef92015-11-17 17:41:23 +00009484 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009485
9486 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9487 CmdArgs.push_back("--no-demangle");
9488
9489 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9490
Douglas Katzman78b37b02015-11-17 20:28:07 +00009491 if (D.CCCIsCXX() &&
9492 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009493 bool OnlyLibstdcxxStatic =
9494 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009495 if (OnlyLibstdcxxStatic)
9496 CmdArgs.push_back("-Bstatic");
9497 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9498 if (OnlyLibstdcxxStatic)
9499 CmdArgs.push_back("-Bdynamic");
9500 CmdArgs.push_back("-lm");
9501 }
9502
9503 if (!Args.hasArg(options::OPT_nostdlib)) {
9504 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9505 // Always use groups, since it has no effect on dynamic libraries.
9506 CmdArgs.push_back("--start-group");
9507 CmdArgs.push_back("-lc");
9508 // NaCl's libc++ currently requires libpthread, so just always include it
9509 // in the group for C++.
9510 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009511 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009512 // Gold, used by Mips, handles nested groups differently than ld, and
9513 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9514 // which is not a desired behaviour here.
9515 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9516 if (getToolChain().getArch() == llvm::Triple::mipsel)
9517 CmdArgs.push_back("-lnacl");
9518
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009519 CmdArgs.push_back("-lpthread");
9520 }
9521
9522 CmdArgs.push_back("-lgcc");
9523 CmdArgs.push_back("--as-needed");
9524 if (IsStatic)
9525 CmdArgs.push_back("-lgcc_eh");
9526 else
9527 CmdArgs.push_back("-lgcc_s");
9528 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009529
9530 // Mips needs to create and use pnacl_legacy library that contains
9531 // definitions from bitcode/pnaclmm.c and definitions for
9532 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9533 if (getToolChain().getArch() == llvm::Triple::mipsel)
9534 CmdArgs.push_back("-lpnacl_legacy");
9535
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009536 CmdArgs.push_back("--end-group");
9537 }
9538
9539 if (!Args.hasArg(options::OPT_nostartfiles)) {
9540 const char *crtend;
9541 if (Args.hasArg(options::OPT_shared))
9542 crtend = "crtendS.o";
9543 else
9544 crtend = "crtend.o";
9545
9546 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9547 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9548 }
9549 }
9550
Peter Collingbourne39719a72015-11-20 20:49:39 +00009551 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9552 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009553}
9554
Douglas Katzman95354292015-06-23 20:42:09 +00009555void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9556 const InputInfo &Output,
9557 const InputInfoList &Inputs,
9558 const ArgList &Args,
9559 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009560 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009561 ArgStringList CmdArgs;
9562
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009563 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009564
9565 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009566 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009567
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009568 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009569 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009570
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009571 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009572 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009573}
9574
Douglas Katzman95354292015-06-23 20:42:09 +00009575void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9576 const InputInfo &Output,
9577 const InputInfoList &Inputs,
9578 const ArgList &Args,
9579 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009580 const Driver &D = getToolChain().getDriver();
9581 ArgStringList CmdArgs;
9582
Daniel Dunbarb440f562010-08-02 02:38:21 +00009583 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009584 CmdArgs.push_back("-o");
9585 CmdArgs.push_back(Output.getFilename());
9586 } else {
9587 assert(Output.isNothing() && "Invalid output.");
9588 }
9589
Douglas Katzman78b37b02015-11-17 20:28:07 +00009590 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009591 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9592 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9593 CmdArgs.push_back(
9594 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9595 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009596 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009597
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009598 Args.AddAllArgs(CmdArgs,
9599 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009600
Daniel Dunbar54423b22010-09-17 00:24:54 +00009601 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009602
Xinliang David Li69306c02015-10-22 06:15:31 +00009603 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009604
Douglas Katzman78b37b02015-11-17 20:28:07 +00009605 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009606 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009607 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009608 CmdArgs.push_back("-lm");
9609 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009610 }
9611
Douglas Katzman78b37b02015-11-17 20:28:07 +00009612 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009613 if (Args.hasArg(options::OPT_pthread))
9614 CmdArgs.push_back("-lpthread");
9615 CmdArgs.push_back("-lc");
9616 CmdArgs.push_back("-lCompilerRT-Generic");
9617 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9618 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009619 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009620 }
9621
Logan Chieneb9162f2014-06-26 14:23:45 +00009622 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009623 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009624}
9625
Daniel Dunbarcc912342009-05-02 18:28:39 +00009626/// DragonFly Tools
9627
9628// For now, DragonFly Assemble does just about the same as for
9629// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009630void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9631 const InputInfo &Output,
9632 const InputInfoList &Inputs,
9633 const ArgList &Args,
9634 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009635 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009636 ArgStringList CmdArgs;
9637
9638 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9639 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009640 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009641 CmdArgs.push_back("--32");
9642
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009643 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009644
9645 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009646 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009647
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009648 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009649 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009650
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009651 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009652 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009653}
9654
Douglas Katzman95354292015-06-23 20:42:09 +00009655void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9656 const InputInfo &Output,
9657 const InputInfoList &Inputs,
9658 const ArgList &Args,
9659 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009660 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009661 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009662
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009663 if (!D.SysRoot.empty())
9664 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9665
John McCall65b8da02013-04-11 22:55:55 +00009666 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009667 if (Args.hasArg(options::OPT_static)) {
9668 CmdArgs.push_back("-Bstatic");
9669 } else {
John McCall65b8da02013-04-11 22:55:55 +00009670 if (Args.hasArg(options::OPT_rdynamic))
9671 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009672 if (Args.hasArg(options::OPT_shared))
9673 CmdArgs.push_back("-Bshareable");
9674 else {
9675 CmdArgs.push_back("-dynamic-linker");
9676 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9677 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009678 CmdArgs.push_back("--hash-style=gnu");
9679 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009680 }
9681
9682 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9683 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009684 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009685 CmdArgs.push_back("-m");
9686 CmdArgs.push_back("elf_i386");
9687 }
9688
Daniel Dunbarb440f562010-08-02 02:38:21 +00009689 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009690 CmdArgs.push_back("-o");
9691 CmdArgs.push_back(Output.getFilename());
9692 } else {
9693 assert(Output.isNothing() && "Invalid output.");
9694 }
9695
Douglas Katzman78b37b02015-11-17 20:28:07 +00009696 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009697 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009698 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009699 CmdArgs.push_back(
9700 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009701 else {
9702 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009703 CmdArgs.push_back(
9704 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009705 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009706 CmdArgs.push_back(
9707 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009708 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009709 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009710 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009711 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009712 CmdArgs.push_back(
9713 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009714 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009715 CmdArgs.push_back(
9716 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009717 }
9718
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009719 Args.AddAllArgs(CmdArgs,
9720 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009721
Daniel Dunbar54423b22010-09-17 00:24:54 +00009722 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009723
Douglas Katzman78b37b02015-11-17 20:28:07 +00009724 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009725 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009726
9727 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009728 CmdArgs.push_back("-rpath");
9729 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009730 }
9731
Hans Wennborg70850d82013-07-18 20:29:38 +00009732 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009733 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009734 CmdArgs.push_back("-lm");
9735 }
9736
Daniel Dunbarcc912342009-05-02 18:28:39 +00009737 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009738 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009739
9740 if (!Args.hasArg(options::OPT_nolibc)) {
9741 CmdArgs.push_back("-lc");
9742 }
9743
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009744 if (Args.hasArg(options::OPT_static) ||
9745 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009746 CmdArgs.push_back("-lgcc");
9747 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009748 } else {
9749 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009750 CmdArgs.push_back("-lgcc_pic");
9751 if (!Args.hasArg(options::OPT_shared))
9752 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009753 } else {
John McCall65b8da02013-04-11 22:55:55 +00009754 CmdArgs.push_back("-lgcc");
9755 CmdArgs.push_back("--as-needed");
9756 CmdArgs.push_back("-lgcc_pic");
9757 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009758 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009759 }
9760 }
9761
Douglas Katzman78b37b02015-11-17 20:28:07 +00009762 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009763 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009764 CmdArgs.push_back(
9765 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009766 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009767 CmdArgs.push_back(
9768 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9769 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009770 }
9771
Xinliang David Li69306c02015-10-22 06:15:31 +00009772 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009773
Logan Chieneb9162f2014-06-26 14:23:45 +00009774 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009775 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009776}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009777
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009778// Try to find Exe from a Visual Studio distribution. This first tries to find
9779// an installed copy of Visual Studio and, failing that, looks in the PATH,
9780// making sure that whatever executable that's found is not a same-named exe
9781// from clang itself to prevent clang from falling back to itself.
9782static std::string FindVisualStudioExecutable(const ToolChain &TC,
9783 const char *Exe,
9784 const char *ClangProgramPath) {
9785 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9786 std::string visualStudioBinDir;
9787 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9788 visualStudioBinDir)) {
9789 SmallString<128> FilePath(visualStudioBinDir);
9790 llvm::sys::path::append(FilePath, Exe);
9791 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9792 return FilePath.str();
9793 }
9794
9795 return Exe;
9796}
9797
Douglas Katzman95354292015-06-23 20:42:09 +00009798void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9799 const InputInfo &Output,
9800 const InputInfoList &Inputs,
9801 const ArgList &Args,
9802 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009803 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009804 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009805
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009806 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9807 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009808 CmdArgs.push_back(
9809 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009810
Douglas Katzman78b37b02015-11-17 20:28:07 +00009811 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9812 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009813 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009814
Zachary Turner10d75b22014-10-22 20:40:43 +00009815 if (!llvm::sys::Process::GetEnv("LIB")) {
9816 // If the VC environment hasn't been configured (perhaps because the user
9817 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009818 // the environment variable is set however, assume the user knows what
9819 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009820 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009821 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009822 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9823 SmallString<128> LibDir(VisualStudioDir);
9824 llvm::sys::path::append(LibDir, "VC", "lib");
9825 switch (MSVC.getArch()) {
9826 case llvm::Triple::x86:
9827 // x86 just puts the libraries directly in lib
9828 break;
9829 case llvm::Triple::x86_64:
9830 llvm::sys::path::append(LibDir, "amd64");
9831 break;
9832 case llvm::Triple::arm:
9833 llvm::sys::path::append(LibDir, "arm");
9834 break;
9835 default:
9836 break;
9837 }
9838 CmdArgs.push_back(
9839 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009840
9841 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9842 std::string UniversalCRTLibPath;
9843 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9844 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9845 UniversalCRTLibPath.c_str()));
9846 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009847 }
9848
9849 std::string WindowsSdkLibPath;
9850 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9851 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9852 WindowsSdkLibPath.c_str()));
9853 }
9854
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009855 CmdArgs.push_back("-nologo");
9856
Reid Kleckner124955a2015-08-05 18:51:13 +00009857 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009858 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009860 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009861 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009862 if (DLL) {
9863 CmdArgs.push_back(Args.MakeArgString("-dll"));
9864
9865 SmallString<128> ImplibName(Output.getFilename());
9866 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009867 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009868 }
9869
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009870 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009871 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009872 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009873 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009874 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9875 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009876 // Make sure the dynamic runtime thunk is not optimized out at link time
9877 // to ensure proper SEH handling.
9878 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009879 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009880 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009881 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009882 for (const auto &Lib : {"asan", "asan_cxx"})
9883 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009884 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009885 }
9886
Hans Wennborg2e274592013-08-13 23:38:57 +00009887 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009888
Alexey Bataevc7e84352015-08-19 04:49:01 +00009889 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9890 options::OPT_fno_openmp, false)) {
9891 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9892 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9893 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9894 TC.getDriver().Dir + "/../lib"));
9895 switch (getOpenMPRuntime(getToolChain(), Args)) {
9896 case OMPRT_OMP:
9897 CmdArgs.push_back("-defaultlib:libomp.lib");
9898 break;
9899 case OMPRT_IOMP5:
9900 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9901 break;
9902 case OMPRT_GOMP:
9903 break;
9904 case OMPRT_Unknown:
9905 // Already diagnosed.
9906 break;
9907 }
9908 }
9909
Andrey Turetskiya4868572016-03-14 11:19:43 +00009910 // Add compiler-rt lib in case if it was explicitly
9911 // specified as an argument for --rtlib option.
9912 if (!Args.hasArg(options::OPT_nostdlib)) {
9913 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9914 }
9915
Reid Kleckner337188f2014-09-16 19:22:00 +00009916 // Add filenames, libraries, and other linker inputs.
9917 for (const auto &Input : Inputs) {
9918 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009919 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009920 continue;
9921 }
9922
9923 const Arg &A = Input.getInputArg();
9924
9925 // Render -l options differently for the MSVC linker.
9926 if (A.getOption().matches(options::OPT_l)) {
9927 StringRef Lib = A.getValue();
9928 const char *LinkLibArg;
9929 if (Lib.endswith(".lib"))
9930 LinkLibArg = Args.MakeArgString(Lib);
9931 else
9932 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9933 CmdArgs.push_back(LinkLibArg);
9934 continue;
9935 }
9936
9937 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9938 // or -L. Render it, even if MSVC doesn't understand it.
9939 A.renderAsInput(Args, CmdArgs);
9940 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009941
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009942 TC.addProfileRTLibs(Args, CmdArgs);
9943
Zachary Turner719f58c2014-12-01 23:06:47 +00009944 // We need to special case some linker paths. In the case of lld, we need to
9945 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9946 // linker, we need to use a special search algorithm.
9947 llvm::SmallString<128> linkPath;
9948 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9949 if (Linker.equals_lower("lld"))
9950 Linker = "lld-link";
9951
9952 if (Linker.equals_lower("link")) {
9953 // If we're using the MSVC linker, it's not sufficient to just use link
9954 // from the program PATH, because other environments like GnuWin32 install
9955 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009956 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009957 C.getDriver().getClangProgramPath());
9958 } else {
9959 linkPath = Linker;
9960 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009961 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009962 }
9963
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009964 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009965 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009966}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009967
Douglas Katzman95354292015-06-23 20:42:09 +00009968void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9969 const InputInfo &Output,
9970 const InputInfoList &Inputs,
9971 const ArgList &Args,
9972 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009973 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9974}
9975
Douglas Katzman95354292015-06-23 20:42:09 +00009976std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009977 Compilation &C, const JobAction &JA, const InputInfo &Output,
9978 const InputInfoList &Inputs, const ArgList &Args,
9979 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009980 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009981 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009982 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009983 CmdArgs.push_back("/W0"); // No warnings.
9984
9985 // The goal is to be able to invoke this tool correctly based on
9986 // any flag accepted by clang-cl.
9987
9988 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009989 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009990
9991 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009992 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9993 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9994 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009995 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9996 if (A->getOption().getID() == options::OPT_O0) {
9997 CmdArgs.push_back("/Od");
9998 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009999 CmdArgs.push_back("/Og");
10000
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010001 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +000010002 if (OptLevel == "s" || OptLevel == "z")
10003 CmdArgs.push_back("/Os");
10004 else
10005 CmdArgs.push_back("/Ot");
10006
10007 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010008 }
10009 }
David Majnemer015ce0f2015-07-27 07:32:11 +000010010 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
10011 options::OPT_fno_omit_frame_pointer))
10012 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
10013 ? "/Oy"
10014 : "/Oy-");
10015 if (!Args.hasArg(options::OPT_fwritable_strings))
10016 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010017
Nico Weber3f8dafb2015-03-12 19:37:10 +000010018 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +000010019 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
10020
David Majnemerf6072342014-07-01 22:24:56 +000010021 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
10022 /*default=*/false))
10023 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +000010024 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
10025 options::OPT_fno_function_sections))
10026 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
10027 ? "/Gy"
10028 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +000010029 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
10030 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +000010031 CmdArgs.push_back(
10032 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010033 if (Args.hasArg(options::OPT_fsyntax_only))
10034 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +000010035 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
10036 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +000010037 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010038
Nico Weber3f8dafb2015-03-12 19:37:10 +000010039 std::vector<std::string> Includes =
10040 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010041 for (const auto &Include : Includes)
10042 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +000010043
Hans Wennborg87cfa712013-09-19 20:32:16 +000010044 // Flags that can simply be passed through.
10045 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
10046 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +000010047 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
10048 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +000010049 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +000010050 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010051
10052 // The order of these flags is relevant, so pick the last one.
10053 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
10054 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
10055 A->render(Args, CmdArgs);
10056
Ehsan Akhgarid8518332016-01-25 21:14:52 +000010057 // Pass through all unknown arguments so that the fallback command can see
10058 // them too.
10059 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10060
Hans Wennborg87cfa712013-09-19 20:32:16 +000010061 // Input filename.
10062 assert(Inputs.size() == 1);
10063 const InputInfo &II = Inputs[0];
10064 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10065 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10066 if (II.isFilename())
10067 CmdArgs.push_back(II.getFilename());
10068 else
10069 II.getInputArg().renderAsInput(Args, CmdArgs);
10070
10071 // Output filename.
10072 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010073 const char *Fo =
10074 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010075 CmdArgs.push_back(Fo);
10076
Hans Wennborg188382e2013-09-20 18:16:35 +000010077 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010078 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10079 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010080 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010081 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010082}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010083
Yaron Keren1c0070c2015-07-02 04:45:27 +000010084/// MinGW Tools
10085void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10086 const InputInfo &Output,
10087 const InputInfoList &Inputs,
10088 const ArgList &Args,
10089 const char *LinkingOutput) const {
10090 claimNoWarnArgs(Args);
10091 ArgStringList CmdArgs;
10092
10093 if (getToolChain().getArch() == llvm::Triple::x86) {
10094 CmdArgs.push_back("--32");
10095 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10096 CmdArgs.push_back("--64");
10097 }
10098
10099 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10100
10101 CmdArgs.push_back("-o");
10102 CmdArgs.push_back(Output.getFilename());
10103
10104 for (const auto &II : Inputs)
10105 CmdArgs.push_back(II.getFilename());
10106
10107 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010108 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010109
10110 if (Args.hasArg(options::OPT_gsplit_dwarf))
10111 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10112 SplitDebugName(Args, Inputs[0]));
10113}
10114
10115void MinGW::Linker::AddLibGCC(const ArgList &Args,
10116 ArgStringList &CmdArgs) const {
10117 if (Args.hasArg(options::OPT_mthreads))
10118 CmdArgs.push_back("-lmingwthrd");
10119 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010120
Yaron Kerenaa281332015-08-09 00:24:07 +000010121 // Make use of compiler-rt if --rtlib option is used
10122 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10123 if (RLT == ToolChain::RLT_Libgcc) {
10124 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10125 Args.hasArg(options::OPT_static);
10126 bool Shared = Args.hasArg(options::OPT_shared);
10127 bool CXX = getToolChain().getDriver().CCCIsCXX();
10128
10129 if (Static || (!CXX && !Shared)) {
10130 CmdArgs.push_back("-lgcc");
10131 CmdArgs.push_back("-lgcc_eh");
10132 } else {
10133 CmdArgs.push_back("-lgcc_s");
10134 CmdArgs.push_back("-lgcc");
10135 }
10136 } else {
10137 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10138 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010139
Yaron Keren1c0070c2015-07-02 04:45:27 +000010140 CmdArgs.push_back("-lmoldname");
10141 CmdArgs.push_back("-lmingwex");
10142 CmdArgs.push_back("-lmsvcrt");
10143}
10144
10145void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10146 const InputInfo &Output,
10147 const InputInfoList &Inputs,
10148 const ArgList &Args,
10149 const char *LinkingOutput) const {
10150 const ToolChain &TC = getToolChain();
10151 const Driver &D = TC.getDriver();
10152 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10153
10154 ArgStringList CmdArgs;
10155
10156 // Silence warning for "clang -g foo.o -o foo"
10157 Args.ClaimAllArgs(options::OPT_g_Group);
10158 // and "clang -emit-llvm foo.o -o foo"
10159 Args.ClaimAllArgs(options::OPT_emit_llvm);
10160 // and for "clang -w foo.o -o foo". Other warning options are already
10161 // handled somewhere else.
10162 Args.ClaimAllArgs(options::OPT_w);
10163
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010164 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10165 if (LinkerName.equals_lower("lld")) {
10166 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010167 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010168 } else if (!LinkerName.equals_lower("ld")) {
10169 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010170 }
10171
Yaron Keren1c0070c2015-07-02 04:45:27 +000010172 if (!D.SysRoot.empty())
10173 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10174
10175 if (Args.hasArg(options::OPT_s))
10176 CmdArgs.push_back("-s");
10177
10178 CmdArgs.push_back("-m");
10179 if (TC.getArch() == llvm::Triple::x86)
10180 CmdArgs.push_back("i386pe");
10181 if (TC.getArch() == llvm::Triple::x86_64)
10182 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010183 if (TC.getArch() == llvm::Triple::arm)
10184 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010185
10186 if (Args.hasArg(options::OPT_mwindows)) {
10187 CmdArgs.push_back("--subsystem");
10188 CmdArgs.push_back("windows");
10189 } else if (Args.hasArg(options::OPT_mconsole)) {
10190 CmdArgs.push_back("--subsystem");
10191 CmdArgs.push_back("console");
10192 }
10193
10194 if (Args.hasArg(options::OPT_static))
10195 CmdArgs.push_back("-Bstatic");
10196 else {
10197 if (Args.hasArg(options::OPT_mdll))
10198 CmdArgs.push_back("--dll");
10199 else if (Args.hasArg(options::OPT_shared))
10200 CmdArgs.push_back("--shared");
10201 CmdArgs.push_back("-Bdynamic");
10202 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10203 CmdArgs.push_back("-e");
10204 if (TC.getArch() == llvm::Triple::x86)
10205 CmdArgs.push_back("_DllMainCRTStartup@12");
10206 else
10207 CmdArgs.push_back("DllMainCRTStartup");
10208 CmdArgs.push_back("--enable-auto-image-base");
10209 }
10210 }
10211
10212 CmdArgs.push_back("-o");
10213 CmdArgs.push_back(Output.getFilename());
10214
10215 Args.AddAllArgs(CmdArgs, options::OPT_e);
10216 // FIXME: add -N, -n flags
10217 Args.AddLastArg(CmdArgs, options::OPT_r);
10218 Args.AddLastArg(CmdArgs, options::OPT_s);
10219 Args.AddLastArg(CmdArgs, options::OPT_t);
10220 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10221 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10222
Douglas Katzman78b37b02015-11-17 20:28:07 +000010223 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010224 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10225 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10226 } else {
10227 if (Args.hasArg(options::OPT_municode))
10228 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10229 else
10230 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10231 }
10232 if (Args.hasArg(options::OPT_pg))
10233 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10234 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10235 }
10236
10237 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010238 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010239 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10240
10241 // TODO: Add ASan stuff here
10242
10243 // TODO: Add profile stuff here
10244
Douglas Katzman78b37b02015-11-17 20:28:07 +000010245 if (D.CCCIsCXX() &&
10246 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010247 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10248 !Args.hasArg(options::OPT_static);
10249 if (OnlyLibstdcxxStatic)
10250 CmdArgs.push_back("-Bstatic");
10251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10252 if (OnlyLibstdcxxStatic)
10253 CmdArgs.push_back("-Bdynamic");
10254 }
10255
10256 if (!Args.hasArg(options::OPT_nostdlib)) {
10257 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10258 if (Args.hasArg(options::OPT_static))
10259 CmdArgs.push_back("--start-group");
10260
10261 if (Args.hasArg(options::OPT_fstack_protector) ||
10262 Args.hasArg(options::OPT_fstack_protector_strong) ||
10263 Args.hasArg(options::OPT_fstack_protector_all)) {
10264 CmdArgs.push_back("-lssp_nonshared");
10265 CmdArgs.push_back("-lssp");
10266 }
10267 if (Args.hasArg(options::OPT_fopenmp))
10268 CmdArgs.push_back("-lgomp");
10269
10270 AddLibGCC(Args, CmdArgs);
10271
10272 if (Args.hasArg(options::OPT_pg))
10273 CmdArgs.push_back("-lgmon");
10274
Yaron Kerenadce68e2015-07-06 18:52:19 +000010275 if (Args.hasArg(options::OPT_pthread))
10276 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010277
10278 // add system libraries
10279 if (Args.hasArg(options::OPT_mwindows)) {
10280 CmdArgs.push_back("-lgdi32");
10281 CmdArgs.push_back("-lcomdlg32");
10282 }
10283 CmdArgs.push_back("-ladvapi32");
10284 CmdArgs.push_back("-lshell32");
10285 CmdArgs.push_back("-luser32");
10286 CmdArgs.push_back("-lkernel32");
10287
10288 if (Args.hasArg(options::OPT_static))
10289 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010290 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010291 AddLibGCC(Args, CmdArgs);
10292 }
10293
10294 if (!Args.hasArg(options::OPT_nostartfiles)) {
10295 // Add crtfastmath.o if available and fast math is enabled.
10296 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10297
10298 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10299 }
10300 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010301 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010302 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010303}
10304
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010305/// XCore Tools
10306// We pass assemble and link construction to the xcc tool.
10307
Douglas Katzman95354292015-06-23 20:42:09 +000010308void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10309 const InputInfo &Output,
10310 const InputInfoList &Inputs,
10311 const ArgList &Args,
10312 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010313 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010314 ArgStringList CmdArgs;
10315
10316 CmdArgs.push_back("-o");
10317 CmdArgs.push_back(Output.getFilename());
10318
10319 CmdArgs.push_back("-c");
10320
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010321 if (Args.hasArg(options::OPT_v))
10322 CmdArgs.push_back("-v");
10323
Robert Lytton894d25c2014-05-02 09:33:25 +000010324 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10325 if (!A->getOption().matches(options::OPT_g0))
10326 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010327
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010328 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10329 false))
10330 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010331
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010332 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010333
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010334 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010335 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010336
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010337 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010338 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010339}
10340
Douglas Katzman95354292015-06-23 20:42:09 +000010341void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10342 const InputInfo &Output,
10343 const InputInfoList &Inputs,
10344 const ArgList &Args,
10345 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010346 ArgStringList CmdArgs;
10347
10348 if (Output.isFilename()) {
10349 CmdArgs.push_back("-o");
10350 CmdArgs.push_back(Output.getFilename());
10351 } else {
10352 assert(Output.isNothing() && "Invalid output.");
10353 }
10354
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010355 if (Args.hasArg(options::OPT_v))
10356 CmdArgs.push_back("-v");
10357
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010358 // Pass -fexceptions through to the linker if it was present.
10359 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10360 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010361 CmdArgs.push_back("-fexceptions");
10362
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010363 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10364
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010365 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010366 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010367}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010368
Douglas Katzman95354292015-06-23 20:42:09 +000010369void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10370 const InputInfo &Output,
10371 const InputInfoList &Inputs,
10372 const ArgList &Args,
10373 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010374 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010375 const auto &TC =
10376 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10377 ArgStringList CmdArgs;
10378 const char *Exec;
10379
10380 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010381 default:
10382 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010383 case llvm::Triple::arm:
10384 case llvm::Triple::thumb:
10385 break;
10386 case llvm::Triple::x86:
10387 CmdArgs.push_back("--32");
10388 break;
10389 case llvm::Triple::x86_64:
10390 CmdArgs.push_back("--64");
10391 break;
10392 }
10393
10394 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10395
10396 CmdArgs.push_back("-o");
10397 CmdArgs.push_back(Output.getFilename());
10398
10399 for (const auto &Input : Inputs)
10400 CmdArgs.push_back(Input.getFilename());
10401
10402 const std::string Assembler = TC.GetProgramPath("as");
10403 Exec = Args.MakeArgString(Assembler);
10404
Justin Bognerd3371d82015-07-17 03:35:54 +000010405 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010406}
10407
Douglas Katzman95354292015-06-23 20:42:09 +000010408void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10409 const InputInfo &Output,
10410 const InputInfoList &Inputs,
10411 const ArgList &Args,
10412 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010413 const auto &TC =
10414 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10415 const llvm::Triple &T = TC.getTriple();
10416 const Driver &D = TC.getDriver();
10417 SmallString<128> EntryPoint;
10418 ArgStringList CmdArgs;
10419 const char *Exec;
10420
10421 // Silence warning for "clang -g foo.o -o foo"
10422 Args.ClaimAllArgs(options::OPT_g_Group);
10423 // and "clang -emit-llvm foo.o -o foo"
10424 Args.ClaimAllArgs(options::OPT_emit_llvm);
10425 // and for "clang -w foo.o -o foo"
10426 Args.ClaimAllArgs(options::OPT_w);
10427 // Other warning options are already handled somewhere else.
10428
10429 if (!D.SysRoot.empty())
10430 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10431
10432 if (Args.hasArg(options::OPT_pie))
10433 CmdArgs.push_back("-pie");
10434 if (Args.hasArg(options::OPT_rdynamic))
10435 CmdArgs.push_back("-export-dynamic");
10436 if (Args.hasArg(options::OPT_s))
10437 CmdArgs.push_back("--strip-all");
10438
10439 CmdArgs.push_back("-m");
10440 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010441 default:
10442 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010443 case llvm::Triple::arm:
10444 case llvm::Triple::thumb:
10445 // FIXME: this is incorrect for WinCE
10446 CmdArgs.push_back("thumb2pe");
10447 break;
10448 case llvm::Triple::x86:
10449 CmdArgs.push_back("i386pe");
10450 EntryPoint.append("_");
10451 break;
10452 case llvm::Triple::x86_64:
10453 CmdArgs.push_back("i386pep");
10454 break;
10455 }
10456
10457 if (Args.hasArg(options::OPT_shared)) {
10458 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010459 default:
10460 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010461 case llvm::Triple::arm:
10462 case llvm::Triple::thumb:
10463 case llvm::Triple::x86_64:
10464 EntryPoint.append("_DllMainCRTStartup");
10465 break;
10466 case llvm::Triple::x86:
10467 EntryPoint.append("_DllMainCRTStartup@12");
10468 break;
10469 }
10470
10471 CmdArgs.push_back("-shared");
10472 CmdArgs.push_back("-Bdynamic");
10473
10474 CmdArgs.push_back("--enable-auto-image-base");
10475
10476 CmdArgs.push_back("--entry");
10477 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10478 } else {
10479 EntryPoint.append("mainCRTStartup");
10480
10481 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10482 : "-Bdynamic");
10483
Douglas Katzman78b37b02015-11-17 20:28:07 +000010484 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010485 CmdArgs.push_back("--entry");
10486 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10487 }
10488
10489 // FIXME: handle subsystem
10490 }
10491
10492 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010493 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010494
10495 CmdArgs.push_back("-o");
10496 CmdArgs.push_back(Output.getFilename());
10497
10498 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10499 SmallString<261> ImpLib(Output.getFilename());
10500 llvm::sys::path::replace_extension(ImpLib, ".lib");
10501
10502 CmdArgs.push_back("--out-implib");
10503 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10504 }
10505
Douglas Katzman78b37b02015-11-17 20:28:07 +000010506 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010507 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10508 const char *CRTBegin;
10509
10510 CRTBegin =
10511 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10512 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10513 }
10514
10515 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010516 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010517 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10518
10519 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10520 !Args.hasArg(options::OPT_nodefaultlibs)) {
10521 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10522 !Args.hasArg(options::OPT_static);
10523 if (StaticCXX)
10524 CmdArgs.push_back("-Bstatic");
10525 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10526 if (StaticCXX)
10527 CmdArgs.push_back("-Bdynamic");
10528 }
10529
10530 if (!Args.hasArg(options::OPT_nostdlib)) {
10531 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10532 // TODO handle /MT[d] /MD[d]
10533 CmdArgs.push_back("-lmsvcrt");
10534 AddRunTimeLibs(TC, D, CmdArgs, Args);
10535 }
10536 }
10537
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010538 if (TC.getSanitizerArgs().needsAsanRt()) {
10539 // TODO handle /MT[d] /MD[d]
10540 if (Args.hasArg(options::OPT_shared)) {
10541 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10542 } else {
10543 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10544 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Marcin Koscielnicki10721432016-05-12 10:27:59 +000010545 // Make sure the dynamic runtime thunk is not optimized out at link time
10546 // to ensure proper SEH handling.
10547 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10548 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10549 ? "___asan_seh_interceptor"
10550 : "__asan_seh_interceptor"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010551 }
10552 }
10553
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010554 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010555
Justin Bognerd3371d82015-07-17 03:35:54 +000010556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010557}
Douglas Katzman84a75642015-06-19 14:55:19 +000010558
Douglas Katzman95354292015-06-23 20:42:09 +000010559void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10560 const InputInfo &Output,
10561 const InputInfoList &Inputs,
10562 const ArgList &Args,
10563 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010564 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010565 assert(Inputs.size() == 1);
10566 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010567 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10568 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010569
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010570 if (JA.getKind() == Action::PreprocessJobClass) {
10571 Args.ClaimAllArgs();
10572 CmdArgs.push_back("-E");
10573 } else {
10574 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10575 CmdArgs.push_back("-S");
10576 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10577 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010578 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010579
Douglas Katzmanf6071112015-08-03 14:34:22 +000010580 // Append all -I, -iquote, -isystem paths, defines/undefines,
10581 // 'f' flags, optimize flags, and warning options.
10582 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010583 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010584 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010585 options::OPT_f_Group, options::OPT_f_clang_Group,
10586 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010587 options::OPT_O_Group, options::OPT_W_Group,
10588 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010589
10590 // If we're producing a dependency file, and assembly is the final action,
10591 // then the name of the target in the dependency file should be the '.o'
10592 // file, not the '.s' file produced by this step. For example, instead of
10593 // /tmp/mumble.s: mumble.c .../someheader.h
10594 // the filename on the lefthand side should be "mumble.o"
10595 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10596 C.getActions().size() == 1 &&
10597 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10598 Arg *A = Args.getLastArg(options::OPT_o);
10599 if (A) {
10600 CmdArgs.push_back("-MT");
10601 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10602 }
10603 }
10604
Douglas Katzman84a75642015-06-19 14:55:19 +000010605 CmdArgs.push_back(II.getFilename());
10606 CmdArgs.push_back("-o");
10607 CmdArgs.push_back(Output.getFilename());
10608
10609 std::string Exec =
10610 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010611 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10612 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010613}
10614
Douglas Katzman95354292015-06-23 20:42:09 +000010615void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10616 const InputInfo &Output,
10617 const InputInfoList &Inputs,
10618 const ArgList &Args,
10619 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010620 ArgStringList CmdArgs;
10621
10622 assert(Inputs.size() == 1);
10623 const InputInfo &II = Inputs[0];
10624 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10625 assert(Output.getType() == types::TY_Object);
10626
10627 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010628 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10629 if (CPUArg)
10630 CmdArgs.push_back(
10631 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010632 CmdArgs.push_back("-noSPrefixing");
10633 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010634 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10635 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10636 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010637 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010638 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010639 }
10640 CmdArgs.push_back("-elf"); // Output format.
10641 CmdArgs.push_back(II.getFilename());
10642 CmdArgs.push_back(
10643 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10644
10645 std::string Exec =
10646 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010647 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10648 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010649}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010650
10651void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10652 const InputInfo &Output,
10653 const InputInfoList &Inputs,
10654 const ArgList &Args,
10655 const char *LinkingOutput) const {
10656 const auto &TC =
10657 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10658 const llvm::Triple &T = TC.getTriple();
10659 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010660 bool UseStartfiles =
10661 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010662 bool UseDefaultLibs =
10663 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010664
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010665 if (T.getArch() == llvm::Triple::sparc)
10666 CmdArgs.push_back("-EB");
10667 else // SHAVE assumes little-endian, and sparcel is expressly so.
10668 CmdArgs.push_back("-EL");
10669
10670 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10671 // but we never pass through a --sysroot option and various other bits.
10672 // For example, there are no sanitizers (yet) nor gold linker.
10673
10674 // Eat some arguments that may be present but have no effect.
10675 Args.ClaimAllArgs(options::OPT_g_Group);
10676 Args.ClaimAllArgs(options::OPT_w);
10677 Args.ClaimAllArgs(options::OPT_static_libgcc);
10678
10679 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10680 CmdArgs.push_back("-s");
10681
10682 CmdArgs.push_back("-o");
10683 CmdArgs.push_back(Output.getFilename());
10684
10685 if (UseStartfiles) {
10686 // If you want startfiles, it means you want the builtin crti and crtbegin,
10687 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010688 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10689 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010690 }
10691
10692 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10693 options::OPT_e, options::OPT_s, options::OPT_t,
10694 options::OPT_Z_Flag, options::OPT_r});
10695
Douglas Katzman674a3122015-11-18 16:24:46 +000010696 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010697
10698 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10699
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010700 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010701 if (C.getDriver().CCCIsCXX())
10702 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010703 if (T.getOS() == llvm::Triple::RTEMS) {
10704 CmdArgs.push_back("--start-group");
10705 CmdArgs.push_back("-lc");
10706 // You must provide your own "-L" option to enable finding these.
10707 CmdArgs.push_back("-lrtemscpu");
10708 CmdArgs.push_back("-lrtemsbsp");
10709 CmdArgs.push_back("--end-group");
10710 } else {
10711 CmdArgs.push_back("-lc");
10712 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010713 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010714 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010715 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010716 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10717 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010718 }
10719
10720 std::string Exec =
10721 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10722 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10723 CmdArgs, Inputs));
10724}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010725
10726void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10727 const InputInfo &Output,
10728 const InputInfoList &Inputs,
10729 const ArgList &Args,
10730 const char *LinkingOutput) const {
10731 claimNoWarnArgs(Args);
10732 ArgStringList CmdArgs;
10733
10734 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10735
10736 CmdArgs.push_back("-o");
10737 CmdArgs.push_back(Output.getFilename());
10738
10739 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10740 const InputInfo &Input = Inputs[0];
10741 assert(Input.isFilename() && "Invalid input.");
10742 CmdArgs.push_back(Input.getFilename());
10743
10744 const char *Exec =
Paul Robinson9d613612016-05-16 17:22:25 +000010745 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010746 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10747}
10748
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010749static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10750 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10751 if (SanArgs.needsUbsanRt()) {
10752 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10753 }
10754 if (SanArgs.needsAsanRt()) {
10755 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10756 }
10757}
10758
10759static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10760 const JobAction &JA, const InputInfo &Output,
10761 const InputInfoList &Inputs,
10762 const ArgList &Args,
10763 const char *LinkingOutput) {
10764 const toolchains::FreeBSD &ToolChain =
10765 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10766 const Driver &D = ToolChain.getDriver();
10767 ArgStringList CmdArgs;
10768
10769 // Silence warning for "clang -g foo.o -o foo"
10770 Args.ClaimAllArgs(options::OPT_g_Group);
10771 // and "clang -emit-llvm foo.o -o foo"
10772 Args.ClaimAllArgs(options::OPT_emit_llvm);
10773 // and for "clang -w foo.o -o foo". Other warning options are already
10774 // handled somewhere else.
10775 Args.ClaimAllArgs(options::OPT_w);
10776
10777 if (!D.SysRoot.empty())
10778 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10779
10780 if (Args.hasArg(options::OPT_pie))
10781 CmdArgs.push_back("-pie");
10782
10783 if (Args.hasArg(options::OPT_rdynamic))
10784 CmdArgs.push_back("-export-dynamic");
10785 if (Args.hasArg(options::OPT_shared))
10786 CmdArgs.push_back("--oformat=so");
10787
10788 if (Output.isFilename()) {
10789 CmdArgs.push_back("-o");
10790 CmdArgs.push_back(Output.getFilename());
10791 } else {
10792 assert(Output.isNothing() && "Invalid output.");
10793 }
10794
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010795 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10796
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010797 Args.AddAllArgs(CmdArgs, options::OPT_L);
10798 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10799 Args.AddAllArgs(CmdArgs, options::OPT_e);
10800 Args.AddAllArgs(CmdArgs, options::OPT_s);
10801 Args.AddAllArgs(CmdArgs, options::OPT_t);
10802 Args.AddAllArgs(CmdArgs, options::OPT_r);
10803
10804 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10805 CmdArgs.push_back("--no-demangle");
10806
10807 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10808
10809 if (Args.hasArg(options::OPT_pthread)) {
10810 CmdArgs.push_back("-lpthread");
10811 }
10812
Paul Robinson9d613612016-05-16 17:22:25 +000010813 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010814
10815 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10816}
10817
10818static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10819 const JobAction &JA, const InputInfo &Output,
10820 const InputInfoList &Inputs,
10821 const ArgList &Args,
10822 const char *LinkingOutput) {
10823 const toolchains::FreeBSD &ToolChain =
10824 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10825 const Driver &D = ToolChain.getDriver();
10826 ArgStringList CmdArgs;
10827
10828 // Silence warning for "clang -g foo.o -o foo"
10829 Args.ClaimAllArgs(options::OPT_g_Group);
10830 // and "clang -emit-llvm foo.o -o foo"
10831 Args.ClaimAllArgs(options::OPT_emit_llvm);
10832 // and for "clang -w foo.o -o foo". Other warning options are already
10833 // handled somewhere else.
10834 Args.ClaimAllArgs(options::OPT_w);
10835
10836 if (!D.SysRoot.empty())
10837 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10838
10839 if (Args.hasArg(options::OPT_pie))
10840 CmdArgs.push_back("-pie");
10841
10842 if (Args.hasArg(options::OPT_static)) {
10843 CmdArgs.push_back("-Bstatic");
10844 } else {
10845 if (Args.hasArg(options::OPT_rdynamic))
10846 CmdArgs.push_back("-export-dynamic");
10847 CmdArgs.push_back("--eh-frame-hdr");
10848 if (Args.hasArg(options::OPT_shared)) {
10849 CmdArgs.push_back("-Bshareable");
10850 } else {
10851 CmdArgs.push_back("-dynamic-linker");
10852 CmdArgs.push_back("/libexec/ld-elf.so.1");
10853 }
10854 CmdArgs.push_back("--enable-new-dtags");
10855 }
10856
10857 if (Output.isFilename()) {
10858 CmdArgs.push_back("-o");
10859 CmdArgs.push_back(Output.getFilename());
10860 } else {
10861 assert(Output.isNothing() && "Invalid output.");
10862 }
10863
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010864 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10865
Douglas Katzman78b37b02015-11-17 20:28:07 +000010866 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010867 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010868 if (!Args.hasArg(options::OPT_shared)) {
10869 if (Args.hasArg(options::OPT_pg))
10870 crt1 = "gcrt1.o";
10871 else if (Args.hasArg(options::OPT_pie))
10872 crt1 = "Scrt1.o";
10873 else
10874 crt1 = "crt1.o";
10875 }
10876 if (crt1)
10877 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10878
10879 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10880
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010881 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010882 if (Args.hasArg(options::OPT_static))
10883 crtbegin = "crtbeginT.o";
10884 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10885 crtbegin = "crtbeginS.o";
10886 else
10887 crtbegin = "crtbegin.o";
10888
10889 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10890 }
10891
10892 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010893 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010894 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10895 Args.AddAllArgs(CmdArgs, options::OPT_e);
10896 Args.AddAllArgs(CmdArgs, options::OPT_s);
10897 Args.AddAllArgs(CmdArgs, options::OPT_t);
10898 Args.AddAllArgs(CmdArgs, options::OPT_r);
10899
10900 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10901 CmdArgs.push_back("--no-demangle");
10902
10903 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10904
Douglas Katzman78b37b02015-11-17 20:28:07 +000010905 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010906 // For PS4, we always want to pass libm, libstdc++ and libkernel
10907 // libraries for both C and C++ compilations.
10908 CmdArgs.push_back("-lkernel");
10909 if (D.CCCIsCXX()) {
10910 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10911 if (Args.hasArg(options::OPT_pg))
10912 CmdArgs.push_back("-lm_p");
10913 else
10914 CmdArgs.push_back("-lm");
10915 }
10916 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10917 // the default system libraries. Just mimic this for now.
10918 if (Args.hasArg(options::OPT_pg))
10919 CmdArgs.push_back("-lgcc_p");
10920 else
10921 CmdArgs.push_back("-lcompiler_rt");
10922 if (Args.hasArg(options::OPT_static)) {
10923 CmdArgs.push_back("-lstdc++");
10924 } else if (Args.hasArg(options::OPT_pg)) {
10925 CmdArgs.push_back("-lgcc_eh_p");
10926 } else {
10927 CmdArgs.push_back("--as-needed");
10928 CmdArgs.push_back("-lstdc++");
10929 CmdArgs.push_back("--no-as-needed");
10930 }
10931
10932 if (Args.hasArg(options::OPT_pthread)) {
10933 if (Args.hasArg(options::OPT_pg))
10934 CmdArgs.push_back("-lpthread_p");
10935 else
10936 CmdArgs.push_back("-lpthread");
10937 }
10938
10939 if (Args.hasArg(options::OPT_pg)) {
10940 if (Args.hasArg(options::OPT_shared))
10941 CmdArgs.push_back("-lc");
10942 else {
10943 if (Args.hasArg(options::OPT_static)) {
10944 CmdArgs.push_back("--start-group");
10945 CmdArgs.push_back("-lc_p");
10946 CmdArgs.push_back("-lpthread_p");
10947 CmdArgs.push_back("--end-group");
10948 } else {
10949 CmdArgs.push_back("-lc_p");
10950 }
10951 }
10952 CmdArgs.push_back("-lgcc_p");
10953 } else {
10954 if (Args.hasArg(options::OPT_static)) {
10955 CmdArgs.push_back("--start-group");
10956 CmdArgs.push_back("-lc");
10957 CmdArgs.push_back("-lpthread");
10958 CmdArgs.push_back("--end-group");
10959 } else {
10960 CmdArgs.push_back("-lc");
10961 }
10962 CmdArgs.push_back("-lcompiler_rt");
10963 }
10964
10965 if (Args.hasArg(options::OPT_static)) {
10966 CmdArgs.push_back("-lstdc++");
10967 } else if (Args.hasArg(options::OPT_pg)) {
10968 CmdArgs.push_back("-lgcc_eh_p");
10969 } else {
10970 CmdArgs.push_back("--as-needed");
10971 CmdArgs.push_back("-lstdc++");
10972 CmdArgs.push_back("--no-as-needed");
10973 }
10974 }
10975
Douglas Katzman78b37b02015-11-17 20:28:07 +000010976 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010977 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10978 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10979 else
10980 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10981 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10982 }
10983
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010984 const char *Exec =
10985#ifdef LLVM_ON_WIN32
Paul Robinson9d613612016-05-16 17:22:25 +000010986 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010987#else
Paul Robinson9d613612016-05-16 17:22:25 +000010988 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010989#endif
10990
10991 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10992}
10993
10994void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10995 const InputInfo &Output,
10996 const InputInfoList &Inputs,
10997 const ArgList &Args,
10998 const char *LinkingOutput) const {
10999 const toolchains::FreeBSD &ToolChain =
11000 static_cast<const toolchains::FreeBSD &>(getToolChain());
11001 const Driver &D = ToolChain.getDriver();
11002 bool PS4Linker;
11003 StringRef LinkerOptName;
11004 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
11005 LinkerOptName = A->getValue();
11006 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
11007 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
11008 }
11009
11010 if (LinkerOptName == "gold")
11011 PS4Linker = false;
11012 else if (LinkerOptName == "ps4")
11013 PS4Linker = true;
11014 else
11015 PS4Linker = !Args.hasArg(options::OPT_shared);
11016
11017 if (PS4Linker)
11018 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11019 else
11020 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11021}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011022
11023void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
11024 const InputInfo &Output,
11025 const InputInfoList &Inputs,
11026 const ArgList &Args,
11027 const char *LinkingOutput) const {
11028 const auto &TC =
11029 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011030 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011031
11032 std::vector<std::string> gpu_archs =
11033 Args.getAllArgValues(options::OPT_march_EQ);
11034 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
11035 const std::string& gpu_arch = gpu_archs[0];
11036
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011037 ArgStringList CmdArgs;
11038 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000011039 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
11040 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000011041 // ptxas does not accept -g option if optimization is enabled, so
11042 // we ignore the compiler's -O* options if we want debug info.
11043 CmdArgs.push_back("-g");
11044 CmdArgs.push_back("--dont-merge-basicblocks");
11045 CmdArgs.push_back("--return-at-end");
11046 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
11047 // Map the -O we received to -O{0,1,2,3}.
11048 //
11049 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
11050 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011051
Justin Lebar2836dcd2016-01-19 19:52:21 +000011052 // -O3 seems like the least-bad option when -Osomething is specified to
11053 // clang but it isn't handled below.
11054 StringRef OOpt = "3";
11055 if (A->getOption().matches(options::OPT_O4) ||
11056 A->getOption().matches(options::OPT_Ofast))
11057 OOpt = "3";
11058 else if (A->getOption().matches(options::OPT_O0))
11059 OOpt = "0";
11060 else if (A->getOption().matches(options::OPT_O)) {
11061 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11062 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11063 .Case("1", "1")
11064 .Case("2", "2")
11065 .Case("3", "3")
11066 .Case("s", "2")
11067 .Case("z", "2")
11068 .Default("2");
11069 }
11070 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11071 } else {
11072 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11073 // to no optimizations, but ptxas's default is -O3.
11074 CmdArgs.push_back("-O0");
11075 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011076
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011077 CmdArgs.push_back("--gpu-name");
11078 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11079 CmdArgs.push_back("--output-file");
11080 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11081 for (const auto& II : Inputs)
11082 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11083
11084 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11085 CmdArgs.push_back(Args.MakeArgString(A));
11086
11087 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11088 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11089}
11090
11091// All inputs to this linker must be from CudaDeviceActions, as we need to look
11092// at the Inputs' Actions in order to figure out which GPU architecture they
11093// correspond to.
11094void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11095 const InputInfo &Output,
11096 const InputInfoList &Inputs,
11097 const ArgList &Args,
11098 const char *LinkingOutput) const {
11099 const auto &TC =
11100 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011101 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011102
11103 ArgStringList CmdArgs;
11104 CmdArgs.push_back("--cuda");
11105 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11106 CmdArgs.push_back(Args.MakeArgString("--create"));
11107 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11108
11109 for (const auto& II : Inputs) {
11110 auto* A = cast<const CudaDeviceAction>(II.getAction());
11111 // We need to pass an Arch of the form "sm_XX" for cubin files and
11112 // "compute_XX" for ptx.
11113 const char *Arch = (II.getType() == types::TY_PP_Asm)
11114 ? A->getComputeArchName()
11115 : A->getGpuArchName();
11116 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11117 Arch + ",file=" + II.getFilename()));
11118 }
11119
11120 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11121 CmdArgs.push_back(Args.MakeArgString(A));
11122
11123 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11124 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11125}